TL;DL
- GAE と違ってデフォルトのデプロイ方法だけでは API はパブリックに公開されない
- 慣れないうちは調整のため何度かデプロイすることになるので、軽いイメージで試す
大まかな流れ
API サーバの準備
API サーバをポート 8080 固定で Listen or 環境変数process.env.PORT
から PORT 取得
Dockerfile を書く
Port 指定について
アプリ側で Listen しておけばコンテナ側では expose やポートバインディングは不要です。
Ignore 指定について
.dockerignore
や.gcloudignore
を利用して不要なファイルのアップロードやコンテナ化を防ぎましょう。
モノレポ対応について
以下の Dockerfile のように必要最低限のファイルのみコピーすることでコンテナ化が高速になります。
Turborepo 内の NestJS の場合、主に必要なファイルは以下です
- モノレポルートの package.json
- turborepo の利用に不可欠な turbo.json
- apps の中の API サーバ (他の apps のファイルは高速化のためコピーしない)
- 内部 packages は apps で import しているので/packages 丸ごとコピー
(API サーバで import している内部 packages だけコピーすればより高速化するはずです)
マルチステージビルドについて
サンプル例では 200MB ほどサイズ削減できました。
Dockerfile について
以下にモノレポ(Turborepo)配下の NestJS コンテナ化の例を記載しました。
cloudbuild.yaml を書く
以下のステップを含む cloudbuild.yaml を書く
- コンテナイメージのビルド
- コンテナイメージを GCR に Push
- CloudRun のデプロイ(上記で GCR に Push したイメージを利用)
Cloudbuild から CloudRun をデプロイする場合の権限
権限足りていない場合はデプロイ時のエラーメッセージを元に以下等を追加して下さい。
- Cloud Build サービス アカウント (CloudBuildAPI 有効化時にデフォルトで追加されているはず)
- Storage オブジェクト閲覧者 (Cloudbuild 用にアップロードしたソースコードの閲覧に必要)
- Cloud Run デベロッパー (CloudRun のデプロイに必要)
- サービス アカウント ユーザー (CloudRun のデプロイに必要)
公開範囲の設定
以下を参考に公開範囲を設定する
以下でも設定できる