🧐

GASから"Google Cloud SQL for MySQL"への接続で試したこと

4 min read

はじめに

GASから"Google Cloud SQL for MySQL"に接続する際に、ハマったことや試したことを備忘録として残しておこうと思います。拙い文章ですが、何かのお役に立てれば幸いです😊

"Cloud SQL for MySQL"のインスタンス作成等は触れません。
インスタンスの作成はこちら

事前知識

GASが対応するDB接続先は以下の4つです。

  • Google Cloud SQL for MySQL
  • MySQL
  • Microsoft SQL Server
  • Oracle

GASから外部DBへ接続するには、JDBCサービスを使用する他に選択肢はなさそうです。
公式ドキュメントに記載されている接続方法は以下の2通りです。

  • Jdbc.getCloudSQLConnection() 👈 推奨
  • Jdbc.getConnection()

今回は、基本的にJdbc.getCloudSQLConnection()を使用しています。

ハマったこと&試したこと

それでは本題に入ります。

GASのJDBCサービスは"MySQL5.7"までしか対応してない

"MySQL8.0"でインスタンス作成後、GASから接続を試みましたが、DB接続エラーになります。
ここのQAを見て気づきました。"MySQL5.7"でインスタンス作成後に接続を試みると成功しました。

GCPのIAMとGAS実行のアクティブユーザーの関係性の調査

DB接続のスクリプトを組み込んだGASを実行していたのは、GCPのIAMに存在する(CloudSQL関連の権限がある)ユーザーでした。GASを利用するユーザーを毎回IAMに追加するのは面倒(GCPコンソールを見られたくない)なので、IAMに存在しないユーザーでGASを実行するとどうなるのか試してみました。

結果

GCPのIAMに存在する(CloudSQL関連の権限がある)アクティブユーザーは、DB接続成功
GCPのIAMに存在しないアクティブユーザーは、DB接続失敗(以下エラーメッセージ)

Exception: データベース接続を確立できませんでした。接続文字列、ユーザー名、パスワードを確認してください。

IAMに存在しないユーザーをDB接続するために試したこと

  • 承認ネットワークにGASを実行する端末のIPアドレス追加
  • JDBC公式ドキュメントに記載してあるIPアドレス範囲を承認ネットワークとして追加
  • Jdbc.getConnection()でSSL接続

承認ネットワークにGASを実行する端末のIPアドレス追加

これはDB接続エラーとなりました。
CloudSQLのパブリックIPの設定で承認ネットワークを追加できるので、そこに追加すれば上手くいくかな?と思ったのですが、JDBCサービスを経由しているので無意味でした。

JDBC公式ドキュメントに記載してあるIPアドレス範囲を承認ネットワークとして追加

公式ドキュメントを見ていると、Jdbc.getConnection()を使用する際の手順として以下の内容が記載されていました。

In your Google Cloud SQL instance, authorize the IP ranges, one at at time from this data source.

DB接続に使用していたのはJdbc.getCloudSQLConnection()の方でしたが、ダメ元で試してみました。結果は変わらず、DB接続エラーとなりました。

承認ネットワークの追加は、GCPコンソールからだと1つずつ追加する必要がありますが、"gcloud"のコマンドを使用すると一気に追加することができるのでオススメです。

Jdbc.getConnection()でSSL接続

ありがたいことにGASとCloudSQLのSSL接続方法を共有して下さっている方がいたので、この記事を参考にSSL接続を試してみました。結果としては以下のエラーになりました。

Exception: Google Cloud SQL 接続は getConnection() の代わりに getCloudSqlConnection() で取得する必要があります。

公式ドキュメントに記載されている接続方法なのに、なぜかエラーになります。。。

2021/02/24 追記

GASからCloudSQLへのSSL接続ができました!
Jdbc.getConnection()使用時のurlをJdbc.getCloudSQLConnection()と同じurlでセットしていたため、上記のエラーが発生していたようです。urlの違いは以下に記載します。

  • Jdbc.getCloudSQLConnection()
    url: jdbc:google:mysql://{CloudSQLの接続名}/{データベース名}
  • Jdbc.getConnection()
    url: jdbc:mysql://{パブリックIPアドレス}/{データベース名}

おわりに

GASから"Google Cloud SQL for MySQL"への接続について色々と試しましたが、今のところ上手く接続できた方法はこんな感じになります。

  • Jdbc.getCloudSQLConnection()を使用する

公式ドキュメントの中に記載は見つけられませんでしたが、この"stackoverflow"によると、Jdbc.getCloudSQLConnection()はアクティブユーザーのGoogleアカウントをGCP側に渡すため、そのユーザーがSQL関連の権限を持っている必要があるようです。

2021/02/24 追記
  • Jdbc.getConnection()を使用する
    • IP範囲をパブリックIPアドレスの承認ネットワークに追加
    • GAS実行のアクティブユーザーがGCPのIAMに存在しなくてもDB接続可能
    • SSL接続も可能(KEY情報が漏れないように検討が必要)

記事を読んでくださった方、ありがとうございました。
記載内容に誤り等あれば、ご指摘頂けると嬉しいです。

もし、GCPのIAMに存在しないユーザーが、GASからCloudSQLに接続できる方法をご存知の方がいらっしゃいましたら、教えてください🙇‍♂️

Discussion

ログインするとコメントできます