向いているケース
- Zeabur で GitHub からデプロイしているバックエンド:Node.js・Python・Go の API、LINE Bot、Discord Bot
- アクセスが少なく、誰も使っていないときは料金がかからないようにしたい(Cloud Run はゼロまでスケールダウンします)
- 近いリージョンを使いたい:日本のユーザーが中心なら
asia-northeast1(東京)。以下の例では検証に使ったasia-east1(台湾)を記載しています
向いていないケース:永続ディスクが必要なサービス(アップロードファイルをローカルフォルダに保存するなど)。Cloud Run のファイルシステムは一時的なもので、再デプロイやゼロへのスケールダウンの後には書き込んだファイルが消えます。このようなサービスはファイルを Cloud Storage や R2 に保存するよう変更するか、VPS を使ってください(n8n 編を参照)。
ステップ 0:新規プロジェクトの準備(公式ドキュメントに基づく)
- gcloud CLI をインストールし、
gcloud initでログインしてプロジェクトを選びます。プロジェクトには請求先アカウントの紐付けが必要です - API を有効にします。
gcloud services enable run.googleapis.com cloudbuild.googleapis.com
- ソースからデプロイする場合、Cloud Build はデフォルトで Compute Engine のデフォルトサービスアカウントを使います。公式ドキュメントでは、このアカウントに Cloud Run Builder ロールを付与するよう求めています。
gcloud projects add-iam-policy-binding プロジェクトID \
--member=serviceAccount:プロジェクト番号[email protected] \
--role=roles/run.builder
ドキュメントによると、この権限付与が反映されるまで数分かかります。
今どのプロジェクトを使っているか必ず確認してください。 すべての
gcloudコマンドに--project=プロジェクトIDを付けるか、先にgcloud config get-value projectで確認します。私たち自身のパソコンにも複数のプロジェクトがあり、デフォルトのプロジェクトがデプロイしたいものと違うことはよくあります。
ステップ 1:アプリが PORT を待ち受けているか確認
Zeabur も Cloud Run も、どのポートで待ち受けるかを環境変数 PORT でアプリに伝えます。Zeabur のドキュメントどおりにすでに $PORT を使っているなら、変更は不要です。3000 のようにハードコードしている場合は次のように変更します。
app.listen(process.env.PORT || 3000);
ステップ 2:デプロイ
プロジェクトのルートで実行します(Dockerfile は不要で、Google の buildpacks が言語を自動判定します)。
gcloud run deploy my-api --source . --region asia-east1 \
--allow-unauthenticated \
--set-env-vars "NODE_ENV=production" \
--project=プロジェクトID
完了すると Service URL: https://my-api-xxxx.asia-east1.run.app が表示されます。検証では、Dockerfile のない Node サービスが初回のデプロイで正常に応答しました。
プロジェクトのルートに Dockerfile があれば、Cloud Run はそちらを優先して使います。
ステップ 3:キーは環境変数ではなく Secret Manager に
--set-env-vars の値は、サービスの設定を閲覧できる人なら誰でも見られます。データベースのパスワードや API キーは Secret Manager に入れてください。
# Secret を作成(printf なら末尾に改行が入らない)
printf '%s' 'postgresql://...' | gcloud secrets create database-url --data-file=- --project=プロジェクトID
# サービスにマウント。アプリからは従来どおり process.env.DATABASE_URL で読める
gcloud run services update my-api --region asia-east1 \
--set-secrets "DATABASE_URL=database-url:latest" --project=プロジェクトID
検証で遭遇したエラー
サービスアカウントに Secret を読む権限がないと、デプロイは失敗します。
ERROR: (gcloud.run.deploy) ... Permission denied on secret: projects/.../secrets/database-url/versions/latest
for Revision service account [email protected]. The service account used must be granted
the 'Secret Manager Secret Accessor' role (roles/secretmanager.secretAccessor) at the secret, project or higher level.
対処法は、その Secret だけに権限を付与し(最小の範囲)、再デプロイすることです。
gcloud secrets add-iam-policy-binding database-url \
--member="serviceAccount:エラーメッセージに出ているサービスアカウント" \
--role="roles/secretmanager.secretAccessor" --project=プロジェクトID
検証では、権限を付与して再デプロイすると、すぐに成功しました。
ステップ 4:データベース
Cloud Run にはデータベースは含まれていません。PostgreSQL は Neon や Supabase などのマネージドサービス、または Google の Cloud SQL に移せます。移行方法はデータベース編を参照してください。
ステップ 5:LINE Bot の Webhook URL を変更
- LINE Developers を開き、チャネルを選択します
- 「Messaging API設定」タブの Webhook URL を、新しい Cloud Run の URL(アプリのパス、例:
/webhookを付けたもの)に変更します - 「検証」を押して成功を確認します
チャネルシークレットとチャネルアクセストークンも、この機会に差し替えることをおすすめします。セキュリティ編を参照してください。
ステップ 6:独自ドメインの設定
Cloud Run に独自ドメインを設定する方法は複数あり(Cloud Run のドメインマッピング、ロードバランサ、Firebase Hosting)、対応リージョンや費用が異なります。Google の公式ドキュメントを参照して選んでください。この手順は今回検証していません。 DNS 切り替えの注意点はドメインと DNS 編を参照してください。