約一年ぶりに、GASと、Google CloudのCloud SQLの環境を作った。昨年はできなかったGASから、JDBCを介してのMySQL8への接続を試してみたところ、接続できることがわかった。
下図は、GASからMySQL8に接続して、バージョン情報を取得しているところ。

これでMySQLのバージョンを気にすることなく、GASから接続する環境を作れる。
約一年ぶりに、GASと、Google CloudのCloud SQLの環境を作った。昨年はできなかったGASから、JDBCを介してのMySQL8への接続を試してみたところ、接続できることがわかった。
下図は、GASからMySQL8に接続して、バージョン情報を取得しているところ。

これでMySQLのバージョンを気にすることなく、GASから接続する環境を作れる。
昨年、Google App Scriptから、JDBC経由で、Google CloudのCloud SQL のMySQL 8.0のインスタンスに接続を試して、失敗した。JDBCがMySQL 8.0 に対応しておらず、接続エラーになるというものだった。
あれから1年がたち、もう一度、試してみたが、Google App ScriptからJDBCを使って、MySQL 8.0のインスタンスに接続することはできなかった。まだ、MySQL 5.7のインスタンスまでしか対応していない。
MySQL 5.7 のインスタンスには、GASから正常にアクセスできていることも、ついでに確認した。
7月の後半から、Google Cloud上で作ったウェブアプリのプロジェクトで課金されていた。もともと無料枠を使っていたので、課金されるはずは・・・ない、と思っていた。実際、今までは課金されていなかった。
原因を調べたところ、2021年7月24日で、Google App Engineの無料枠に制限するリミット機能が廃止されたようである。これの影響で、1日あたりの無料枠を超えても、エラーにならず課金されていた。
https://cloud.google.com/appengine/docs/deprecations?hl=ja

なんというか無料枠でできることだけ、と思っていたら、利用量が増えると課金されるようになったので、非常に使いにくい。性能とかよりも、料金優先の運用を行いたかったのだが。
いろいろと原因というか課金されていたプロジェクトを調べていたところ、課金されているプロジェクトは、現在使われておらず、かつ紛らわしいプロジェクト名で生きているプロジェクトのように見えていた。AppEngineのインスタンスを起動させ続けるために、定期的にCronでセッションを維持しており、誰もつかっていないのに、使われているかのようにAppEngineのインスタンスが継続されていた。これにより、無料枠を超えていた模様。無料枠の上限がなくなったため、課金されて気が付いた、というわけだ。
参考: https://www.serversus.work/topics/cn8fierxx2rm2skcxjfm/
今回の無料枠の上限撤廃を契機に、Google Cloud上にある使っていないプロジェクトは整理してシャットダウンしておいたほうがよい。
GAS(Google Apps Script)から、Cloud SQLに接続をJDBCから行ったのだが、下記のエラーが出て接続できない。
Exception: データベース接続を確立できませんでした。接続文字列、ユーザー名、パスワードを確認してください。
接続先の環境は、Cloud SQL(Google Cloud Platform SQL)上で新しく作ったインスタンスで、第2世代で、MySQL8.0のインスタンス。
GASのソースコードとしては、下記。
function dbConn() {
var dbConnectName = "プロジェクト名:us-central1:インスタンス名"; // GCP上で表示される接続名
var user = "ユーザ名";
var password = "パスワード";
var dbName = "DB名";
var conURL = "jdbc:google:mysql://" + dbConnectName + "/" + dbName;
Logger.log(conURL);
var dbCon = Jdbc.getCloudSqlConnection(conURL, user, password);
Logger.log(dbCon.getCatalog());
return dbCon;
}
いろいろと調べて、JDBCの`Jdbc.getConnection`でも試したが、接続できず。
原因として、わかったことは、GASから呼び出されるJDBCは、MySQL8.0へのインスタンスへの接続に対応していないということ。MySQL5.7で新しくインスタンスを作り直して、`Jdbc.getCloudSqlConnection`を行ったところ、あっさりと接続できた。
まさか、JDBCが対応していないとは。
Google Cloud SQLで、接続元のIPアドレスを固定できず、どこからでも接続できる設定にする。基本的にセキュリティがゆるゆるになるので、開発のときか、確認のための一時的な設定にした方がよい。
これで、外部からCloud SQLのDBに接続できるようになる。
Google Cloud、VMware実行環境提供のCloudSimpleを買収https://www.itmedia.co.jp/news/articles/1911/19/news074.html
ネットワーク設計さえ、ちゃんとやればオンプレのVMwareの仮想マシンは、GCPでもAzureでも、AWS(は専用環境が用意されてる)でも、簡単にV2Vというか移動ができるようになると。意外と、VMware形式でVMを作っておけば、大手クラウド間を移動できる世界になりそうだな。VMwareの狙いは、そこなんだろうけど、実現しつつあるのが面白い。
G Suiteのユーザで、Google Cloud Platformを使う設定、および使わせない設定を行うには、G Suiteの管理画面で、「Google Cloud Platform」のサービスをオン/オフする。
GCP(Google Cloud Platform)で、Cloud Shellから、Cloud SQLに接続しようとすると、403エラーになり、接続できない。GCPでプロジェクトを共有しているユーザごとに、エラーになるユーザと、正常に接続できるユーザがいる(ので、Cloud SQLのサービスの問題ではない)。原因は、CGPのIAMの設定の不備。
接続がエラーのとき
zen@cloudshell:~ (devPJ)$ gcloud sql connect devDB --user=conusr ERROR: (gcloud.sql.connect) HTTPError 403: The client is not authorized to make this request. zen@cloudshell:~ (devPJ)$
接続に成功するとき(MySQLのユーザ認証は別)
zen@cloudshell:~ (devPJ)$ gcloud sql connect devDB --user=conusr Whitelisting your IP for incoming connection for 5 minutes...⠼
対処
Clolud Shellから、Cloud SQLに接続するには、GCPのIAMで、「Cloud SQL 編集者」の権限をつける必要がある。閲覧者だと、Cloud Shellからは接続できず、403エラーが発生する。
