[Google AI Pro プラン目線] Antigravity と Google Cloud — アプリを書いて GCP にデプロイ(第3回・GCPにデプロイ)

| 3 min read

📝 記事について:
全3回の最終回です。第3回は「UP するだけ」。
ターミナルから gcloudCloud Run にデプロイする流れ・環境変数(API キー)の渡し方・デプロイ後の確認をまとめます。
正確な内容は公式ドキュメントをご確認ください。

この回では gcloud で Cloud Run にデプロイします。

第2回で用意した cloudrun_hellocloudrun_ask を、gcloud run deploy でデプロイ。環境変数(API キー)の設定と動作確認まで。

第1回gcloud のインストールと認証、第2回cloudrun_hellocloudrun_ask を用意しました。
今回はターミナルから gcloud run deploy で Cloud Run にデプロイする手順を、準備の確認から順にまとめます。

なぜ Cloud Run に UP するのか

ローカルで Python を動かすには venvpip install など環境構築が面倒です。
Cloud Run なら、main.pyrequirements.txtDockerfile を書けば、環境構築と Web 公開を自動でやってくれます。
gcloud run deploy --source . で送るだけでクラウド側でビルドされ、すぐ URL でアクセスできます(公式:ソースコードからデプロイ)。

ソースを送ったらあとは任せられる、かなりありがたいですよね~~。

第1回で準備したことの確認

デプロイ前に次の2つを済ませます。
参考:Google Cloud CLI のインストールローカル開発環境の ADC 設定

1. gcloud がインストール済みか確認する

ターミナルで次を実行し、バージョンが表示されれば OK。

gcloud --version

表示されない場合は第1回の手順で gcloud をインストールしてください。

2. 認証(ADC)を済ませる

ローカルから GCP にデプロイするには ADC(Application Default Credentials) の設定が必要です(公式:ADC を設定する)。

gcloud auth application-default login

実行するとブラウザが開きます。「Google Cloud SDK が Google アカウントへのアクセスをリクエストしています」で「許可」を押すと認証情報がローカルに保存されます。

gcloud auth application-default login で表示される ADC 認証画面。
図:ADC 認証画面(「許可」で続行)

成功すると Credentials saved to file: […\application_default_credentials.json] と表示されます。プロジェクトは gcloud config set project プロジェクトID で指定するか、デプロイ時に聞かれたら指定してください。

cloudrun_hello をデプロイする

サンプル一式(cloudrun_hello / cloudrun_ask)は cloudrun_samples.zip からダウンロードできます。解凍後、各フォルダで .\deploy.ps1 または gcloud run deploy を実行してください。

cloudrun_hello/
├── main.py
├── requirements.txt
├── Dockerfile
└── deploy.ps1
cloudrun_ask/
├── main.py
├── requirements.txt
├── Dockerfile
└── deploy.ps1

cloudrun_hello フォルダ(main.pyrequirements.txtDockerfile がある場所)に移動し、1本のコマンドでデプロイします。
gcloud run deploy --source . はソースをアップロードし、Dockerfile があればそれでコンテナをビルドして Cloud Run にデプロイします(公式:ソースコードからデプロイ)。ローカルに Docker がなくても Cloud Build がクラウド側でビルドします。

3. デプロイするフォルダに移動する

cloudrun_hello があるディレクトリに cd します。例(ご自身のパスに読み替えてください):

cd "…\brief029\cloudrun_hello"

PowerShell でデプロイする:各フォルダに deploy.ps1 があります。フォルダで .\deploy.ps1 を実行するだけで同じデプロイが可能です。スクリプト先頭の「設定」でリージョン・サービス名・--allow-unauthenticated、メモリ・CPU・最小/最大インスタンス・タイムアウト・同時実行数を指定できます。

PowerShell で設定を細かくいじりたい方向けのデプロイ自動化スクリプトです。

cloudrun_hello 用 deploy.ps1(個人利用・最小構成の例)

