🐡

Terraformでheredocを使い複数行の文字列をスマートに記述する方法

2023/07/20に公開

はじめに

Terraform内でJSON形式の文字列を複数行で記述する方法が
パッと分からなかったので調べました。
こういう文字列を複数行で記述する方法、
言語によってけっこう書き方が違っていて慣れない言語だと毎回戸惑いがちになり
特にTerraformだとサンプルコードを探すのに苦労しがちなので
自分用の備忘録という意味も含めて今回記事にさせて頂きました。

記述方法

サンプルに使うTerraformのコードは以下のものになります。
GCPのCloud Schedulerを設定するものですね。
Cloud Scheduler自体は今回の主役では無いので細かい説明は割愛させて頂き、
base64encodeの引数が今回綺麗に記述したい対象です。
まず、改行を使わないやり方で記述した場合はだいたい以下のようになるかと思います。

resource "google_cloud_scheduler_job" "scheduler-job" {
  name             = "scheduler sample"
  description      = "scheduler sample"
  schedule         = "0 */1 * * *"
  time_zone        = "Asia/Tokyo"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 0
  }

  http_target {
    http_method = "POST"
    uri         = "http://testurl/sample"
    body        = base64encode(" {\"body\": {\"key1\": \"aaa\", \"key2\": \"bbb\", \"key3\": \"ccc\"}}")
  }
}

一行にまとまっていること自体は良いですが、
JSON全体がどんな構成なのか一目では分かりにくいですね。
さらにダブルクオートをエスケープシーケンスで書かなければいけないのも面倒なポイントです。

文字列部分を改行して良い感じに綺麗に書くやり方は
結論から書くと下記のようになります。
heredoc(ヒアドキュメント)という方法を使用します。

resource "google_cloud_scheduler_job" "scheduler-job" {
  name             = "scheduler sample"
  description      = "scheduler sample"
  schedule         = "0 */1 * * *"
  time_zone        = "Asia/Tokyo"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 0
  }

  http_target {
    http_method = "POST"
    uri         = "http://testurl/sample"
    body        = base64encode(<<EOT
                                  {"body":
                                    {"key1": "aaa",
                                     "key2": "bbb",
                                     "key3": "ccc"
                                   }
                                  }
                                EOT
                                )
  }
}

<<EOTから始まってEOTまでの間の文字列が対象になります。
heredocはターミナル上からコマンドを打つ際に
文字列を複数行書きたい時にもよく使用するので、
覚えておくと細かい部分で役に立つのでオススメです。
今回のケースだと、エスケープシーケンスを使わなくても
文字列内にダブルクオートを記述出来るので更にスッキリして良いですね!

まとめ

Terraformのコードが少し綺麗に書けてスッキリしました。
どんなソースコードでもまずは思った通りに動くことが一番大事ですが、
結局は人間が扱うものなので、視認性及び可読性は常に意識していきたいですね。

レスキューナウテックブログ

Discussion