概要
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 が作成された。
![](https://storage.googleapis.com/stateless.yaruzo-eigo.com/2022/03/95f3bb4e-スクリーンショット-2022-03-24-9.43.42-1024x316.png)
Cloud Scheduler の Auth ヘッダーに OICD トークンの設定がされている。
![](https://storage.googleapis.com/stateless.yaruzo-eigo.com/2022/03/47205b5a-スクリーンショット-2022-03-24-10.15.34-1024x585.png)
認証が必要な Cloud Run が作成された。
![](https://storage.googleapis.com/stateless.yaruzo-eigo.com/2022/03/03bf8965-スクリーンショット-2022-03-24-9.43.12-1024x425.png)
呼び出しに成功していることを確認。
![](https://storage.googleapis.com/stateless.yaruzo-eigo.com/2022/03/c0072033-スクリーンショット-2022-03-24-9.44.44-1024x108.png)
まとめ
サービス間認証を利用し、認証ありの 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 で有効化。
![](https://storage.googleapis.com/stateless.yaruzo-eigo.com/2022/03/1506354b-スクリーンショット-2022-03-24-6.50.14-1024x401.png)
The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
Cloud Run サービス間認証の失敗。
Cloud Run 側のログにもステータスコード 403 が記録された。
![](https://storage.googleapis.com/stateless.yaruzo-eigo.com/2022/03/6350e8ea-スクリーンショット-2022-03-24-8.35.50-1024x148.png)
以下のように失敗ステータスとなる。
![](https://storage.googleapis.com/stateless.yaruzo-eigo.com/2022/03/dab50359-スクリーンショット-2022-03-24-6.56.46-1024x594.png)
自分の場合はサービスアカウントの権限が間違っていて呼び出しできていなかった。
参考
![](https://runble1.com/wp-content/uploads/cocoon-resources/blog-card-cache/c193befae2b22183db2de37e2c6b61a9.png)
サービス間認証 | Cloud Run のドキュメント | Google Cloud
Terraform Registry
Terraform Registry
Terraform Registry
コメント