スクリプト全文を表示
# Cloud Run デプロイ用 PowerShell スクリプト(cloudrun_hello)
# 使い方: このフォルダで .\deploy.ps1 を実行。事前に gcloud 認証済みであること。
# デフォルトは「個人利用・最小構成」(たまにしかアクセスしない・節約向け)です。

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
if ($Host.UI.RawUI) { chcp 65001 | Out-Null }

# ========== 設定(個人利用・最小構成=節約向け) ==========
$Region                 = "asia-northeast1"   # リージョン(東京)
$ServiceName            = "cloudrun-hello"   # サービス名
$Project                = ""                 # 空なら gcloud のデフォルトプロジェクトを使用

# 未認証アクセスを許可するか(自分だけ使うなら true で URL を開ける)
$AllowUnauthenticated   = $true

# リソース・スケーリング(たまにしかアクセスしない=スケールゼロ・最大1で十分)
$Memory                 = "512Mi"            # デフォルトの最小(節約)
$Cpu                    = ""                 # 空でメモリ連動(512Mi なら 1 vCPU 未満)
$MinInstances           = "0"                # 0=アクセスがなければインスタンスなし(課金ほぼ発生しない)
$MaxInstances           = "1"                # 自分用なら 1 で十分
$Timeout                = "300"               # 5 分(デフォルト)
$Concurrency            = "80"               # デフォルトのまま(1 人なら問題なし)

# ========== ここより下は通常そのままでよい ==========
$ErrorActionPreference  = "Stop"
$scriptDir              = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $scriptDir

$gcloudArgs = @(
    "run", "deploy", $ServiceName,
    "--source", ".",
    "--region", $Region
)
if ($Project)            { $gcloudArgs += "--project"; $gcloudArgs += $Project }
if ($AllowUnauthenticated) { $gcloudArgs += "--allow-unauthenticated" } else { $gcloudArgs += "--no-allow-unauthenticated" }
if ($Memory)             { $gcloudArgs += "--memory"; $gcloudArgs += $Memory }
if ($Cpu)                { $gcloudArgs += "--cpu"; $gcloudArgs += $Cpu }
if ($MinInstances -ne "") { $gcloudArgs += "--min-instances"; $gcloudArgs += $MinInstances }
if ($MaxInstances)       { $gcloudArgs += "--max-instances"; $gcloudArgs += $MaxInstances }
if ($Timeout)            { $gcloudArgs += "--timeout"; $gcloudArgs += $Timeout }
if ($Concurrency)        { $gcloudArgs += "--concurrency"; $gcloudArgs += $Concurrency }

Write-Host "Deploying to Cloud Run: $ServiceName (region: $Region)" -ForegroundColor Cyan
& gcloud @gcloudArgs

4. デプロイコマンドを実行する

コマンドを直接打つ場合は、次を実行します。

gcloud run deploy cloudrun-hello --source . --region asia-northeast1

オプション:cloudrun-hello=サービス名、--source .=カレントをソース、--region asia-northeast1=東京。初回に Allow unauthenticated invocations (y/N)? と聞かれたら y でログインなしで URL にアクセス可能、n は認証付きのみ。

実行後は「設定検証 → ソースアップロード → Cloud Build でビルド → リビジョン作成 → トラフィック割当 → IAM」の流れで進み、最後に Service URL が表示されます。その URL をブラウザで開くとアプリが表示されます。

gcloud run deploy を実行し、Allow unauthenticated に y で応答してデプロイが完了し、Service URL が表示されたターミナル画面。
図1:gcloud run deploy の実行結果(cloudrun-hello デプロイ完了・Service URL 表示)

実行例(プロジェクトID・プロジェクト番号は伏せています)

PS …> gcloud auth application-default login
Your browser has been opened to visit: …
Credentials saved to file: […\application_default_credentials.json]
Quota project "********" was added to ADC …

