kakakakakku blog

Weekly Tech Blog: Keep Learning!

Cloud Run の Identity-Aware Proxy (IAP) 直接統合でお手軽にアクセスを制限する

はじめに

Google Cloud の Cloud Run で動かすアプリケーションへのアクセスを制限したいときに Identity-Aware Proxy (IAP) が使える.IAP を使うとアプリケーション側のコードを変更せずに Google アカウント認証を設定できる.

cloud.google.com

2026年3月のリリースで Cloud Run と Identity-Aware Proxy (IAP) を直接統合できるようになって使いやすくなった👏 アプリケーションロードバランサが不要になるぞ!

cloud.google.com

さっそく Terraform で試してみる \( 'ω')/

環境

  • Terraform 1.15.6
  • hashicorp/google 7.37.0

前提

詳細な手順は以下のドキュメントに書いてある.アクセス制限をする対象として3種類載っていて,よく使うのは Google Workspace の組織に限定するような仕組みだけど,今回は個人の Google アカウント1つに限定してアクセス制限をするような仕組みで構築する.あくまで検証として!

  • Inside the organization(組織内)
  • Outside the organization(組織外)
  • No organization(組織なし)

docs.cloud.google.com

事前準備として Google Cloud プロジェクトで OAuth 同意画面の設定と OAuth 2.0 クライアントを発行しておく.「承認済みのリダイレクト URI」はドキュメントを参考に https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect というフォーマットにする.

docs.cloud.google.com

Cloud Run

Cloud Run の実装はシンプルで google_cloud_run_v2_service に iap_enabled = true を追加すれば OK👌コンテナは何でもよくて cloud-run-hello を使っている.

resource "google_service_account" "cloud_run_iap" {
  account_id   = "cloud-run-iap-sa"
  display_name = "Cloud Run IAP Service Account"
}

resource "google_cloud_run_v2_service" "iap" {
  name     = "sandbox-iap"
  location = "asia-northeast1"
  ingress  = "INGRESS_TRAFFIC_ALL"

  iap_enabled = true

  template {
    service_account = google_service_account.cloud_run_iap.email

    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"

      ports {
        container_port = 8080
      }
    }
  }
}

Identity and Access Management (IAM)

まずは google_cloud_run_v2_service_iam_member を使って IAP サービスエージェントに roles/run.invoker を割り当てる.サービスアカウントはドキュメントに serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com と書いてあった.

さらに google_iap_web_cloud_run_service_iam_member を使って IAP 経由で Cloud Run にアクセスする個人の Google アカウントに対して roles/iap.httpsResourceAccessor を割り当てる.

data "google_project" "current" {}

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

resource "google_iap_web_cloud_run_service_iam_member" "user" {
  project                = data.google_project.current.project_id
  location               = google_cloud_run_v2_service.iap.location
  cloud_run_service_name = google_cloud_run_v2_service.iap.name
  role                   = "roles/iap.httpsResourceAccessor"
  member                 = "user:y.yoshida22@gmail.com"
}

IAP 側でカスタム OAuth を設定する

最後に IAP 側で「カスタム OAuth(特定の制御、ブランディング、外部ユーザー用)」を選択して「カスタム クライアント ID とシークレット」を設定すれば OK👌

動作確認

Cloud Run の URL にアクセスすると Google のログイン画面にリダイレクトされた.

個人の Google アカウントでログインすると期待通りにアプリケーションにアクセスできた❗️

また検証用で契約している Google Workspace の Google アカウントでログインすると今度は You don't have access というエラーになって同じく期待通りだった \( 'ω')/

まとめ

Cloud Run と Identity-Aware Proxy (IAP) を直接統合できるようになって便利👏 最近よく Cloud Run + Identity-Aware Proxy (IAP) という組み合わせを聞く気がする.

特に最近は Vibe Coding の普及もあって社内で使うアプリケーションを気軽に実装できるようになったけど,安全に社内に共有するにはどうしたら良いんだろう!?という相談が増えていると思う.今回紹介した Cloud Run + Identity-Aware Proxy (IAP) も使えるし,他にも AWS で Application Load Balancer (ALB) + Google Workspace や Cloudflare Access + Google Workspace も使える.

多くの選択肢を試しておきたいなーと思う💪

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com