Terraform version 1.2新機能まとめ
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
(追加):cloud
block内の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用のクレデンシャルを発行します。
Terraform Cloudに戻ります。 無料トライアルを有効化すると、organizationのsettingにRun tasksメニューが増えています。 そこから新規 run taskを作成します。先程Snykで手に入れたクレデンシャルを使います。
次はWorkspaceの設定です。まずサンプルリポジトリをforkします。新Workspaceを作成する際Version control workflowを選び、GitHubアカウントに接続してforkしたリポジトリを選びましょう。
Workspaceが作成できたら、Settings → Run Tasksから先程作ったSnykのrun taskをこのworkspaceと関連付けます。 この際、Enforcement LevelとしてAdvisoryとMandatoryが選べます。run taskはplanとapplyの間でツールやサービスを使えるツールだとご説明しましたが、その処理結果がエラーだったときに Runを続行してapplyができる=Advisory、Runが中断するつまりapplyできない=Mandatoryという設定となっています。Advisoryを選択してサブミットします。
これで設定が完了したのでActions → Start new runでパイプライン(Run)を実行してみましょう。
Planの後でTaskが実行されていることが確認できます。サンプルリポジトリはSnykのチェックでエラーになるように、意図的にSecurity Groupのインバウンド22番ポートが全開放になっています。ですので、Synkのrun taskチェック結果はエラー(failed)になっています。が、Enforcement LevelでAdvisoryを選んでいたので、このままこの画面からapplyを走らせることもできます。
また、DetailsリンクからSnykのコンソールに飛んで詳細を確認することもできます。
今度はEnforcement LevelをMandatoryにしてから再度パイプラインを実行してみました。すると今度は「Apply will not run」となってRunのStatusもErroredになっています。
以上、Run Taskを使ってみました。Terraform Cloudでもサードパーティ製ツールやサービスを簡単に使えて便利ですね。
replace_triggered_by
lifecycleブロック内にreplace_triggered_by
を定義できるようになり、そこに書いたリソースもしくはリソースのattributeに変化があった場合、lifycycleブロックを書いたリソースのリプレイス(削除→新規作成)を強制できます。
基本的にリプレイスよりも更新(削除→新規作成は行われず必要なattributesだけ更新される)の方が嬉しいですし、Terraformもそのように可能な限り更新するのがデフォルトの挙動です。ですのでこのreplace_triggered_by
の使い所、今思いつく事ができないのですが、まあ選択肢が増えるのは良いことですね。
参考情報
- Terraform 1.2 Improves Exception Handling and Updates to the CLI-driven Workflow
- Release v1.2.0 · hashicorp/terraform
- Deploy Infrastructure with Terraform and CircleCI | Terraform - HashiCorp Learn
- Configure Snyk Run Task in Terraform Cloud | Terraform - HashiCorp Learn
- Only show external changes which contributed to the plan by jbardin · Pull Request #30486 · hashicorp/terraform
- Terraform Cloud Settings - Terraform CLI | Terraform by HashiCorp
- Terraform Cloud Run Tasks are Now Generally Available
- The lifecycle Meta-Argument - Configuration Language | Terraform by HashiCorp