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名を列挙する簡単なプログラムを実行してみます。
このような表示が出て、 MySQL 8.0 のインスタンスへの接続はうまくいきません...
Jdbc.getConnection(url) でやってもダメ
Jdbc.getConnection(url) でやれば動くかもと思い、IPアドレスの許可設定を入れてやってみましたが、これもうまくいきません...
3時間ほどあれこれ試した末、MySQL 8.0 だからうまくいかないんじゃないか、と思い至りました。
MySQL 5.7 だとうまくいく
MySQL 5.7 でやってみると問題なく実行完了して、次のようなログが出力されました。
俺の3時間を返してくれ...
認証プラグインの違いではなさそう
MySQL 8.0 からはデフォルトの認証プラグインが従来の mysql_native_password
から caching_sha2_password
に変わったようです。
ならば、これをもとのプラグインに変えれば接続できるようになるのでは、と思ったのですが...
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 を使いましょう。