【Terraform】Terraform ~ テンプレート ~

■ はじめに

テンプレートをちょうど勉強してた際に、以下のサイト

https://tech.revcomm.co.jp/terraform-troubleshooting

って記事に「既存のコードが非推奨になっている」ってあって
その中で「 Template provider は、すでに非推奨」っとあったので
そのことも含めて、まとめてみる
 => 結局、templatefile 関数を使いましょって話。

目次

【0】data "template_file"(非推奨)
 1)非推奨について
 2)サンプル
【1】templatefile 関数
 1)構文
【2】サンプル
 例1:List
 例2:Map
 例3:JSON / YAML

【0】data "template_file"(非推奨)

* テンプレートファイル を取り入れる
 => ネットで調べると、これが多くみられる

https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file

1)非推奨について

https://registry.terraform.io/providers/hashicorp/template/latest/docs

より抜粋
~~~~~~~~~~~~
Template Provider

This provider is deprecated.
このプロバイダは、非推奨です。
~~~~~~~~~~~~

https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file

より抜粋
~~~~~~~~~~~~
Note

In Terraform 0.12 and later, the templatefile function offers
 a built-in mechanism for rendering a template from a file.
Terraform v0.12以降において、templatefile は、
ファイルからテンプレートをレンダリングするために、
ビルトインをオファーしている

Use that function instead, unless you are using Terraform 0.11 or earlier.
Terraform 0.11以前を使っていない限り、この関数を代わりに使ってください。
~~~~~~~~~~~~

2)サンプル

https://febc-yamamoto.hatenablog.jp/entry/2018/02/05/193735

demo_shell.template

#!/bin/bash

echo "Hello, ${name_for_hello}!!!"

main.tf

data "template_file" "demo_template_file" {
  # Template
  template = "${file("demo_shell.template")}"
  # Set value to a template file
  vars = {
    name_for_hello = "Mike"
  }
}

output "result" {
  value = "${data.template_file.demo_template_file.rendered}"
}

コマンド例

terraform init

terraform apply
...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

result = <<EOT
#!/bin/bash

echo "Hello, Mike!!!"

EOT

【1】templatefile 関数

* テンプレートファイル を取り入れる
 => for文で繰り返すことも可能

https://developer.hashicorp.com/terraform/language/functions/templatefile

1)構文

# path = テンプレートのパス
# vars = 引数
# 戻り値:テンプレートから出力された内容
templatefile(path, vars)

【2】サンプル

* 公式サイトのサンプルちょい間違ってる、、、

例1:Lists

backends.tftpl

%{ for addr in ip_addrs ~}
backend ${addr}:${port}
%{ endfor ~}

main.tf

output "result" {
  value = templatefile(
    "${path.module}/backends.tftpl",
    { port = 8080, ip_addrs = ["10.0.0.1", "10.0.0.2"] }
  )
}

出力結果

Outputs:

result = <<EOT
backend 10.0.0.1:8080
backend 10.0.0.2:8080

EOT

例2:Map

backends.tftpl

%{ for config_key, config_value in config }
set ${config_key} = ${config_value}
%{ endfor ~}

main.tf

output "result" {
  value = templatefile(
    "${path.module}/backends.tftpl",
    {
      config = {
        "key1"   = "Hello"
        "key2" = "World"
        "key3" = "!!!!"
      }
    }
  )
}

出力結果

Outputs:

result = <<EOT

set key1 = Hello

set key2 = World

set key3 = !!!!

EOT

例3:JSON / YAML

backends.tftpl

${jsonencode({
  "backends": [for addr in ip_addrs : "${addr}:${port}"],
})}
========
${yamlencode({
  "backends": [for addr in ip_addrs : "${addr}:${port}"],
})}

main.tf

output "result" {
  value = templatefile(
    "${path.module}/backends.tftpl",
    { port = 8080, ip_addrs = ["10.0.0.1", "10.0.0.2"] })

}

出力結果

Outputs:

result = <<EOT
{"backends":["10.0.0.1:8080","10.0.0.2:8080"]}
========
"backends":
- "10.0.0.1:8080"
- "10.0.0.2:8080"


EOT

関連記事

Terraform ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/05/000224
Terraform ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/09/222057
Terraform ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/05/03/000000
Terraform ~ 基本編 / Module ~
https://dk521123.hatenablog.com/entry/2023/05/19/113544
Terraform ~ Terraformあれこれ ~
https://dk521123.hatenablog.com/entry/2023/05/15/205352
Terraform ~ AWS IAM ~
https://dk521123.hatenablog.com/entry/2023/04/12/214311
Terraform ~ AWS S3 ~
https://dk521123.hatenablog.com/entry/2023/04/09/104204
Terraform ~ AWS MSK ~
https://dk521123.hatenablog.com/entry/2023/05/14/122215
Terraform ~ 機密情報の扱いを考える ~
https://dk521123.hatenablog.com/entry/2023/05/18/005103
Amazon S3AWS CLIで操作 ~
https://dk521123.hatenablog.com/entry/2017/04/01/235355