GoogleCloudRun初心者がRailsのデプロイでつまづいたエラー7種

# この記事は

これは、普段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](https://cloud.google.com/ruby/rails/run?hl=ja)
(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' の追加
```bash
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`に変更

#### 参考記事 🙌
* [Application works locally, but fails with 502 in cloud run - &quot;upstream connect error or disconnect/reset before headers. reset reason: protocol error&quot; - Server Fault](https://serverfault.com/questions/1070510/application-works-locally-but-fails-with-502-in-cloud-run-upstream-connect-e)

## 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 <-- 追加
```
#### 参考記事 🙌
* [Cloud Run上でRailsからCloud SQLに接続できない時は `host: localhost` が必要かも](https://zenn.dev/haze_it_ac/articles/2dec7fd345e2bb)

## 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 ロールを割り当て

#### 参考記事 🙌
* [クイックスタート: Cloud Run から Cloud SQL for SQL Server に接続する | Google Cloud](https://cloud.google.com/sql/docs/sqlserver/connect-instance-cloud-run?hl=ja#configure_a_service_account)

## 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
```

### 解決方法
1. Service Account作り権限を付与、鍵を作成
2. 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") %> # <-- 追加
```

#### 参考記事 🙌
* [Active StorageでGoogle Cloud Storageに画像を保存する - ツナワタリマイライフ](https://blog.chaspy.me/entry/2018/11/11/120000)

## 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.
```

### 解決方法
バケットのプリンシパルに作成したサービスアカウント追加し、ストレージ管理者のロールを与える

#### 参考記事 🙌
* [Active StorageでGoogle Cloud Storageに画像を保存する - ツナワタリマイライフ](https://blog.chaspy.me/entry/2018/11/11/120000)


最後までお読みいただきありがとうございます。
もし、気に入っていただける内容ありましたら、「いいね」や「シェア」していただけるととても嬉しいです。
今後の活動の大きな励みになります！