PS …> cd '…\brief029\cloudrun_hello'
PS …\cloudrun_hello> gcloud run deploy cloudrun-hello --source . --region asia-northeast1
Allow unauthenticated invocations to [cloudrun-hello] (y/N)?  y

Building using Dockerfile and deploying container to Cloud Run service [cloudrun-hello] in project [********] region [asia-northeast1]
✓ Building and deploying new service... Done.
  ✓ Validating configuration...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds; region=asia-northeast1/…?project=********].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [cloudrun-hello] revision [cloudrun-hello-00001-cwp] has been deployed and is serving 100 percent of traffic.
Service URL: https://cloudrun-hello-********.asia-northeast1.run.app

表示された Service URL をブラウザで開くと、デプロイしたアプリの画面が表示されます。

デプロイ後に Service URL(cloudrun-hello-********.asia-northeast1.run.app)にアクセスし、HELLO, WORLD が表示されたブラウザ画面。
図2:デプロイ後、指定された URL にアクセスした表示(cloudrun_hello)

以上で cloudrun_hello のデプロイは完了です。

cloudrun_ask をデプロイする(環境変数が必要)

cloudrun_askGoogle AI Studio で取得した Gemini API キーを環境変数 GEMINI_API_KEY で読みます(main.py 内の os.environ.get("GEMINI_API_KEY", ""))。デプロイ時にこの環境変数を渡します。

Cloud Run では gcloud run deploy--set-env-vars で環境変数を指定できます(公式:環境変数の設定)。cloudrun_ask フォルダに移動してから、環境変数付きでデプロイします。

1. cloudrun_ask フォルダに移動する

cd "…\brief029\cloudrun_ask"

2. 環境変数付きでデプロイする

cloudrun_ask にも deploy.ps1 があります。環境変数 GEMINI_API_KEY を設定するか、スクリプト内の $GeminiApiKey にキーを入れて .\deploy.ps1 を実行。コマンドで直接やる場合は次に --set-env-vars GEMINI_API_KEY=取得したAPIキー を付けます(キーは実際の文字列に置き換えてください)。

PowerShell で設定を細かくいじりたい方向け(環境変数 GEMINI_API_KEY 対応)。

cloudrun_ask 用 deploy.ps1(個人利用・最小構成の例・GEMINI_API_KEY 必要)

スクリプト全文を表示
# Cloud Run デプロイ用 PowerShell スクリプト(cloudrun_ask)
# 使い方: このフォルダで .\deploy.ps1 を実行。事前に gcloud 認証済みであること。
# GEMINI_API_KEY は環境変数に設定するか、下の $GeminiApiKey に設定してください。
# デフォルトは「個人利用・最小構成」(たまにしかアクセスしない・節約向け)です。

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
if ($Host.UI.RawUI) { chcp 65001 | Out-Null }

# ========== 設定(個人利用・最小構成=節約向け) ==========
$Region                 = "asia-northeast1"   # リージョン(東京)
$ServiceName            = "cloudrun-ask"    # サービス名
$Project                = ""                 # 空なら gcloud のデフォルトプロジェクトを使用

# API キー: 環境変数 GEMINI_API_KEY が優先。未設定ならここに書く(空ならエラー)
$GeminiApiKey           = ""

# 未認証アクセスを許可するか(自分だけ使うなら true で URL を開ける)
$AllowUnauthenticated   = $true

# リソース・スケーリング(たまにしかアクセスしない=スケールゼロ・最大1で十分)
$Memory                 = "512Mi"            # デフォルトの最小(節約)
$Cpu                    = ""                 # 空でメモリ連動
$MinInstances           = "0"                # 0=アクセスがなければインスタンスなし(課金ほぼ発生しない)
$MaxInstances           = "1"                # 自分用なら 1 で十分
$Timeout                = "300"               # 5 分(デフォルト)
$Concurrency            = "80"               # デフォルトのまま(1 人なら問題なし)

# ========== ここより下は通常そのままでよい ==========
$ErrorActionPreference  = "Stop"
$scriptDir              = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $scriptDir

