🥽

【GCP】Cloud Run 入門ハンズオン:Python アプリをデプロイするまで (Windows/PowerShell編)

に公開

【GCP】Cloud Run 入門ハンズオン:Python アプリをデプロイするまで (Windows/PowerShell編)

コンテナ化されたアプリケーションをサーバーレスで実行できる Google Cloud Run。
今回は、Python (Flask) で作成した簡単な Web アプリを、Docker イメージとしてビルドし、Cloud Run にデプロイするまでの手順をまとめました。

1. 初期設定と API の有効化

まず、必要な環境変数を設定し、API を有効化します。
Linux 系の export コマンドとは異なり、PowerShell では $変数名 = "値" の形式を使用します。

# 環境変数の設定
$REGION = "asia-northeast1"
$PROJECT_ID = gcloud config get-value project

# 必要な API の有効化
gcloud services enable run.googleapis.com `
    cloudbuild.googleapis.com `
    artifactregistry.googleapis.com

2. アプリケーションの作成

作業用ディレクトリを作成し、以下の2つのファイルを作成します。

main.py (Flask アプリ本体)

環境変数 NAME を読み込んで挨拶するシンプルなアプリです。

main.py
import os
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    name = os.environ.get("NAME", "World")
    return "Hello {} from Cloud Run!".format(name)

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

Dockerfile

Python の軽量イメージを使用します。

Dockerfile
FROM python:3.9-slim

WORKDIR /app
RUN pip install Flask gunicorn
COPY . .

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

3. Artifact Registry (コンテナ置き場) の作成

作成したコンテナイメージを保存するためのリポジトリを作成します。

gcloud artifacts repositories create my-repo `
    --repository-format=docker `
    --location=$REGION `
    --description="Cloud Run Tutorial Repository"

4. 【重要】権限設定 (ハマりポイント)

ここが最大の難関です。Cloud Build を実行するデフォルトのサービスアカウントに対し、Storage へのアクセス権やArtifact Registry への書き込み権限が不足していると、ビルド時にエラーが発生します。

発生するエラーログの例

権限がない状態でビルドすると、以下のようなエラーが発生します。
ERROR: (gcloud.builds.submit) INVALID_ARGUMENT: could not resolve source: googleapi: Error 403: ... does not have storage.objects.get access

# デフォルトの Compute Engine サービスアカウントを取得
$PROJECT_NUMBER = gcloud projects describe $PROJECT_ID --format="value(projectNumber)"
$SERVICE_ACCOUNT = "${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"

# Storage 管理者権限 (ソースコードの読み取りに必要)
gcloud projects add-iam-policy-binding $PROJECT_ID `
    --member="serviceAccount:${SERVICE_ACCOUNT}" `
    --role="roles/storage.admin"

# Artifact Registry 書き込み権限 (ビルド成果物の保存に必要)
gcloud projects add-iam-policy-binding $PROJECT_ID `
    --member="serviceAccount:${SERVICE_ACCOUNT}" `
    --role="roles/artifactregistry.writer"

# ログ書き込み権限 (ログ出力に必要)
gcloud projects add-iam-policy-binding $PROJECT_ID `
    --member="serviceAccount:${SERVICE_ACCOUNT}" `
    --role="roles/logging.logWriter"

※ 権限付与後、反映されるまで 1〜2分待つ ことをおすすめします。

5. ビルドとプッシュ (Cloud Build)

Google Cloud 上でコンテナをビルドし、Artifact Registry に保存します。

gcloud builds submit --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/my-repo/helloworld

SUCCESS と表示されればビルド完了です。

6. Cloud Run へデプロイ

いよいよサービスを公開します。
--allow-unauthenticated オプションを付けることで、認証なしで外部からアクセスできるようにします。

gcloud run deploy helloworld-service `
    --image ${REGION}-docker.pkg.dev/${PROJECT_ID}/my-repo/helloworld `
    --region $REGION `
    --allow-unauthenticated

デプロイが完了すると、コンソールに Service URL が表示されます。その URL にアクセスし、"Hello World from Cloud Run!" と表示されれば成功です!

7. 後片付け (リソースの削除)

課金を防ぐため、検証が終わったらリソースを削除します。

# サービスの削除
gcloud run services delete helloworld-service --region $REGION

# リポジトリの削除 (イメージごと削除されます)
gcloud artifacts repositories delete my-repo --location $REGION

まとめ

Windows 環境から Cloud Run を触ってみました。
特に権限周りのエラー(IAM Policy Binding)は、公式ドキュメントだけを追っていると見落としがちなポイントでした。一度環境を作ってしまえば、あとはコードを書いてデプロイするだけで自動スケーリングされる Cloud Run の便利さを実感できます。

Discussion