↓メインコンテンツへスキップ
  1. Blogs/

TerraformでCloud Run v2サービスを公開してみた

2 分
Terraform GoogleCloud
0222-nnn
著者
0222-nnn
猫が好き
目次
Terraform-GoogleCloud - この記事は連載の一部です
パート 7: この記事

概要
#

コンテナを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を作成します。

Terraform-GoogleCloud - この記事は連載の一部です
パート 7: この記事

関連記事

Terraform StateをCloud Storage Remote Backendへ移行してみた
2 分
Terraform GoogleCloud CloudStorage
TerraformからGoogle Cloudへ接続してProject情報を取得してみた
3 分
Terraform GoogleCloud
TerraformでArtifact RegistryのDocker Repositoryを作成してみた
2 分
Terraform GoogleCloud Docker
TerraformでArtifact RegistryのコンテナをCloud Runへデプロイしてみた
2 分
Terraform GoogleCloud CloudRun ArtifactRegistry
TerraformでBigQuery DatasetとTableを作成してみた
2 分
Terraform GoogleCloud
TerraformでCloud KMSのKeyRingとCryptoKeyを作成してみた
2 分
Terraform GoogleCloud