Cloud Run + Artifact Registry + Secret ManagerRun, store, secret
松葉のアプリ本体を動かす Cloud Run(コンテナを HTTP リクエスト毎に起動するサーバレス基盤)の 4 サービスを「ハロー世界」イメージで先に空デプロイし、コンテナイメージの保管庫 Artifact Registry と、認証情報の金庫 Secret Manager(7 シークレット)を整備しました。
Cloud Run × 4 サービスを空デプロイFour services, placeholder image
後続手順(08 の Pub/Sub サブスクリプション、09 の LB バックエンド)が Cloud Run の URL を必要とするため、本物のアプリイメージができる前に、空のハロー世界イメージ gcr.io/cloudrun/hello で先にサービス枠を作成しました。後で同じサービス名に本物のイメージを上書きデプロイしても URL は維持されます。
| サービス | min / max | リソース | 役割 | 外部公開 |
|---|---|---|---|---|
matsuba-web | 1 / 上限あり | CPU・メモリを設定 | Next.js 16 の UI(画面) | LB 経由のみ |
matsuba-api | 1 / 上限あり | CPU・メモリを設定 | Hono の業務 API + 認証 | LB 経由のみ |
matsuba-sync | 0 / 上限あり | CPU・メモリを設定 | Go の Drive 同期ワーカー(Pub/Sub 経由でのみ起動) | internal(外部不可) |
matsuba-scanner | 1 / 上限あり | CPU・メモリ(大きめ)を設定 | Go + ClamAV のウイルススキャン | internal(外部不可) |
min=1 / min=0 の意味: min=1 は「常に 1 インスタンス(コンテナ)が起動した状態を保つ」、min=0 は「リクエストが来るまで完全停止」。matsuba-sync は需要連動なので min=0(アイドル時 0 円)、ウイルススキャンは初動を遅らせないため min=1 で常時待機。
Artifact Registry(コンテナイメージ保管庫)Container registry
コンテナイメージ(アプリを丸ごとパッケージ化したもの)を保管する場所です。GitHub Actions がビルドしたイメージをここに push し、Cloud Run がここから pull します。
| 項目 | 値 |
|---|---|
| 名前 | matsuba |
| 形式 / モード | Docker · Standard |
| ロケーション | asia-northeast1(東京) |
| フルパス | asia-northeast1-docker.pkg.dev/<project-id>/matsuba |
| クリーンアップポリシー | 一定期間経過 + 最新の一定数を保持して自動削除(コスト膨張対策) |
Secret Manager に登録した 7 シークレットSeven secrets
パスワード・API キー・暗号鍵などをアプリのソースコードに書かず、Secret Manager(クラウドの金庫)に置きました。Cloud Run はサービスアカウントの権限で実行時に取り出します。命名は matsuba-{key} で統一しています。
| Secret 名 | 中身 | 誰が読めるか |
|---|---|---|
matsuba-database-url | Supabase Postgres の接続文字列 | api の実行 SA / batch(Jobs)の実行 SA |
matsuba-better-auth-secret | セッション署名鍵(32 byte random) | api の実行 SA |
matsuba-google-client-id | Google OAuth クライアント ID | api の実行 SA |
matsuba-google-client-secret | Google OAuth クライアント Secret | api の実行 SA |
matsuba-resend-api-key | Resend API キー | api の実行 SA / batch(Jobs)の実行 SA |
matsuba-resend-webhook-secret | Resend Webhook 署名検証鍵 | api の実行 SA |
matsuba-cors-origin | 許可する Origin(https://portal.example.com) | api の実行 SA / web の実行 SA |
SA 単位 × Secret 単位の最小権限: 「scanner の実行 SA にはどの Secret も渡さない」「隔離読取専用 SA には何も渡さない」「api の実行 SA には隔離操作の鍵を渡さない」など、SA とシークレットの関係をリソース単位で絞っています。プロジェクト全体に secretAccessor を付けるショートカットは取りません。年次の手動ローテーションをカレンダー管理で行います。
イメージ → 実行 → シークレット注入の流れImage-to-runtime flow
本構築時点では gcr.io/cloudrun/hello という Google 公式のハロー世界イメージが入っており、本物のアプリイメージは Step 1 以降の機能タスクで GitHub Actions の CI/CD ワークフローから順次上書きデプロイされます。URL は変わらないため、08 で作るサブスクリプションや 09 で作る LB は本手順完了時点で確定値として参照できます。