1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Google Cloud】Cloud Run Composeでデモ環境を構築する

Last updated at Posted at 2025-12-13

この記事は、TVer Advent Calendar 2025の14日目の記事です。

概要

この記事では、Docker Composeファイルを使用してCloud Runにデプロイする機能(以下、Cloud Run Compose)を利用してデモ環境を構築する手順に記載します。
デプロイするアプリケーションとして、Lightdashを例として紹介します。

Cloud Run Composeについては、公式ドキュメントを参考にしています。

注意

この記事を執筆時点(2025.12.09)でCloud Run Composeを使ったデプロイはプレビュー機能となります。

Composeファイルでのデプロイは本番環境での利用を想定していません。
公式ドキュメントにも以下のように記載されています。

本番環境向けの包括的な infrastructure-as-code 戦略の代わりにはなりません

今回の記事では、開発環境・検証環境として、社内外のメンバーが実際にアクセスできる環境を提供するというニュアンスで「デモ環境」としています。
この記事でのデモ環境の構築は、Webでアクセスできるまでをゴールとし、データの永続化などはスコープ外としています。

Cloud Runでデモ環境を作るメリット

Cloud Runを利用するメリットとしては、以下があります。

  • コスト効率が良い
    • 恒常的なVMやDBを構築するのと比較し費用面でコストが低くなる
    • ゼロスケールにより利用していない間の料金を削減できる
  • セキュリティと管理工数の削減
    • IAP のような既存の認証の仕組みを使ったアクセス制御に対応している
    • デフォルト設定においてHTTPS接続できるエンドポイントとなるため管理が楽

そして、Cloud Run Composeを使うことで、ローカルの開発環境と同じようにデプロイができるというメリットがあります。

準備:Cloud Runの構築

まずはCloud Run servicesの構築をします。
構築例として、Terraformのコードを記載します。

< >の部分は適宜環境に合わせて変更してください。また、providerやbackendの設定も省略しています。

resource "google_cloud_run_v2_service" "main" {
  provider = google-beta
  project  = <your project id>

  name     = <your cloud run name>
  location = "asia-northeast1"
  ingress  = "INGRESS_TRAFFIC_ALL"

  # IAP による認証を有効化します。
  iap_enabled = true
  # LBなしでの IAP の認証はベータ機能のため以下の指定がないとエラーとなります。
  launch_stage = "BETA"
  ## 注意
  # 上記のIAP認証は組織に所属しているプロジェクトでしか有効化できません。

  # 検証目的のため、削除保護は無効化します。
  deletion_protection = false
  
  template {
    service_account = google_service_account.main.email

    containers {
      name = var.prefix
      # コンテナイメージの更新は Terraform で管理しない
      image   = "us-docker.pkg.dev/cloudrun/container/hello"
      args    = []
      command = []

      ports {
        name           = "http1"
        container_port = "8080"
      }

      # デプロイするアプリケーションによってリソースは変更する
      resources {
        limits = {
          cpu    = "1"
          memory = "1Gi"
        }
      }
    }

    # レイテンシーは気にせず、コストを抑えたいのでインスタンス数は0~1
    scaling {
      min_instance_count = "0"
      max_instance_count = "1"
    }

    execution_environment = "EXECUTION_ENVIRONMENT_GEN2"
    timeout               = "600s"
  }

  traffic {
    type    = "TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST"
    percent = 100
  }

  lifecycle {
    ignore_changes = [
      client,
      client_version,
      template[0].containers[0].image,
    ]
  }
}

# Cloud Run services 用のサービスアカウント
# Cloud Run から外部のサービスを利用する想定はないため、特に権限の付与はしていません。
resource "google_service_account" "main" {
  project = <your project id>

  account_id   = <your service account id>
  display_name = <your service account display name>

  description = "Service Account for Cloud Run Service in demo environment"
}

Identity-Aware Proxy (IAP)による認証によってGoogleアカウント・グループでのアクセス制御を設定しています。

