【参考訳】HashiCorp Terraform 0.12 プレビュー:式の洗練

08.07.2018 in HashiCorp using tags Terraform , HashiCorp , translation

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 は文字列補完のリスト内で listmap 機能を使えるようにします。

# 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 が近づくまでに継続的に更新予定です。

原文