記憶力が無い

プログラミングと室内園芸と何か

AppsScript の JDBC サービスは MySQL 8.0 に対応してないっぽい

AppsScript で Cloud SQL に接続しようとしてハマった話。

AppsScript + Cloud SQL

Cloud SQL は GCP のリレーショナルデータベースのサービスですが、AppsScript でも JDBC サービス経由で利用することが出来ます。

Cloud SQL以外でもIPのアクセス元の許可設定を行えば Jdbc.getConnection(url) から利用可能ですが、Cloud SQL の場合その設定が不要な Jdbc.getCloudSqlConnection(url) が利用出来ます。

しかし、MySQL 8.0 だと接続がうまくいかない...

function hoge() {
  const user = 'root';
  const password = 'xxxxx';
  const instanceUrl = 'jdbc:google:mysql://zzzzz';
  const conn = Jdbc.getCloudSqlConnection(instanceUrl, user, password);
  const stmt = conn.createStatement();
  const results = stmt.executeQuery('show databases');
  while (results.next()) {
    Logger.log(results.getString(1));
  }
}

上に示す、DB名を列挙する簡単なプログラムを実行してみます。

f:id:ttk1:20200930211846p:plain
いまいましいエラー表示

このような表示が出て、 MySQL 8.0 のインスタンスへの接続はうまくいきません...

Jdbc.getConnection(url) でやってもダメ

Jdbc.getConnection(url) でやれば動くかもと思い、IPアドレスの許可設定を入れてやってみましたが、これもうまくいきません...

f:id:ttk1:20200930212857p:plain
IPアドレスの許可設定を入れたところ

3時間ほどあれこれ試した末、MySQL 8.0 だからうまくいかないんじゃないか、と思い至りました。

MySQL 5.7 だとうまくいく

MySQL 5.7 でやってみると問題なく実行完了して、次のようなログが出力されました。

f:id:ttk1:20200930212202p:plain
何の問題もなく動いた。

俺の3時間を返してくれ...

認証プラグインの違いではなさそう

www.s-style.co.jp

MySQL 8.0 からはデフォルトの認証プラグインが従来の mysql_native_password から caching_sha2_password に変わったようです。 ならば、これをもとのプラグインに変えれば接続できるようになるのでは、と思ったのですが...

cloud.google.com

Cloud SQL の MySQL 8.0 は従来の mysql_native_password がデフォルトに設定されているようです。

mysql> select user, host, plugin from mysql.user;                                                                                                                                       
+-------------------+-----------+-----------------------+
| user              | host      | plugin                |
+-------------------+-----------+-----------------------+
| cloudsqlreplica   | %         | mysql_native_password |
| cloudsqlsuperuser | %         | mysql_native_password |
| root              | %         | mysql_native_password |
| cloudsqlimport    | 127.0.0.1 | mysql_native_password |
| root              | 127.0.0.1 | mysql_native_password |
| cloudsqlimport    | ::1       | mysql_native_password |
| root              | ::1       | mysql_native_password |
| cloudsqlapplier   | localhost | mysql_native_password |
| cloudsqlimport    | localhost | mysql_native_password |
| mysql.infoschema  | localhost | caching_sha2_password |
| mysql.session     | localhost | caching_sha2_password |
| mysql.sys         | localhost | caching_sha2_password |
| root              | localhost | mysql_native_password |
+-------------------+-----------+-----------------------+
13 rows in set (0.16 sec)

実際に確認してみましたが、確かに mysql_native_password になってますね。

まとめ

AppsScript の JDBC サービスはまだ MySQL 8.0 に対応してないみたいです。 何らかの設定変更で使えるようになるかもしれませんが、 AppsScript からのアクセスを考えている場合は MySQL 5.7 を使いましょう。

Copyright © 2017 ttk1