IAPはフルマネージドのリバースプロキシであり、設定することでアプリケーション側の実装をせずにGoogleアカウントを使った認証機能を設定することができます。
詳しくは以下をご参照ください。

注意点として、コード中のコメントに記載している通りiap_enabled = trueの設定は、組織に所属するプロジェクトでなければ有効化できません。
Cloud Runに直接IAP認証を付ける機能は2025.12現在ベータ機能となります。
もし、組織管理のプロジェクト以外でIAP認証をかけたい場合は、別途Google Cloud Load Balancingを構築し、そちらにIAPの設定をしましょう。

IAP認証でアクセスを許可する場合は、以下の設定を適用します。

data "google_project" "project" {
  project_id = <your project id>
}

resource "google_cloud_run_v2_service_iam_member" "iap_invoker" {
  project  = google_cloud_run_v2_service.main.project
  location = google_cloud_run_v2_service.main.location
  name     = google_cloud_run_v2_service.main.name
  role     = "roles/run.invoker"
  member   = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-iap.iam.gserviceaccount.com"
}

locals {
  cloud_run_iap_access_members = [
    "user:example-user@example.com",
    "group:example-group@example.com",
  ]
}
resource "google_project_iam_member" "iap_https_resource_accessors" {
  for_each = toset(var.cloud_run_iap_access_members)

  project  = google_cloud_run_v2_service.main.project
  role    = "roles/iap.httpsResourceAccessor"
  member  = each.value
}

もし組織外にもユーザがいる場合は、以下のように権限設定することで一般公開を許可することができます。
ただし、デプロイするアプリケーションによっては一般公開がリスクになる可能性もあるため、設定は自己責任で判断してください。

resource "google_cloud_run_v2_service_iam_member" "public_access" {
  project  = google_cloud_run_v2_service.main.project
  location = google_cloud_run_v2_service.main.location
  name     = google_cloud_run_v2_service.main.name

  role   = "roles/run.invoker"
  member = "allUsers"
}

Cloud Run Composeでデプロイする

次に、本題となるComposeファイルを使ったデプロイをしていきます。

ここでは、BIツールのLightdashを例としてデモ環境を構築していきます。

方法はローカル環境のカレントディレクトリにcompose.yamlを準備し、gcloud beta run compose upコマンドを実行するだけです。

その際の注意点として、構築したCloud Runを対象にするため、Cloud Runの名前とカレントディレクトリ名を合わせておく必要があります。
Docker Composeのプロジェクト名がCloud Run名に割り当てられているようですが、docker composeコマンドのように--project-nameなどで明示することはできないようです。

compose.yamlは以下の公式サイトを参考に必要最低限の要素となるよう作成しました。

以下に作成したcompose.yamlを記載します。
ここまででdocker composeコマンドによりローカル環境下での起動できることまで確認しておきます。

パスワードについては簡略化のため、単純なものとし、ファイル中にそのまま記入していますが、本番環境では適切なシークレット管理を行ってください。
デモ環境においても、IAPなどの認証をかけずに構築する際は、外部からアクセス可能になるため推測されづらいパスワードで設定してください。

services:
  lightdash:
    platform: linux/amd64
    image: lightdash/lightdash:latest
    depends_on:
      - db
    environment:
      LIGHTDASH_SECRET: "dummy_secret_key"
      LIGHTDASH_LOG_LEVEL: debug
      PGHOST: db
      PGPORT: 5432
      PGUSER: lightdash
      PGPASSWORD: password
      PGDATABASE: lightdash
      SITE_URL: "http://0.0.0.0:8080"
    ports:
      - "8080:8080"

  db:
    image: postgres:15.4
    restart: always
    environment:
      POSTGRES_USER: lightdash
      POSTGRES_PASSWORD: password
      POSTGRES_DB: lightdash
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

Cloud Runへのデプロイは以下のコマンドで実施できます。

