Terraform version 1.2新機能まとめ

2022.05.31

Terraformのversion 1.2.0が 2022/05/18にGAになりました。主要な変更点を見ていきます。

preconditionとpostcondition

こちらについては切り出して別エントリにしていますので、以下をご覧ください。

Non-Interactive Terraform Cloud CI Operations

Terraform v1.1 より cloud blockが追加されて、Terraform CloudをCLI-driven workflowsで使う場合、従来の backend "remote" の書き方が非推奨になりこのcloud blockの利用が推奨されるようになりました。

今回のアップデートで、Terraform CloudのCLI-driven workflowsで利用できる2つの環境変数が追加されました。またTF_WORKSPACE環境変数がアップデートされました。

  • TF_CLOUD_ORGANIZATION(追加): cloudblock内のorganizationに対応します。つまりorganizationを指定します。
  • TF_CLOUD_HOSTNAME(追加):hostnameに対応します。つまり、Terraform Enterprise利用時のホスト名の指定を行ないます。
  • TF_WORKSPACE(更新): Terraform CLIのWorkspaces に関する環境変数でしたが、今回のアップデートで、Terraform CloudでいうWorkspaceの指定にも使えるようになりました。

これにより、tfファイルに書くしか無かったTerraform Cloudの設定を環境変数に外出しすることができ、より柔軟なCI・CDパイプラインが構築できます。

これらの環境変数は、cloud block内に対応する各設定が無い場合に読まれるという点に注意が必要です。つまりcloud block内に設定を定義しつつ環境変数も使うと、cloud block内の設定が勝つということですね。

Run Tasks CLI Support

Terraform Cloudにて、Plan後Apply前にサードパーティ製ツールやサービスと統合できる新機能です。Freeプランだと使えません。Team & GovernanceかBusinessティアで利用可能です。Terraform Enterpriseでは間もなく利用可になるとのこと。

Run Tasks使ってみた

Freeプランでも30日無料でTeam & Governanceプランが試せるので、今回こちらを利用して Run Taskを触ってみました。以下のチュートリアルに沿って、SnykでAWSの設定をチェックします。

まずはSnykのアカウントを作成し、Terraform Cloud用のクレデンシャルを発行します。 snyk-credentials

Terraform Cloudに戻ります。 無料トライアルを有効化すると、organizationのsettingにRun tasksメニューが増えています。 run-task-menu そこから新規 run taskを作成します。先程Snykで手に入れたクレデンシャルを使います。 create-run-task

次はWorkspaceの設定です。まずサンプルリポジトリをforkします。新Workspaceを作成する際Version control workflowを選び、GitHubアカウントに接続してforkしたリポジトリを選びましょう。

Workspaceが作成できたら、Settings → Run Tasksから先程作ったSnykのrun taskをこのworkspaceと関連付けます。 associate-run-task この際、Enforcement LevelとしてAdvisoryとMandatoryが選べます。run taskはplanとapplyの間でツールやサービスを使えるツールだとご説明しましたが、その処理結果がエラーだったときに Runを続行してapplyができる=Advisory、Runが中断するつまりapplyできない=Mandatoryという設定となっています。Advisoryを選択してサブミットします。

これで設定が完了したのでActions → Start new runでパイプライン(Run)を実行してみましょう。 start-run

advisory-result Planの後でTaskが実行されていることが確認できます。サンプルリポジトリはSnykのチェックでエラーになるように、意図的にSecurity Groupのインバウンド22番ポートが全開放になっています。ですので、Synkのrun taskチェック結果はエラー(failed)になっています。が、Enforcement LevelでAdvisoryを選んでいたので、このままこの画面からapplyを走らせることもできます。

また、DetailsリンクからSnykのコンソールに飛んで詳細を確認することもできます。 snyk-result

今度はEnforcement LevelをMandatoryにしてから再度パイプラインを実行してみました。すると今度は「Apply will not run」となってRunのStatusもErroredになっています。 mandatory-result

以上、Run Taskを使ってみました。Terraform Cloudでもサードパーティ製ツールやサービスを簡単に使えて便利ですね。

replace_triggered_by

lifecycleブロック内にreplace_triggered_byを定義できるようになり、そこに書いたリソースもしくはリソースのattributeに変化があった場合、lifycycleブロックを書いたリソースのリプレイス(削除→新規作成)を強制できます。

基本的にリプレイスよりも更新(削除→新規作成は行われず必要なattributesだけ更新される)の方が嬉しいですし、Terraformもそのように可能な限り更新するのがデフォルトの挙動です。ですのでこのreplace_triggered_byの使い所、今思いつく事ができないのですが、まあ選択肢が増えるのは良いことですね。

参考情報