Open42

GAE + Nest + Prisma環境構築

dorarepdorarep

Deploy

dorarepdorarep
 ✗ gcloud app deploy
Initializing App Engine resources...failed.
ERROR: (gcloud.app.deploy) Error Response: [7] Insufficient permissions to create Google Cloud Storage bucket.

Details: [
  [
    {
      "@type": "type.googleapis.com/google.rpc.ResourceInfo",
      "resourceName": "liw-test.appspot.com",
      "resourceType": "cloud storage bucket"
    }
  ]
]

初回実行にはストレージ管理者が必要

https://dev.1dz.jp/gcp/gcs/diff_of_storage_admin/

dorarepdorarep
ERROR: (gcloud.app.deploy) PERMISSION_DENIED: You do not have permission to act as 'liw-test@appspot.gserviceaccount.com'
- '@type': type.googleapis.com/google.rpc.ResourceInfo
  description: You do not have permission to act as this service account.
  resourceName: liw-test@appspot.gserviceaccount.com
  resourceType: serviceAccount

https://uyamazak.hatenablog.com/entry/2021/02/22/135431

Cloud Build

Cloud Build権限が必要

Cloud Build > サービスアカウント権限

問題1

サービス アカウントに関連付けられた IAM ロールを表示するには、resourcemanager.projects.getIamPolicy 権限が必要です。

問題2

サービス アカウントの権限を変更する前に Cloud Build API を有効にする必要があります。

API押すと

このプロダクトの有効化ステータスを確認するために必要な権限がありません。

権限付与すると

課金が必要
Cloud Build API には請求先アカウントを持つプロジェクトが必要です。

→失敗
PERMISSION_DENIED: You do not have permission to act as '~~~'に表示されているアカウントはCloud Buildのサービスアカウントではないのでこれが原因ではなさそう

dorarepdorarep

自分にサービス アカウント ユーザー権限付与
→成功

dorarepdorarep

GAE(Standard) + Prisma + Cloud SQL

https://cloud.google.com/sql/docs/mysql/connect-app-engine

接続上限
Cloud SQL では、同時接続の上限が設定されています。これらの上限は、選択したデータベース エンジンによって異なります。詳しくは、Cloud SQL の割り当てと上限をご覧ください。
App Engine には負荷の増加に応じて自動的にインスタンスを作成する機能があるため、これらの上限を超える可能性があります。この問題を回避するには、App Engine インスタンスの最大数を制限します。詳しくは、要素のスケーリングをご覧ください。

dorarepdorarep

gcp-buildでmigrateする方向性

error: Environment variable not found: DATABASE_URL

app.yamlenv_variablesgcp-build時には使われないらしい。

https://github.com/prisma/prisma/issues/1508

Please make sure your database server is running at localhost:3306.

gcp-buildはCloud Buildの中の世界なので、そのままだとCloud SQLへ接続できない
サービスアカウント経由でCloud SQL Proxyを使う必要性がある

dorarepdorarep

一旦GAE上で動かして強引に動作させる

    "start:prod": "prisma migrate deploy && node dist/main",
dorarepdorarep

GAE StandardのCons

選定理由の説明用に思いついたものまとめる

Nodeのバージョンが固定化される

  • 選択肢が少ない。マイナーバージョンは最新のしかない。
    • むしろバージョンアップに追随できないプロダクトな時点で厳しいため、制約があったほうが良い

デプロイ手順がブラックボックス

  • Cloud Buildでログが見れるので、頑張れば再現できるかも
  • カスタマイズしたい場合はそもそも1からCloud Buildで書くこともできる
    • そこまで必要になる場合GAE使うメリットは薄いかも

本番環境がwrite-only

  • むしろ環境内でのwriteを全く考慮しなくて良いので健全とも言える

本番環境がブラックボックス

  • 特殊な要件が出てきたときに困るかも
dorarepdorarep

Cloud Run

dorarepdorarep

https://cloud.google.com/run/docs/deploying-source-code

gcloud run deploy --source を使用してソースからデプロイする機能は便利ですが、ビルドを完全にカスタマイズすることはできません。より細かく制御するには、Cloud Build を使用してコンテナ イメージをビルドします。たとえば、gcloud builds submit を使用し、次に gcloud run deploy --image などを使用してコンテナ イメージをデプロイします。