GAEにデプロイしたRailsからGoogle Cloud SQL に疎通できない時に確認すること
概要
さてさて、去年 Google App Engine に Ruby の runtimeが追加されたことにより、GAE上でRailsを稼働させることが出来るようになりました。
ちょっと時間が空いてしまいましたが絶賛いじり中です。
今日は、GAEに上げたRailsからGoogle Cloud SQLに接続しようとした結果、少しハマってしまったので対処法のメモを残して置こうと思います。
本来の Google Cloud SQLへのつなぎ方
GAE上から Google Cloud SQL に繋ぐ設定は簡単です。 コンテナ上で mysql ソケットは以下のパスに展開されるので Rails の設定で Path を指すように記述します。
/cloudsql/コネクション名
app.yaml
GAE の設定
runtime: ruby env: flex entrypoint: bundle exec rackup -p 8080 -E production config.ru env_variables: SECRET_KEY_BASE: 'xxxxxxxxxxxx' beta_settings: cloud_sql_instances: [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME] # Cloud SQL のコネクション名
database.yml
Rails - MySQLの設定
production: <<: *default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: USER_NAME password: PASSSWORD database: DATABASE_NAME socket: /cloudsql/[PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME] # Cloud SQL のコネクション名
しかし、この設定のみで通信できると考えていたですが、何故か疎通できませんでした。。。
GAE上のstderrログを見る
問題切り分けのためにログを見ます。 ログは Stackdriver に流されているので、検索条件を絞ることで閲覧可能です。
ドロワーメニューから Stackdriver を選んで Logging -> Logs
デフォルトでは以下のログが見れるようになっています。
- stdout
- stderr
- nginx.request
何が悪かったか??
で、stderr を追っていくと・・・ Rails を起動する前にこんなエラーが・・・
payload: " googleapi: Error 403: Access Not Configured. Cloud SQL Administration API has not been used in project XXXXXX before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?project=XXXXXX then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry., accessNotConfigured
とのこと。どうやら、Cloud SQL の API を有効にする必要があるらしいです。ログに流れていたリンク先に飛ぶと API 設定画面が開くので、 disable の項目を enable にします。
これで疎通完了です。
まとめ
ローカルで cloud_sql_proxy を入れて使う場合には問題なく疎通できるのですが、GAE 上では API の設定を変更する必要があるようでした。
これで GAE / Ruby on Rails の環境が整いましたね。