[Terraform] Cloud SchedulerからCloud Run ジョブを引数オーバーライドして実行する設定方法
2024/07/27
masyus
業務でGoogle CloudのCloud SchedulerからCloud Run ジョブを引数オーバーライドして実行する設定をTerraformで書いた時、Terraform公式ドキュメントのCloud Schedulerの引数設定で混乱した箇所がありました。今回はその備忘録となります。
バージョン情報
- terraform: v1.8.0
TerraformによるCloud Schedulerの設定例
resource "google_cloud_scheduler_job" "job" {
name = "test-job"
description = "test http job"
schedule = "*/8 * * * *"
time_zone = "America/New_York"
attempt_deadline = "320s"
retry_config {
retry_count = 1
}
http_target {
http_method = "POST"
uri = "https://example.com/"
body = base64encode("{\"foo\":\"bar\"}")
headers = {
"Content-Type" = "application/json"
}
}
}
上記がTerraformに記載の設定例になります(参考1.)。Cloud Run ジョブへはhttp_targetブロックを使い、POSTで実行リクエストを送信する必要があります。
Cloud SchedulerからCloud Run ジョブへ引数をオーバーライドして実行する方法
Google Cloud ConsoleとTerraformの2つで解説します。
Google Cloud Consoleの場合
Cloud Schedulerの登録・編集画面の本文という入力欄に
{
"overrides": {
"containerOverrides": [
{
"args": [
"${args1}"
],
"name": "${cloud-run-job-name}"
}
]
}
}
というJSONのフォーマットでジョブ名と引数を登録します。このJSONフォーマットはCloud Run ジョブへHTTPリクエストする際に実行内容をオーバーライドしたい際の書き方になります(参考2.)。
${args1}
, ${cloud-run-job-name}
の箇所は適宜置き換えてください。
Terraformの場合
http_targetブロックのbodyが、Cloud Schedulerの登録・編集画面の本文と対応しています。先述したTerraformに記載の設定例に沿うと、
base64encode("
{
\"overrides\": {
\"containerOverrides\": [
{
\"args\": [
\"${args1}\"
],
\"name\": \"${cloud-run-job-name}\"
}
]
}
}
")
のように、JSONのダブルクォーテーションをエスケープした上でbase64encode()
する流れになります。
躓いたところ
Terraformで上述のようにbodyを設定し、terraform apply
コマンドを実行してGoogle Cloud Consoleから本文の登録内容を確認してみると、
"{\"overrides\":{\"containerOverrides\":[{\"args\":[\"${args1}\"],\"name\":\"${cloud-run-job-name}\"}]}}"
のようになっていました。この内容ですとCloud Run ジョブへ引数をオーバーライドして実行できません。どうやら
- base64encode()に渡す内容をダブルクォーテーションで囲う必要がない
- JSON内のダブルクォーテーションのエスケープが不要
なようでした。
解決方法
結果的にbodyの内容を下記のように修正しました。
base64encode(
{
"overrides": {
"containerOverrides": [
{
"args": [
"${args1}"
],
"name": "${cloud-run-job-name}"
}
]
}
}
)
これでterraform apply
コマンドを実行したら本文の登録内容が
{"overrides":{"containerOverrides":[{"args":["${args1}"],"name":"${cloud-run-job-name}"}]}}"
のように期待通りとなり、Cloud Run ジョブへの引数オーバーライド実行もできました。私の時は解決までに丸1日費やすことになりましたが、参考までに。