Google Cloud RunでIAM認証する

by
カテゴリ:

開発中のサービスをGoogle Cloud Runで検証するとき、IAM認証のしかたが分からなかったのでメモ。

コンソールやらコマンドやらグリグリするんしんどいなと思ったので、terraformでやってみた。

ざっくりこんな感じの流れでリソースは作れる。

# main.tf
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~>6.0"
    }
  }
}

provider "google" {
  project = "example" # TODO: リソースを作成するプロジェクトに変更
  region  = "asia-northeast1"
}

resource "google_cloud_run_v2_service" "httpbin_service" {
  name     = "httpbin-service"
  location = "asia-northeast1"

  template {
    containers {
      image = "kennethreitz/httpbin"
      ports {
        container_port = 80
      }
    }
  }
  traffic {
    type    = "TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST"
    percent = 100
  }
}

resource "google_cloud_run_v2_service_iam_member" "restricted_access" {
  project  = google_cloud_run_v2_service.httpbin_service.project
  location = google_cloud_run_v2_service.httpbin_service.location
  name     = google_cloud_run_v2_service.httpbin_service.name
  role     = "roles/run.invoker"
  # member   = "allUsers" # 公開する場合
  member = "user:[email protected]" # TODO: 許可したいユーザーのメールアドレスに変更
}

terraform applyする前に、outputs.tfを作成しておくと、terraform apply完了時に、サービスのURLが表示されるので便利。ただし、この時点でこのURLにアクセスしてもIAM認証がかかっているので403エラーが返ってくる。

# outputs.tf
output "httpbin_service_url" {
  value       = google_cloud_run_v2_service.httpbin_service.uri
  description = "The URL of the deployed httpbin service"
}

このあたりのtfファイルは、LLMに聞いたらサクっと書いてくれるけど、間違ってCloud Run Jobのリソースまで作ろうとしたりするので注意。あと、IAM認証を通してサービスにアクセスする方法は、正しく紹介してくれなかった。こういうときはドキュメントにあたるのが大事ですね。

デベロッパーの認証 https://cloud.google.com/run/docs/authenticating/developers?hl=ja

というわけで簡単にアクセスしたければ、以下を参考に、認証用のヘッダを追加するか、プロキシを立てると良いらしい。

ヘッダで解決するなら、CLIで以下のように書ける。

# URLは要変更
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  https://example.com/status/200

プロキシを立てる場合は以下を実行する。この時、追加プラグインが必要で、インストール許可を求められるので、Yを入力する。

gcloud run services proxy httpbin_service

すると、https://localhost:8080でアクセスできるようになる。

ホスト名が変わるのでCORSの設定は適宜変更する必要がある。

ENJOY!!

ちなみに、私の場合はnixを使ってgcloudコマンドをインストールしている都合上、追加プラグインをインタラクティブに導入できなかった。この問題については、nix式を書いてやればいいらしい。以下のようにgcloud.nixを作成してnix-env -iA packages -f gcloud.nixすればうまくいった。

# nix-env -iA packages -f gcloud.nix
{ pkgs ? import <nixpkgs> {} }:

let
  gdk = pkgs.google-cloud-sdk.withExtraComponents( with pkgs.google-cloud-sdk.components; [
    cloud-run-proxy
  ]);
in
{
  packages = [
    gdk
  ];
}

Nix Wikiに式を書けとはあるものの、書いたあとどうすればいいのかまで分からず詰まった。こういう時、LLMに聞いたらサクっと解決してくれてありがたい。

https://nixos.wiki/wiki/Google_Cloud_SDK