Terraform で Cloud Run (認証あり) と Cloud Scheduler のサービス間認証

概要

Scheduler と Cloud Run のサービス間認証を有効化し、Scheduler から認証付き Cloud Run を実行する。

Cloud Run はデフォルト非公開で、リクエストで認証情報を提供しないとサービスにアクセスできない。
全許可もできるが認証ありにしたほうがセキュア。

チュートリアル

Terraform 準備

terraform init まで行う。

認証あり Cloud Run 作成

デフォルトで非公開設定のため、シンプルに作成する。

vi cloudrun.tf
resource "google_cloud_run_service" "default" {
  name     = "cloudrun-srv"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "gcr.io/cloudrun/hello"
      }
    }
  }
}

output "url" {
    value = google_cloud_run_service.default.status[0].url
}

サービスアカウント作成

Cloud Run へのアクセス許可をもたせたサービスアカウントを作成する。

vi service_account.tf
resource "google_service_account" "run_invoker" {
  project      = var.project
  account_id   = "cloud-run-invoker-sa"
  display_name = "Cloud Run Invoker Service Account"
}

data "google_iam_policy" "admin" {
  binding {
    role = "roles/run.invoker"
    members = [
      "serviceAccount:${google_service_account.run_invoker.email}"
    ]
  }
}

resource "google_cloud_run_service_iam_policy" "policy" {
  location    = google_cloud_run_service.default.location
  project     = google_cloud_run_service.default.project
  service     = google_cloud_run_service.default.name

  policy_data = data.google_iam_policy.admin.policy_data
}

Cloud Scheduler 作成

service_account_email に上記のサービスアカウントを指定した Cloud Scheduler を作成する。

vi scheduler.tf
resource "google_cloud_scheduler_job" "job" {
  name             = "test-job"
  description      = "test http job"
  schedule         = "*/8 * * * *"
  time_zone        = "Asia/Tokyo"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 1
  }

  http_target {
    http_method = "GET"
    uri         = google_cloud_run_service.default.status[0].url
    #body        = base64encode("{\"foo\":\"bar\"}")

    oidc_token {
      service_account_email = google_service_account.run_invoker.email
    }
  }
}

デプロイ・確認

デプロイ。

terraform apply

Cloud Scheduler が作成された。

Cloud Scheduler の Auth ヘッダーに OICD トークンの設定がされている。

認証が必要な Cloud Run が作成された。

呼び出しに成功していることを確認。

まとめ

サービス間認証を利用し、認証ありの Cloud Run を Cloud Scheduler から呼び出すことができた。

コードは Github へまとめた。

GitHub - runble1/test_scheduler_cloudrun
Contribute to runble1/test_scheduler_cloudrun development by creating an account on GitHub.

エラー

Error creating service account: googleapi: Error 403: Identity and Access Management (IAM) API has not been used in project

IAM API を有効化してなかった。ENABLE で有効化。

The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.

Cloud Run サービス間認証の失敗。

Cloud Run 側のログにもステータスコード 403 が記録された。

以下のように失敗ステータスとなる。

自分の場合はサービスアカウントの権限が間違っていて呼び出しできていなかった。

参考

サービス間認証  |  Cloud Run のドキュメント  |  Google Cloud
Terraform Registry
Terraform Registry
Terraform Registry

コメント

タイトルとURLをコピーしました