概要 #
コンテナを1つ動かして公開するだけでも、Cloud RunコンソールではCPU/Memory、Scaling、Invoker権限など確認項目が複数に分かれます。全体像を一度に把握できません。
Terraformならこれらを一つの設定としてまとめて確認できる構成です。ここではCloud Run v2サービスを作成し、Googleが公開しているHelloコンテナをデプロイします。学習用として未認証アクセスを許可し、curlでHTTP応答を確認します。
Terraformの基本操作は前提としています。Cloud Runが初めての方向けです。
自前のコンテナイメージやArtifact Registryとの連携、認証必須のInvoker設定は扱いません。これらはシリーズ後半のAdvanced編で扱います。
検証すること #
- Cloud Run v2サービスを作成する
- CPU・MemoryとScaling範囲を設定する
allUsersへInvoker Roleを付与する- Service URIへHTTPアクセスする
前提環境 #
- Google Cloud CLIとApplication Default Credentials(ADC)
- Terraform 1.5以降
- Billingが有効な検証用Google Cloud Project
- Cloud Run APIとIAMを操作できるGoogleアカウント
- 検証時のバージョン:Terraform 1.14.3、google 7.43.0
今回の構成 #
Cloud RunはVPCの中ではなく、Google管理のサーバーレス基盤で動きます。VMのようにSubnetへ配置するわけではありません。
flowchart TB
Client["インターネット
curl / Browser"]
subgraph GCP["Google Cloud"]
Img["Container Image
us-docker.pkg.dev/cloudrun/container/hello"]
subgraph Project["Project"]
IAM["IAM Policy
allUsers → roles/run.invoker"]
subgraph Region["asia-northeast1"]
Run["Cloud Run v2 Service
tf-example-hello
cpu 1 / memory 512Mi"]
end
end
end
Client -->|"HTTPS(*.a.run.app)"| Run
IAM -.->|"呼び出しを許可"| Run
Img -.->|"起動時に取得"| Run
実線が通信、点線が権限と参照の関係です。URLはGoogleが払い出すため、ロードバランサーやIPアドレスを用意する必要はありません。
呼び出したときの流れは次のとおりです。
sequenceDiagram
actor Client as curl / Browser
participant Run as Cloud Run v2 Service
participant IAM as IAM (run.invoker)
participant Img as Container Image
Client->>Run: HTTPS GET (公開URL)
Run->>IAM: 呼び出し権限を確認
Note over Run,IAM: allUsers に roles/run.invoker
IAM-->>Run: 許可
Run->>Img: コンテナを起動(初回のみ)
Run-->>Client: HTTP 200 + HTML
使用するTerraformコード #
今回重要なTerraformコード #
Cloud RunとIAM APIをfor_eachで有効化します。その後、Cloud Run v2サービスを作成します。
resource "google_cloud_run_v2_service" "hello" {
name = var.service_name
location = var.region
ingress = "INGRESS_TRAFFIC_ALL"
deletion_protection = false
template {
containers {
image = var.container_image
resources {
limits = {
cpu = "1"
memory = "512Mi"
}
}
}
scaling {
min_instance_count = 0
max_instance_count = 2
}
}
}
min_instance_count = 0なので、リクエストがないときはInstanceを0まで縮退できます。検証時の急な増加を抑えるため最大数は2です。
公開アクセスは条件付きResourceで設定します。
resource "google_cloud_run_v2_service_iam_member" "public" {
count = var.allow_unauthenticated ? 1 : 0
project = google_cloud_run_v2_service.hello.project
location = google_cloud_run_v2_service.hello.location
name = google_cloud_run_v2_service.hello.name
role = "roles/run.invoker"
member = "allUsers"
}
allow_unauthenticated = falseなら、このPublic IAM Memberは作成されません。公開が不要なサービスではfalseを使用します。
設定と実行 #
cd Basic-Examples/06-cloud-run
cp terraform.tfvars.example terraform.tfvars
project_id = "your-project-id"
region = "asia-northeast1"
allow_unauthenticated = true
terraform init
terraform fmt -check
terraform validate
terraform plan
terraform apply
applyが完了すると、公開URLがOutputに表示されます。
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
Outputs:
location = "asia-northeast1"
service_name = "tf-example-hello"
uri = "https://tf-example-hello-xxxxxxxxxx-an.a.run.app"
HTTP応答を確認する #
まずServiceの設定を確認します。
gcloud run services describe "$(terraform output -raw service_name)" \
--region="$(terraform output -raw location)" \
--project=YOUR_PROJECT_ID
spec:
template:
spec:
containers:
- image: us-docker.pkg.dev/cloudrun/container/hello
resources:
limits:
cpu: '1'
memory: 512Mi
status:
url: https://tf-example-hello-xxxxxxxxxx-an.a.run.app
URLへリクエストします。
curl -sS "$(terraform output -raw uri)"
<!doctype html>
<html lang=en>
<head>
HelloコンテナのHTMLが返れば完了です。手元では200が0.36秒で返りました。初回はコンテナの起動を含むため、これより時間がかかることがあります。
非公開にした場合は、認証Tokenを付けるか権限のあるIdentityからアクセスします。
後片付けと注意点 #
terraform destroy
Cloud Runはリクエストや使用Resourceに応じて課金されます。allUsersへのInvoker付与は誰でも呼び出せる設定なので、本番では認証、Ingress、Runtime Service Accountを要件に合わせて設計します。
まとめ #
- Cloud Run v2をTerraformでデプロイできる
- CPU・MemoryとInstance数を制限できる
- IAM Memberの有無で公開・非公開を切り替えられる
- OutputのURIへ
curlして動作確認できる
参考資料 #
次回 #
次はTerraformでGKE Standard ClusterとSpot Node Poolを作成します。