【参考訳】HashiCorp Terraform 0.12 プレビュー

08.07.2018 in HashiCorp using tags Terraform , HashiCorp , translation

HashiCorp の blog に、 Terraform 0.12 プレビューに関する投稿 が先日(2018年6月28日 原題: HashiCorp Terraform 0.12 Preview )にありました。例によって参考訳として共有させていただきます。以下どうぞ。

HashiCorp Terraofrm 0.12 Preview

(Terraform 0.12 の主要な新機能に関する、連載投稿です)

Terraform 0.12 は広範囲にわたる Terraform 言語改良に焦点をあてており、今夏後半にリリース予定です。Terraform 0.12 のリリースに先立って、次回の主要な改良を伴うリリースについてお知らせしますので、コミュニティは早々にフィードバックできます。

HCL の改良範囲には for ループ、条件式(conditional expression)の改善、null 許容型引数(nullable arguments)、JSON に対する正確な 1:1 対応(exact 1:1 mapping)などです。申し訳ありませんが、これら変更の結果、複数の破壊的な変更を伴います。私たちは一般公開され利用可能となっている膨大な Terraform 設定ファイルを解析しました。そして、これら破壊的な変更による影響があるのは、少ない数パーセントの利用者のみと信じています。来たるべき変更に対してコミュニティと対話できるように、更新ガイドを公開し、一連のブログを早々に投稿します。

HCL 改良

HCL とは、Terraform (だけでなく私たちのツールの大部分)の基礎をなす設定言語です。HCL は最初のリリースから4年間、ほとんどの変更がありませんでした。幅広い組織の設定用途として、本番環境(プロダクション)で使い始めた後、Terraform 利用者からすると多くの改良すべき点が目に付いてきました。HCL による制約の中、何年も使い続けるために多くの工夫をこなしますが、これは直感的ではない次善の策でした。

私たちはこれら HCL へのフィードバックに対して総体的に取り組むべく、1年前から広範囲にわたる開発項目で繰り返し取り組んできました。より堅牢に構築し、機能豊富な言語で Terraform の設定を記述し、解析し、処理する流れを簡単にするためです。私たちは今年の早々から、HCL に対する新しい機能を Terraform 0.12 で統合するように進めてきました。

Terraform 0.12 では言語の中核に対する改良に焦点をあて、非常に多くの新機能を導入します。Terraform 0.12 の changelog(訳者注:変更履歴を記録したファイル)に書かれるに至る直接的な利点に加えて、新しい HCL エンジンは今後の新機能をより柔軟に取り入れられるようになります。

著しい改良

以下は Terraform 0.12 から登場する HCL と Terraform に対する著しい改良の一覧です。一覧にある各機能の詳細については、別途それぞれを解説するブログ投稿を後日します。

  • 優れた条件式(First-class expressions) - 0.12 までの条件式では、 "${var.foo}" のようにダブル・クォーテーション・マーク(二重引用符)で囲む必要がありました。0.12 では、条件式は言語に取り込まれた状態(native part)であり、 ami = var.ami[1] のように直接利用できるようになります。
    • for 文(for epressions) - 繰り返し、リストのフィルタ、値の割り当て(map)のために for 文が使えます。リストやマップが予想される場所では、どこでもこの表記を利用できます。
  • 動的ブロック(Dynamic blocks) - aws_security_group にある rule のような子ブロックは、リストやマップとサポートしている反復型に基づき、動的に生成できます。
  • 汎用「範囲指定」表現(Generalized “Splat” expressions) - 特別な resource.*.field 記法が使えたのは count セットのリソースのみでした。今後は汎用的な記法として、あらゆるリストの値で利用できます。
  • 条件文の改良(Contitional improvements) - 条件式 ... ? ... : ... をあらゆる値の型でサポートし、結果を適切に評価ます。他の言語で見うけられるのと同じように機能します。
  • null 許容型引数(Nullable arguments) - 値がない場所を示すために、特別な値 null をあらゆるフィールドで割り当て可能です。これにより、Terraform は一次側(upstream)API コールからのフィールドを省略するため、処理によっては明確なデフォルト挙動の指定が重要になります。
  • inputs と outputs モジュールで豊富な型を扱える(Rich types in module inputs and outputs) - Terraform は input/outputs における基本的なリストとマップを Terraform 0.7 で導入しましたが、要素として使えるのは1つの値のみでした。Terraform 0.12 からは、あらゆる inputs とoutputs で(modules も含む)任意に複雑なリストとマップが利用できます。
  • テンプレート構文(Template syntax) - 文字列の値では、ループ用途として新しいテンプレート構文を利用できます。複雑な入れ子記法を使う必要はありあせん。例: %{ for instance in aws_instance.example ~}server ${instance.id}%{ endfor }
  • 正確な JSON 構文(Reliable JSON syntax) - Terraform 0.12 の HCL 設定ファイルは、JSON に対して正確に 1:1 となる対応をします。
  • 特別な値としての参照(References as first-class values) - リソースとモジュールに対する depends_on のような参照(リファレンス)で、任意の文字列を使えます。Terraform 0.12 では、リソース識別子(resoruce identifier)を aws_kms_grant.example のように(引用符を使わずに!)そのまま記述できます。これにより、私たちが提供する確認とエラーメッセージを改善できるようになります。同様に、リソースに対するリファレンスは、モジュールからの出力またはパラメータとして戻れるようになります。

来週以降、私たちはブログの投稿を通し、先ほど記述した各改良に対するより詳しい情報や付加情報を公開してきます。各投稿には記述例も含みますので、何が変わるのかだけでなく、Terraform 0.12 のアップグレードに関連する重要な情報を、より簡単に理解できるでしょう。

破壊的変更

紹介したこれらの変更に伴い、数々の破壊的な変更となります。ほとんどの利用者は Terraform 0.12 へのアップグレードにあたり、設定ファイルを変更する必要はありません。ですが、小数グループの利用者は、いずれ設定変更が必要になります。

私たちはTerraform 0.12 アップグレード・ガイドの公開に向けて作業を進めていますので、利用者の皆さんも Terraform 0.12 の準備を開始できます。アップグレード・ガイドは Terraform 0.12 をリリースするまで継続して変更する可能性があるため、ご注意ください。特に、私たちは自動的、もしくは破壊的な変更を完全に防ぐために取り組み続けます。

アップグレード・ガイドに加え、更新作業のすべてが手作業とならないよう、私たちは複数の破壊的な変更に対する自動化ツールに対応中です。設定ファイルの記述にあたっては、安全に実行できるよう、私たちは常に Terraform バージョンに対する制約 を推奨します。

次へ

私たちは次期 Terraform 0.12 の開票にとてもワクワクしています。機能の多くは何年にもわたりご要望いただいていたものですが、Terraform の設定を処理する基礎部分をリセットする必要がありました。新しい基礎ができれば、Terraform は以降のリリースで素早い改良や新機能のサポートをできる準備が整います。

これまで紹介した破壊的な変更に先立ち、私たちは謝罪を申し上げます。私たちは過去6ヶ月にわたり破壊的な変更が最小限になるようにしてきました。また、可能であれば影響が最小限になるよう取り組み続けます。さらに、将来的なリリースでは破壊的な変更が必要としないように、私たちは今回のリリースでは設定(configuration)の変更にも注力しています。

フィードバックや変更に対する提案を検討中であれば、どうか公開メーリングリストにご参加ください。あらゆる変更に対する議論ができれば嬉しく思います!

来週以降の機能プレビューに関するブログ投稿では、Terraform 0.12 の個々の改良に対する詳細な情報をご案内します!

原文