最終更新日 2019年10月21日
HashiCorp の blog に、 Terraform 0.12 プレビューに関する投稿 が先日(2018年7月5日 原題: HashiCorp Terraform 0.12 Preview: First-Class Expressions )にありました。例によって参考訳として共有させていただきます。以下どうぞ。
HashiCorp Terraofrm 0.12 Preview: First-Class Expressions
(Terraform 0.12 の主要な新機能に関する、連載2回めの投稿です)
今夏後半にある Terraform 0.12 リリース の下準備となるよう、新機能に焦点を当てたブログ投稿を毎週行います。今週の投稿は優れた式(First-Class Expressions)です。
式の洗練(First-Class Expresisons)
Terraform が使用する式は、は異なるリソースとパラメータ化した設定の関係性を記述します。式が頻繁に使われるのは、リソース属性値の中です。
Terraform 0.12 より前、式の言語を扱うには、文字列で "${var.foo}"
のように補完する必要がありました。
# Configuration for Terraform 0.11 以前の設定ファイル
variable "ami" {
}
variable "instance_type" {
}
variable "vpc_security_group_ids" {
type = "list"
}
resource "aws_instance" "example" {
ami = "${var.ami}"
instance_type = "${var.instance_type}"
vpc_security_group_ids = "${var.vpc_security_group_ids}"
}
0.12 では、式の言語がメインの設定言語に統合されるため、動的な式を構文中で直接書けるようになりました。
# Terraform 0.12 用の設定ファイル
variable "ami" {
}
variable "instance_type" {
}
variable "vpc_security_group_ids" {
type = "list"
}
resource "aws_instance" "example" {
ami = var.ami
instance_type = var.instance_type
vpc_security_group_ids = var.vpc_security_group_ids
}
Terraform バージョン 0.12 に先立ち、HCL パーサ(parser)は [...]
と {...}
配列による リストとマップ構文をサポートしましたが、式の中ではこの構文を利用できませんでした。古い HCL 実装このようになったのは、構造上および補完によるものが明らかでした。この制限に対応すべく、Terraform は文字列補完のリスト内で list
と map
機能を使えるようにします。
# Terraform 0.11 以前の設定ファイル
resource "aws_instance" "example" {
# …
# 以下のリスト構造は静的なので動作します
vpc_security_group_ids = ["${var.security_group_1}", "${var.security_group_2}"]
# 以下は動作しません。 [...] 構文は補完言語で解釈されないからです
vpc_security_group_ids = "${var.security_group_id != "" ? [var.security_group_id] : []}"
# そのかわり、list() 関数の使用が必要です
Instead, it's necessary to use the list() function
vpc_security_group_ids = "${var.security_group_id != "" ? list(var.security_group_id) : list()}"
}
0.12 では、HCL 補完は構造と式が1つの言語となったため、先ほどの補完は、直感的かつ完結な表現となります。
# Terraform 0.12 用の設定ファイル
resource "aws_instance" "example" {
# …
vpc_security_group_ids = var.security_group_id != "" ? [var.security_group_id] : []
}
また、これは maps も同様であり、式のどこでも [...]
構文が利用できます。0.12 では、直感的ではない設定は受け入れられません。
# Terraform 0.11 以前の設定ファイル
output "weird" {
value = {
foo = "foo"
}
value = {
bar = "bar"
}
}
JSON の情報モデルでは、入れ子ブロックが平らな構造になる必要があったため、以前の HCL は先の記述を value = [{foo = “foo”},{bar = “bar”}]
と解釈しました。これはいくつかのタイプのブロックが繰り返すという、論理的な結果になりましたが、利用者にとってはしばし混乱を引き起こしました。他にもこのようにトリッキーな記法が多くあり、結果として設定ファイルにおけるデータ構造は、形状を一定のものに保てませんでした。
0.12 では、HCL はこの解決のために、属性とブロックを明確に区別します。上記にある「weird」(妙な)記述は、HCL ではエラーとして扱われます。これは属性の value
を一度しか定義できないからです。適切にするには同じブロック型でまとめます。
# Terraform 0.12 用の設定ファイル
resource "aws_security_group" "example" {
# …
# "ingress" には等号記号(イコール)がないため、ブロックとして解釈されます
ingress {
# ..
}
ingress {
# ..
}
}
式の洗練(First-class expressions)は今夏後半に提供する Terraform 0.12 でリリース予定です。Terraform 0.12 にアップグレードするには、 アップグレード手順(英語)をお読みください。こちらのページは、Terraform 0.12 が近づくまでに継続的に更新予定です。
原文
- HashiCorp Terraform 0.12 Preview: First-Class Expressions