Terraform の型
全部で 7 種類あります。
stringnumberboollisttuplemapobject
Primitive Types
string、number、bool は Primitive Type と呼ばれます。
これはまぁ自明ですね。
bool と string、number と string の間の型変換は terraform が自動的に実行してくれます。
Complex Types
複数の値をひとまとめの値として扱える型で、collection types と structural types の 2 種類があります。
Collection Types
同じ型を持つ複数の値を、1 つの値として扱える型で、list と map、set が該当します。
通常は、要素型を含める形で list(string) や list(number) して宣言されます。
list や map という型定義は誤りではなく list(any)、map(any) として扱われますが、推奨されていません。
Structural Types
スキーマで定義される型の複数の値を 1 つの値として扱える型で、object、tuple が存在します。
たとえば object({ name=string, age=numger}) は { name = "John", age = 52 } を値として保持できます。
また、tuple([string, number]) は [ "kiririmode", 6 ] を値として持つことができます。
null
型のない特別な値です。 null を指定した場合、argument は「指定されなかった」のと等価です。
hoge = null
どこに使うんだと思っていたら、条件に合致しない場合デフォルト値を使う、といったときに使用するようです。
nullis most useful in conditional expressions, so you can dynamically omit an argument if a condition isn't met.Expressions Landing Page - Configuration Language | Terraform by HashiCorp
興味深い機能
map の key に参照が使える
(var.business_unit_tag_name) = "SRE" は valid とのこと。
パスの参照
以下のような組み込みのパスが使用できる。
path.module: expression が記述されているモジュールのパスpath.root: ルートモジュールのパスpath.cwd: CWD のパスterraform.workspace: 選択されている Terraform の workspace の名前
Python の内包表記的な for
for を使うと、Python の内包表記的なことができます。以下は、terraform console で実行した結果です。
[for s in ["hoge", "fuga"] : upper(s)] [ "HOGE", "FUGA", ]
> {for s in ["hoge", "fuga"] : s => upper(s)}
{
"fuga" = "FUGA"
"hoge" = "HOGE"
}
奇数を取り出すおなじみのやつ。
[for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] : i if i % 2 != 0] [ 1, 3, 5, 7, 9, ]
splat expression
本来なら for を使わないといけないところで、splat expression を使うと楽になることがあります。
たとえば、[for o in var.list : o.id] と var.list[*].id は等価です。
aws_instance.example.ebs_block_device[*].device_name で EC2 インスタンス example が持つ EBS のデバイス名一覧が取得できます。
splat expression で注意すべきは、この記法は list にしか適用できないこと。
もし for_each により aws_instance.example が宣言されていたとすると、aws_instance.example[*] は使えません。
なぜなら for_each が生み出すのは、list ではなく map だからです。
このとき、aws_instance.example の id 一覧を取る場合は以下のように記述する必要があります。
values(aws_instance.example)[*].id
String Template: if 文/for 文
%{directive} により、if/else 文や for 文を差し込むことができます。
> "1 is %{ if 1 % 2 == 0 }even%{else}odd%{endif}."
1 is odd.
> "2 is %{ if 2 % 2 == 0 }even%{else}odd%{endif}."
2 is even.
> "%{for i in [1,2,3,4,5] } ${i} %{endfor}"
1 2 3 4 5