俺、サービス売って家買うんだ

Swift, Kotlin, Vue.js, 統計, GCP / このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃなかろうか

GAEにデプロイしたRailsからGoogle Cloud SQL に疎通できない時に確認すること

f:id:ie-kau:20170806002855p:plain


概要

さてさて、去年 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

f:id:ie-kau:20170805194743p:plain

デフォルトでは以下のログが見れるようになっています。

  • stdout
  • stderr
  • nginx.request

f:id:ie-kau:20170805194902p:plain

何が悪かったか??

で、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 にします。

f:id:ie-kau:20170806003101p:plain

これで疎通完了です。

まとめ

ローカルで cloud_sql_proxy を入れて使う場合には問題なく疎通できるのですが、GAE 上では API の設定を変更する必要があるようでした。
これで GAE / Ruby on Rails の環境が整いましたね。