[Terraform] Cloud SchedulerからCloud Run ジョブを引数オーバーライドして実行する設定方法

2024/07/27

author

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日費やすことになりましたが、参考までに。

参考