Contents
1. 前提条件と環境設定
1‑1. 必要なツール
| ツール | 用途 |
|---|---|
| Google Cloud SDK(gcloud) | GCP のリソース作成・操作 |
| Go (≥ 1.22) | アプリケーションのビルド |
| Docker (任意) | Dockerfile をローカルでテストしたい場合 |
1‑2. Cloud SDK のインストール
|
1 2 3 |
curl https://sdk.cloud.google.com | bash exec -l $SHELL # シェルを再起動してパスを反映 |
ポイント:
gcloud initは実行しなくても構いませんが、初回はgcloud auth loginで認証情報を取得してください。
1‑3. 認証とプロジェクトの作成
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Google アカウントでログイン gcloud auth login gcloud auth application-default login # Cloud Build 等が利用するデフォルト認証 # プロジェクトを新規作成(Organization がある場合は --organization を付与) PROJECT_ID=my-go-run-demo ORG_ID=123456789012 # 組織 ID(存在しない場合は省略可) gcloud projects create $PROJECT_ID \ --name="Go Cloud Run Demo" \ ${ORG_ID:+--organization=$ORG_ID} |
※ Organization が必須の場合
---organization=ORG_IDを付与すると、組織配下にプロジェクトが作成されます。
- 組織が設定できない環境(個人アカウントやフォルダ単位で管理している場合)はオプションを省略してください。
続いて、作業対象のプロジェクトをデフォルトに設定します。
|
1 2 |
gcloud config set project $PROJECT_ID |
1‑4. 必要な API と課金の有効化
|
1 2 3 4 5 6 7 8 |
# Cloud Run, Artifact Registry, Cloud Build の API を有効化 gcloud services enable run.googleapis.com \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com # 課金アカウントをプロジェクトに紐付け(コンソール操作が推奨) # コンソール > 「課金」 > 対象プロジェクトへ割り当て |
1‑5. 最小権限の IAM ロール付与
|
1 2 3 4 5 6 7 8 9 10 11 12 |
ACCOUNT=$(gcloud config get-value core/account) # Cloud Run の管理者ロール gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="user:$ACCOUNT" \ --role="roles/run.admin" # Artifact Registry への書き込み権限 gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="user:$ACCOUNT" \ --role="roles/artifactregistry.writer" |
1‑6. Go 環境の確認
|
1 2 |
go version # 例: go1.22.0 linux/amd64 |
まとめ
上記手順で Cloud SDK・Go・GCP プロジェクト・必要 API が整い、以降はコード実装とデプロイに専念できます。
2. シンプルな Go Web アプリの実装とローカルテスト
2‑1. コード例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// main.go package main import ( "fmt" "log" "net/http" "os" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, Cloud Run!") } func main() { port := os.Getenv("PORT") if port == "" { // ローカル実行時のデフォルト port = "8080" } http.HandleFunc("/", handler) log.Printf("Listening on :%s", port) if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatalf("Server failed: %v", err) } } |
2‑2. ビルドとローカル実行
|
1 2 3 4 5 6 7 |
# モジュール初期化(リポジトリ名は任意) go mod init github.com/yourname/go-cloudrun-demo # バイナリをビルドして起動 go build -o server . ./server # または go run main.go |
|
1 2 3 4 |
# 動作確認(別ターミナルで実行) curl http://localhost:8080 # => Hello, Cloud Run! |
ポイント
-os.Getenv("PORT")が空の場合に 8080 をフォールバックさせることで、Cloud Run の自動ポート割り当てとローカルテストの両方に対応できます。
3. コンテナイメージの作成と Artifact Registry へのプッシュ
3‑1. Artifact Registry リポジトリの作成
|
1 2 3 4 5 |
gcloud artifacts repositories create go-repo \ --repository-format=docker \ --location=asia-northeast1 \ --description="Docker images for Go Cloud Run demo" |
IAM の付与(ビルダーがイメージを書き込めるように)
bash
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$(gcloud config get-value account)" \
--role="roles/artifactregistry.writer"
3‑2. Dockerfile(マルチステージビルド)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ---------- Builder ---------- FROM golang:1.22 AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o server . # ---------- Runtime ---------- FROM gcr.io/distroless/base-debian11 COPY --from=builder /app/server /server EXPOSE 8080 ENTRYPOINT ["/server"] |
3‑3. Cloud Build でイメージをビルド & プッシュ
|
1 2 3 |
gcloud builds submit . \ --tag=asia-northeast1-docker.pkg.dev/$PROJECT_ID/go-repo/go-app:$SHORT_SHA |
--tagの形式は Artifact Registry のリポジトリ URL(asia-northeast1-docker.pkg.dev)に続けてPROJECT_ID/REPO/IMAGE:TAGとします。$SHORT_SHAは Cloud Build が自動で設定する Git コミットの短縮ハッシュです。
Buildpacks を使う場合(Dockerfile 不要)
bash
gcloud builds submit \
--pack-image=gcr.io/buildpacks/builder:v1 \
--tag=asia-northeast1-docker.pkg.dev/$PROJECT_ID/go-repo/go-app:latest
4. Cloud Run へのデプロイと動作確認
4‑1. デプロイコマンド
|
1 2 3 4 5 6 7 8 |
gcloud run deploy go-cloudrun-demo \ --image=asia-northeast1-docker.pkg.dev/$PROJECT_ID/go-repo/go-app:$SHORT_SHA \ --region=asia-northeast1 \ --platform=managed \ --allow-unauthenticated \ --port=8080 \ --quiet |
| オプション | 説明 |
|---|---|
--image |
Artifact Registry に保存したコンテナイメージのフルパス |
--region |
デプロイ先リージョン(東京は asia-northeast1 が最も近い) |
--platform=managed |
フルマネージド Cloud Run を使用 |
--allow-unauthenticated |
認証なしで全員がアクセスできるように設定 |
--port |
コンテナがリッスンするポート(コード側と合わせて 8080) |
Organization が関係する場合
プロジェクト作成時に組織を指定したなら、デプロイ実行ユーザーの IAM にroles/run.adminとroles/artifactregistry.readerが付与されているか確認してください。
4‑2. デプロイ完了後の URL 取得
|
1 2 3 4 5 |
SERVICE_URL=$(gcloud run services describe go-cloudrun-demo \ --region=asia-northeast1 \ --format='value(status.url)') echo $SERVICE_URL # 例: https://go-cloudrun-demo-abcdefg-uc.a.run.app |
4‑3. 動作確認
|
1 2 3 |
curl $SERVICE_URL # => Hello, Cloud Run! |
よくあるエラーと対策
| エラーメッセージ | 主な原因 | 推奨対処 |
|---|---|---|
Port not allowed |
コンテナが $PORT 以外でリッスンしている |
アプリ側で os.Getenv("PORT") を必ず使用 |
Permission denied (serviceAccount) |
デプロイ用サービスアカウントに Artifact Registry の read 権限がない | roles/artifactregistry.reader を付与 |
Health check failed |
ヘルスチェックのパスが / 以外になっている |
--health-check-path=/ オプションで明示 |
Invalid region |
指定リージョンが有効化されていない | gcloud run regions list で利用可能リージョンを確認 |
5. CI/CD パイプライン構築とベストプラクティス
5‑1. GitHub リポジトリとの連携
- Cloud Build の設定画面 → 「GitHub」タブ → 対象リポジトリを接続(OAuth 認可が必要)。
- トリガー作成コマンド:
|
1 2 3 4 5 6 7 |
gcloud beta builds triggers create github \ --name=go-run-ci \ --repo-name=go-cloudrun-demo \ --branch-pattern="^main$" \ --build-config=cloudbuild.yaml \ --service-account=cloudbuild-ci@$PROJECT_ID.iam.gserviceaccount.com |
5‑2. cloudbuild.yaml のサンプル
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
steps: # ---------- Docker イメージのビルド ---------- - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/go-repo/go-app:$SHORT_SHA', '.'] # ---------- Artifact Registry にプッシュ ---------- - name: 'gcr.io/cloud-builders/docker' args: ['push', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/go-repo/go-app:$SHORT_SHA'] # ---------- Cloud Run へデプロイ ---------- - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: gcloud args: - run - deploy - go-cloudrun-demo - --image=asia-northeast1-docker.pkg.dev/$PROJECT_ID/go-repo/go-app:$SHORT_SHA - --region=asia-northeast1 - --platform=managed - --allow-unauthenticated - --port=8080 - --quiet images: - 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/go-repo/go-app:$SHORT_SHA' |
5‑3. 最小権限サービスアカウントの作成とロール付与
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
gcloud iam service-accounts create cloudbuild-ci \ --display-name="Cloud Build CI Service Account" # Artifact Registry の書き込み権限 gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:cloudbuild-ci@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/artifactregistry.writer" # Cloud Run デプロイ権限 gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:cloudbuild-ci@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/run.admin" |
5‑4. コスト最適化とスケーリング設定
| 設定項目 | 推奨値・備考 |
|---|---|
| 無料枠活用 | Cloud Run の毎月 2 vCPU·1 GiB、Artifact Registry の 200 MiB は自動的に適用されます。 |
| 最大インスタンス数 | --max-instances=5(過剰スケール防止) |
| CPU スロットリング | --cpu-throttling=true(アイドル時の課金抑制) |
| リージョン選択 | 東京 (asia-northeast1) が最もレイテンシが低く、料金も安価です。 |
6. まとめ
- 環境構築
gcloudと Go をインストールし、Organization がある場合は--organizationオプションでプロジェクトを作成。-
必要 API と課金を有効化し、最小権限の IAM ロールを付与。
-
アプリ実装
-
PORT環境変数からポート番号を取得するだけのシンプルなハンドラでローカルテストが完了すれば、Cloud Run でもそのまま動作します。 -
コンテナ化 & Registry
-
マルチステージ Dockerfile または Buildpacks を用いてイメージをビルドし、
gcloud builds submitで Artifact Registry にプッシュ。 -
デプロイ
-
gcloud run deployに必要オプション(リージョン・イメージ・ポート・認証設定)を全て明示すれば数分で公開 URL が取得できます。 -
CI/CD
- GitHub → Cloud Build のトリガーでコード変更時に自動ビルド・デプロイが走るパイプラインを構築し、最小権限のサービスアカウントで安全かつ低コストに運用できます。
以上の手順を踏めば、Go アプリケーションを Cloud Run にシームレスにデプロイでき、継続的なリリースも自動化可能です。ぜひご自身のプロジェクトでも試してみてください。
参考リンク
-
公式クイックスタート(Go)
https://cloud.google.com/run/docs/quickstarts/build-and-deploy/deploy-go-service?hl=ja -
Cloud Build の詳細: https://cloud.google.com/build/docs
- Artifact Registry の概要: https://cloud.google.com/artifact-registry/docs