概要
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
コメント