Open7

Terraformでヒアドキュメントを使用し、HTMLをシンプルに記述する

not75743not75743

きっかけ

以下のようにHTMLをTerraformで使用するさい、
複数行になっても対応できるようにしたい。

resource "aws_wafv2_web_acl" "web_acl" {
// 略
  custom_response_body {
    content      = "<h1>maintenance</h1>"
  }

いまは1行だから普通に読めるが、複数行のHTMLになったらしんどい

not75743not75743

進め方

  • HTMLをlocalsで管理する
  • HTMLをヒアドキュメントで見やすく記述する
  • <<-EOFを使用してインデントを整理する
not75743not75743

サンプルHTML

<html>
  <head>
    <title>Maintenance</title>
  </head>
  <body>
    <h1>Maintenance</h1>
    <p>We're currently undergoing scheduled maintenance.</p>
  </body>
</html>
not75743not75743

①HTMLをlocalsで管理する

aws_wafv2_web_aclの中で管理してもいいのですが、
見やすくなると思うのでlocalsでhtml_content変数に格納します。

locals {
  html_content = "<html>\n  <head>\n    <title>Maintenance</title>\n  </head>\n  <body>\n    <h1>Maintenance</h1>\n    <p>We're currently undergoing scheduled maintenance.</p>\n  </body>\n</html>"
}

resource "aws_wafv2_web_acl" "web_acl" {
  // 略
  content = local.html_content
}

ヒアドキュメントを使わないとこのように見づらいです。
見やすく修正しましょう

not75743not75743

②HTMLをヒアドキュメントで見やすく記述する

ヒアドキュメントを使用するとこのように表現できる

locals {
  html_content = <<EOF
  <html>
    <head>
      <title>Maintenance</title>
    </head>
    <body>
      <h1>Maintenance</h1>
      <p>We're currently undergoing scheduled maintenance.</p>
    </body>
  </html>
  EOF
}

resource "aws_wafv2_web_acl" "web_acl" {
  // 略
  content = local.html_content
}

こちらのほうが見やすいですね
しかし出力を確認すると、スペース(もしくはタブ)がはいっています。事故防止のためにスペースをなくしたいです。

  <html>
    <head>
      <title>Maintenance</title>
    </head>
    <body>
      <h1>Maintenance</h1>
      <p>We're currently undergoing scheduled maintenance.</p>
    </body>
  </html>
not75743not75743

<<-EOFを使用してインデントを整理する

<<-EOFとハイフンをつけることで、各行がスペースから開始しなくなります

locals {
  html_content = <<-EOF
    <html>
      <head>
        <title>Maintenance</title>
      </head>
      <body>
        <h1>Maintenance</h1>
        <p>We're currently undergoing scheduled maintenance.</p>
      </body>
    </html>
  EOF
}

resource "aws_wafv2_web_acl" "web_acl" {
  // 略
  content = local.html_content
}

出力を確認しても問題なさそうです

<html>
  <head>
    <title>Maintenance</title>
  </head>
  <body>
    <h1>Maintenance</h1>
    <p>We're currently undergoing scheduled maintenance.</p>
  </body>
</html>