GAE + Nest + Prisma環境構築

App Engineの作成
- App Engine 作成者
- App Engine 管理者
の2つのロールが必要

Deploy

✗ 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"
}
]
]
初回実行にはストレージ管理者が必要

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
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のサービスアカウントではないのでこれが原因ではなさそう

hogehoge@appspot.gserviceaccount.com
に「App Engine デプロイ担当者」の追加
→失敗
hogehoge@cloudbuild.gserviceaccount.com
に「サービス アカウント ユーザー」の追加

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

Nest.js + GAE

Nodeのバージョン
マイナー、パッチバージョンは最新の安定版

GAE + Prisma

prisma generateの挙動
-
prisma generate
-
node_modules/.prisma/client
に出力
-
-
@prisma/client
const prisma = require('.prisma/client')

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


これでつながる
DATABASE_URL=mysql://USERNAME:PASSWORD@localhost/DATABASE_NAME?socket=/cloudsql/INSTANCE_CONNECTION_NAME

migrate

CircleCIでprisma migrateしてる例

gcp-build
でmigrateする方向性
error: Environment variable not found: DATABASE_URL
app.yaml
のenv_variables
はgcp-build
時には使われないらしい。
Please make sure your database server is running at
localhost
:3306
.
gcp-build
はCloud Buildの中の世界なので、そのままだとCloud SQLへ接続できない
サービスアカウント経由でCloud SQL Proxyを使う必要性がある

一旦GAE上で動かして強引に動作させる
"start:prod": "prisma migrate deploy && node dist/main",

Github Actionsでmigrateを行う方向性
Proxy経由のDBへの接続はこれを使えば簡単にできそう
GAEはsocket経由、Github Actionsはproxy経由なのでDATABASE_URL
を環境ごとに変える必要がある

Cloud Taskでmigrationを行う方向性
yarn prisma migrate deploy
をやりたいだけなので、やりたいことに対して過剰な感じ

環境変数の管理

Github Actions

GAE StandardのCons
選定理由の説明用に思いついたものまとめる
Nodeのバージョンが固定化される
- 選択肢が少ない。マイナーバージョンは最新のしかない。
- むしろバージョンアップに追随できないプロダクトな時点で厳しいため、制約があったほうが良い
デプロイ手順がブラックボックス
- Cloud Buildでログが見れるので、頑張れば再現できるかも
- カスタマイズしたい場合はそもそも1からCloud Buildで書くこともできる
- そこまで必要になる場合GAE使うメリットは薄いかも
本番環境がwrite-only
- むしろ環境内でのwriteを全く考慮しなくて良いので健全とも言える
本番環境がブラックボックス
- 特殊な要件が出てきたときに困るかも

本番環境へのsshは簡単にできそう?
ちょっとしたスクリプトの実行などはsshして実行するって選択肢も取れなくはなさそう。