if (-not $GeminiApiKey) { $GeminiApiKey = $env:GEMINI_API_KEY }
if (-not $GeminiApiKey) {
    Write-Host "Error: GEMINI_API_KEY が未設定です。環境変数に設定するか、スクリプト内の $GeminiApiKey を設定してください。" -ForegroundColor Red
    exit 1
}

$gcloudArgs = @(
    "run", "deploy", $ServiceName,
    "--source", ".",
    "--region", $Region,
    "--set-env-vars", "GEMINI_API_KEY=$GeminiApiKey"
)
if ($Project)            { $gcloudArgs += "--project"; $gcloudArgs += $Project }
if ($AllowUnauthenticated) { $gcloudArgs += "--allow-unauthenticated" } else { $gcloudArgs += "--no-allow-unauthenticated" }
if ($Memory)             { $gcloudArgs += "--memory"; $gcloudArgs += $Memory }
if ($Cpu)                { $gcloudArgs += "--cpu"; $gcloudArgs += $Cpu }
if ($MinInstances -ne "") { $gcloudArgs += "--min-instances"; $gcloudArgs += $MinInstances }
if ($MaxInstances)       { $gcloudArgs += "--max-instances"; $gcloudArgs += $MaxInstances }
if ($Timeout)            { $gcloudArgs += "--timeout"; $gcloudArgs += $Timeout }
if ($Concurrency)        { $gcloudArgs += "--concurrency"; $gcloudArgs += $Concurrency }

Write-Host "Deploying to Cloud Run: $ServiceName (region: $Region)" -ForegroundColor Cyan
& gcloud @gcloudArgs
gcloud run deploy cloudrun-ask --source . --region asia-northeast1 --allow-unauthenticated --set-env-vars GEMINI_API_KEY=取得したAPIキー

注意:API キーをコマンドに直書きするとシェル履歴に残ります。本番では Secret Manager で環境変数に渡す方法を推奨(--set-env-vars は手軽に試す用)。

実行例(API キー・プロジェクトID等は伏せています)

PS …\cloudrun_ask> gcloud run deploy cloudrun-ask --source . --region asia-northeast1 --allow-unauthenticated --set-env-vars GEMINI_API_KEY=********
Building using Dockerfile and deploying container to Cloud Run service [cloudrun-ask] in project [********] region [asia-northeast1]
✓ Building and deploying new service... Done.
  ✓ Validating configuration...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds; region=asia-northeast1/…?project=********].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [cloudrun-ask] revision [cloudrun-ask-00001-5bf] has been deployed and is serving 100 percent of traffic.
Service URL: https://cloudrun-ask-********.asia-northeast1.run.app

デプロイ後、表示された Service URL にアクセスし、質問を送信すると Cloud Run 上のアプリが Gemini API を呼び出し、LLM の応答が表示されます。

cloudrun_ask の Service URL にアクセスし、「卵と豚肉の料理のレシピおしえて」と質問して Gemini(LLM)がレシピを返している画面。
図3:デプロイ後の cloudrun_ask。質問を送ると LLM(Gemini API)が応答している実行画面。

以上で、環境変数(GEMINI_API_KEY)を渡してデプロイし、API を叩いて動作するパターンも確認できました。

デプロイ後、Cloud Run コンソールでサービスを開き、「ソース」タブを選ぶと、アップロードした main.pyDockerfile などが保存されていることを確認できます。

Cloud Run コンソールのサービスの詳細画面。ソースタブで main.py や Dockerfile などが一覧表示され、main.py の内容がエディタに表示されている。
図4:デプロイ後、コンソールの「ソース」タブでソースが保存されていることを確認

デプロイしたサービスを削除する

不要になったサービスは次のいずれかで削除できます。

コマンド(gcloud)

gcloud run services delete サービス名 --region リージョン

例:gcloud run services delete cloudrun-hello --region asia-northeast1。確認で ycloudrun-ask も削除する場合はサービス名を cloudrun-ask に変えて実行。

