この記事は
これは、普段AWS ECSを利用している筆者が、手元のRailsアプリでGoogle Cloud Runを試したら思いのほか手間取った話。慣れればCloud Runは推せる😎
やりたかったこと
ターミナルで華麗にデプロイ
前提
- ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [-darwin21]
- Rails 7.0.3
- Google Cloud SDK 393.0.0
- Docker Image ruby:2.7-alpine
- ProductName: macOS
- ProductVersion: 12.4
参考にした手順と発生したエラー
-
Cloud Run 環境での Rails の実行 | Ruby | Google Cloud
(Cloud Build は未使用)
Error 1: NoMethodError: undefined method `size' for nil:NilClass 1
これ一番手間取った。ググってもrails5のcredentialしか出てこなくて今回記事投稿しようと思ったきっかけ。
ブラウザで、An unhandled lowlevel error occurred. The application logs may have details.
を表示し、以下のようなログを出力する。
2022-07-24 22:09:09 +0900 Rack app ("GET /" - (240f:78:135b:1:8405:cf55:4f91:c2e0)): #<NoMethodError: undefined method `size' for nil:NilClass>
解決方法
(なぜ解決できるのかは調べてない)
1 gem 'appengine' の追加
bundle add appengine
2 libc6-compatのインストール
# Check <https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine> to understand why libc6-compat might be needed.
RUN apk add --no-cache --update libc6-compat
RUN ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
Error 2: 502 Bad Gateway
ブラウザで、upstream connect error or disconnect/reset before headers. reset reason: protocol error
を表示する。
解決方法
とりあえず動かしたかったので、gcloud run deployのオプションを--no-use-http2
に変更
参考記事 🙌
Error 3: Can't connect to MySQL
ActiveRecord::ConnectionNotEstablished: Can't connect to MySQL server on '0.0.0.0' (115)
解決方法
database.ymlにhost: localhost
を追加
# config/database.yml
socket: /cloudsql/project_id:us-central1:db-name
host: localhost <-- 追加
参考記事 🙌
Error 4: DatabaseConnectionError
ActiveRecord::DatabaseConnectionError: There is an issue connecting with your hostname: /cloudsql/project-id:us-central1:db-name.
Please check your database configuration and ensure there is a valid connection to your database.
解決方法
Cloud Run サービス アカウントにCloud SQL Client ロールを割り当て
参考記事 🙌
Error 5: Revision 'xxxxx' is not ready and cannot serve traffic.
ERROR: (gcloud.run.deploy) Revision 'app-00032-rob' is not ready and cannot serve traffic.
解決方法
無視してgcloud run deploy ...
を繰り返す。だいたい2回目には成功
Error 6: Cloud Storage - Service account credentials 'issuer (client_email)' is missing
Service account credentials 'issuer (client_email)' is missing. To generate service account credentials see https://cloud.google.com/iam/docs/service-accounts
解決方法
- Service Account作り権限を付与、鍵を作成
- config/storage.ymlにcredentialsを追加
google:
service: GCS
project: <%= ENV.fetch('GOOGLE_PROJECT_ID') { 'GOOGLE_PROJECT_ID' } %>
bucket: <%= ENV.fetch('STORAGE_BUCKET_NAME') { 'STORAGE_BUCKET_NAME' } %>
credentials: <%= Rails.root.join("project-id.json") %> # <-- 追加
参考記事 🙌
Error 7: Cloud Storage - forbidden
forbidden: service@project-id.iam.gserviceaccount.com does not have storage.objects.create access to the Google Cloud Storage bucket.
解決方法
バケットのプリンシパルに作成したサービスアカウント追加し、ストレージ管理者のロールを与える
参考記事 🙌
最後までお読みいただきありがとうございます。
もし、気に入っていただける内容ありましたら、「いいね」や「シェア」していただけるととても嬉しいです。
今後の活動の大きな励みになります!