gcloud beta run compose up compose.yaml \
  --project=<your project id> --region=asia-northeast1

実行すると以下のようなエラーが表示されました。
どうやら、DBのportsも明示する必要があるみたいです。

ERROR: (gcloud.beta.run.compose.up) Error: failed to get container dependencies: container "lightdash" depends on container "db", but it has no ports defined

次に実行すると以下のようなエラーが表示されました。
文章を読むとPORTの設定のようですが、試行錯誤の末、volumesの設定が原因だと分かりました。
一旦、起動までを目標とするため、volumesは削除してデプロイします。

ERROR: (gcloud.beta.run.compose.up) The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable within the allocated timeout. This can happen when the container port is misconfigured or if the timeout is too short. The health check timeout can be extended. Logs for this revision might contain more information.

ちなみにvolumesは、サポートされている機能の中には記載はされていますが、完全にはサポートされていないようです。ドキュメントでは以下のような記載のため、書き方になにか工夫が必要なのかもしれません。

一部サポート対象。bind、volume、tmpfsマウントをCloud Runの同等のマウントに変換します。

ここまでで修正したcompose.yamlは以下のようになります。

services:
  lightdash:
    platform: linux/amd64
    image: lightdash/lightdash:latest
    depends_on:
      - db
    environment:
      LIGHTDASH_SECRET: "dummy_secret_key"
      LIGHTDASH_LOG_LEVEL: debug
      PGHOST: db
      PGPORT: 5432
      PGUSER: lightdash
      PGPASSWORD: password
      PGDATABASE: lightdash
      SITE_URL: "http://0.0.0.0:8080"
    ports:
      - "8080:8080"

  db:
    image: postgres:15.4
    restart: always
    environment:
      POSTGRES_USER: lightdash
      POSTGRES_PASSWORD: password
      POSTGRES_DB: lightdash
    # ローカルでは不要だが、ports を明記
    ports:
      - "5432:5432"
    # デプロイに失敗したのでコメントアウト
    # volumes:
    #   - db-data:/var/lib/postgresql/data

# volumes:
#   db-data:

デプロイ成功時は以下のように表示されます。
(表示されているURLは執筆時点ですでに無効になっています)

❯ gcloud beta run compose up compose.yaml --project=<your project id> --region=asia-northeast1
Deploying from Compose to Cloud Run...
Region set to asia-northeast1.You can change the region with gcloud config set run/region asia-northeast1.

✓ Setting up resources...                                                                           
Resource setup complete.                                                                            
Deploying service 'lightdash' in project '<your project id>' in region 'asia-northeast1'.
✓ Updating service 'lightdash'... Done.                                                             
  ✓ Creating Revision...                                                                            
  ✓ Routing traffic...                                                                              
Service 'lightdash' has been deployed.                                                              
Service URL: https://lightdash-rr3pgvewqq-an.a.run.app

Webブラウザからもアクセスできます。

スクリーンショット 2025-12-10 021036.png

まとめ

今回、Cloud Run Composeという新しい機能を使い、Lightdashを例にデモ環境の構築を試してみました。

実際に触ってみて、compose.yamlから直接デプロイできることの利便性を感じましたが、若干デプロイ用で調整が必要な部分もあり、どう使っていくかは検討の余地がありそうに感じました。

具体的には、デプロイ後にterraformでリソースの差分を確認すると、最大インスタンス数が10になっていたりとイメージ以外にも差が生じていました。
そのため、実際にterraformによるIaCと組み合わせて使う場合は、棲み分けを調整する必要があると感じました。

その他には、デプロイした際にout/lightdash-service.yamlというknativeのマニフェストファイルが生成される仕様になっていたため、このマニフェストをコード管理する方が今時点では自由度が高いようにも考えました。

まだプレビュー機能ですので今後に期待したいと思います。

以上、この記事が誰かの役に立ってくれれば幸いです。

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?