コンソール:Cloud Run コンソールで対象サービスを選択 → 画面上部の「削除」。

デプロイ時に指定できる主なオプション

gcloud run deploy でメモリ・CPU・インスタンス数・タイムアウト・同時実行数を指定できます。以下は公式情報に基づくデフォルトと主なオプションです。

指定しなかったときのデフォルト

  • メモリ:サービス(リビジョン)512 MiB、関数 256 MiB(メモリ上限)。
  • CPU:メモリに連動。512 MiB のとき 1 vCPU 未満。最大 8 vCPU まで指定可能。
  • 最小インスタンス:0(スケールゼロ。コールドスタートあり)(最小インスタンス数)。
  • 最大インスタンス:上限なし(リージョンクォータまで)。--max-instances で制限可能。
  • リクエスト タイムアウト:5 分(300 秒)。最大 60 分(リクエスト タイムアウト)。
  • 同時実行数:1 インスタンスあたり80 リクエスト。1~1,000 で変更可(最大同時リクエスト数)。

指定例(gcloud

メモリ 1 GiB、最小 0・最大 10 インスタンス、タイムアウト 10 分でデプロイする場合:

gcloud run deploy サービス名 --source . --region asia-northeast1 --memory 1Gi --min-instances 0 --max-instances 10 --timeout 600

主なフラグ:--memory(512Mi, 1Gi など)、--cpu--min-instances / --max-instances--timeout(秒)、--concurrency。詳細は gcloud run deploy リファレンスを参照。

おわりに

gcloud の確認」と「ADC ログイン」のあと、デプロイするフォルダで gcloud run deploy サービス名 --source . --region リージョン を実行。cloudrun_hello はそのまま、cloudrun_ask--set-env-vars GEMINI_API_KEY=… で API キーを渡します。表示された Service URL で動作確認してください。

今回デプロイしているのは Cloud Run「サービス」(コンテナ)であり、「関数」ではありません。最小メモリは種類によって異なります。サービス(第2世代)のデフォルトは 512 MiB で、最小も 512 MiBです。一方、Cloud Run 関数はデフォルト 256 MiB で最小 128 MiB など別の値です(メモリ上限実行環境)。

何も指定しないと上記のサービス用デフォルト(512 MiB・同時実行 80)になります。個人利用なら、メモリは 512 MiB のまま(第2世代ではこれが最小)、--concurrency 20 に下げるなどでコストを抑えられます。載せた deploy.ps1 の設定を編集してから実行するのがおすすめです。

256 MiB などのより小さいメモリを使う場合は、第1世代の実行環境が必要です(実行環境)。必要に応じて deploy.ps1--memory--concurrency を調整してください。

📌 豆知識:なぜコンソールの初期メモリは 512 MiB なのか

Google Cloud コンソールで Cloud Run を新規作成すると、メモリは 128 / 256 / 512 MiB から選べますが、初期値は 512 MiBです。理由は、第2世代の実行環境では最小メモリが 512 MiBだから。実行環境を指定しないと Cloud Run が第2世代を選ぶことが多く、そのまま動くようにデフォルトが 512 になっています。128・256 を選べるのは第1世代を指定したとき(第1世代は最小 128 MiB)。実行環境メモリ上限参照。

Artist's Perspective

「ソースを書けば、あとは Google Cloud がうまいことやってくれる、という印象。すごい世のなかになりましたなぁ。環境構築にしろネットサービスにしろ、ローカルでやるのは正直めんどい。貧乏でくたびれたおっさんは、ローカルのスペックもポンコツだし、十数年前のパソコンで作業している。だからこそ、Google Cloud のなかで全部やってくれるのを見ると、なんじゃこりゃ~~~~、とありがたくなる。その「なんじゃこりゃ~~~~」を、全3回に分けてお伝えいたしました~~~。」

データソース・参考リンク

本記事は以下の情報源を参考にしています。内容の正確性については、必ず元のデータソースをご確認ください。