🎍

Terraform 1.10.0 のリリースを読んでみた (1.10.1 ~ 1.10.4 もあるよ)

2025/01/10に公開

こんにちは、クラウドエース 第一開発部の阿部です。
この記事では、2024 年 11 月 27 日にリリースされた Terraform 1.10.0 の変更点についてざっくり説明します。
また、合わせて Terraform 1.10.1 ~ 1.10.4 の変更点についても説明します。

Terraform 1.10 のアップグレードに関する注意事項

Terraform 1.10 にアップグレードする際の注意事項についての詳細は、Terraform 1.10 のアップグレードガイドを参照してください。
下記は、アップグレードガイドに記載されている主な変更点です。

moved ブロックにおいて参照時に発生する競合

moved ブロックはリソースアドレスを解析する際に localeachself などの予約済みキーワードを尊重するようになりました。
moved ブロックから予約済みキーワードに一致するタイプ名を持つリソースを参照する際は、参照識別子に resource. 接頭辞を使用する必要があります。

S3 バックエンドに関する注意事項

Terraform 1.10 以降にアップデート後、 terraform init -reconfigure を実行する必要があります。
これは、S3 バックエンドで廃止された属性値を State ファイルから削除するためです。

S3 ネイティブ State ロック

S3 バックエンドは実験的なオプトイン機能として S3 ネイティブ State ロックをサポートするようになりました。
S3 バックエンドのロックは、DynamoDB のロックと併用することも、独立して使用することもできます。両方のロック機構を併用している場合、後続の処理の前に両方のロックを正常に取得する必要があります。

S3 ネイティブ State ロックをオプトインするには、 use_lockfile 属性を true に設定します。

terraform {
  backend "s3" {
    # additional configuration omitted for brevity
    use_lockfile = true
  }
}

S3 ネイティブ State ロックが有効になっている場合、State ファイルと同じ場所にロックファイルが配置されます。ロックファイルの名前は状態ファイルと同じになりますが、拡張子として .tflock が付加されます。
S3 バケットポリシーと呼び出し元のプリンシパルにアタッチされた IAM ポリシーは、新しいロックファイルの権限を含めるように調整する必要があります。

将来のマイナーバージョンの Terraform では、 use_lockfile 属性から実験的なラベルが削除され、DynamoDB のロック機構は非推奨になります。

ルートレベル Assume Role の廃止

以前から非推奨となっていた IAM ロールの引き受けに関するいくつかルートレベルの属性が削除されました。
削除された各フィールドには、代替として使用可能な assume_role ブロックのフィールドが用意されています。

Removed Replacement
role_arn assume_role.role_arn
session_name assume_role.session_name
external_id assume_role.external_id
assume_role_duration_seconds assume_role.duration
assume_role_policy assume_role.policy
assume_role_policy_arns assume_role.policy_arn
assume_role_tags assume_role.tags
assume_role_transitive_tag_keys assume_role.transitive_tag_keys

Terraform 1.10.0 の更新内容

Terraform 1.10.0 の更新内容の詳細は Terraform 1.10.0 のリリースノート を参照してください。
下記は、リリースノートに記載されている主な変更点です。

新機能

  • Ephemeral resources が追加されました。
    Ephemeral resources は Terraform がリソースを読み込む処理(plan や apply 等)において、読み込み結果を State に保存しない新たなリソース定義方法です。Ephemeral resources は Ephemeral values を出力します。
  • Ephemeral values が追加されました。
    Ephemeral values は入力と出力の値を一時的なもの(Ephemeral)として定義するための新しい機能です。Ephemeral values は特定の処理中のみ使用され plan の出力結果や State ファイルには保存されません。
  • ephemeralasnull 関数が追加されました。
    ephemeralasnull 関数は任意の Ephemeral values を、非 Ephemeral values な null 値に変換し、保存可能な値として扱います。

これら Ephemeral resources と Ephemeral values は、Terraform で長年議論されてきた「State ファイルに機密情報が入ってしまうようなユースケースにおいて State ファイルをどのように扱うべきか」という問題に対する解決策となる機能です。
この機能の検証は別のブログ記事で扱う予定です。

機能強化

  • element 関数は負のインデックス値をサポートするようになりました。
  • import ブロックの検証が改善され、 terraform validate においてより有用なエラーを提供するようになりました。
  • 多数のリソースが関連する場合のリソース評価性能が向上しました。
  • planapplyrefresh コマンドにおいて、 -state フラグを使用すると非推奨の警告を表示するようになりました。代わりに local バックエンドの path 属性を使用して State ファイルの位置を指定してください。
  • cos バックエンドにおいて、 Tencent Cloud の新しい認証方法が追加されました。

バグ修正

  • kubernetes バックエンドの secret_suffix を使用しているときに、 secret_suffix が数字のみの場合に不当なエラーが発生しないように修正されました。なお、数字のみの secret_suffix で、 State ファイルが大きい場合には、 Secret が分割され別途サフィックスが付与されます。
  • 入力変数に無効なデフォルト値が設定された際のエラーメッセージにおいて、問題が複合データ型がネストされた値のときでも正しく表示されるように修正されました。
  • sensitive とマークされた値がネストされたリソース値に渡されたときに plan の処理で誤った変更が発生する問題が修正されました。
  • 複数の variable にまたがる validation 処理において、 plan 前に値が確定しない場合正しく検証できないケースは plan 時まで検証を遅延するように修正されました。
  • GitHub モジュールのソース参照において URL に ref パラメータがエンコードされていないときにスラッシュが誤ってサブディレクトリとして扱われる問題が修正されました。
  • terraform apply -refresh-only を使用するとき、output だけが変更される場合にエラーが発生する問題が修正されました。
  • plantimestamp 関数は検証中は不明な日付値を返すようになりました。
  • create_before_destroy(CBD)を有効にしているリソースが削除されるときに、CBD のフラグが失われ正しい依存関係が保てなくなる問題が修正されました。
  • backend/cloud: タグが Set として定義されている場合でも、 KV タグを優先するように修正されました。
  • HCL 生成 (plan -generate-config-out) はプリミティブ型(数値型やブール型)を含む文字列属性の出力を簡略化しました。
  • issensitive 関数は plan 処理中に未知の値を sensitive ではないと扱い、 apply 処理時に plan 結果と一致しない変更を行う問題を修正しました。
  • HCL の条件式と for 式の評価自に特定の不明な値の組合せにおいて、値のマーク(例えば sensitive などのメタ情報)が失われる問題が修正されました。

その他の変更

アップグレードガイドには記載されていない変更点についてのみ記載します。

  • HCL の条件式の結果の一貫性を確保することを目的として、マーク情報の損失を回避するため全ての値からマークを結合する必要があります。これにより、通常は構成の検証の制度が向上しますが、以前は失われていた sensitive になる結果がユーザーに表示される可能性があります。

Terraform 1.10.1 ~ 1.10.4 の更新内容

その他のパッチバージョンの修正は軽微なバグフィックスのみのため、まとめて説明します。

Terraform 1.10.1 の主な更新内容

  • 環境変数経由で設定された複雑な値が apply 中に誤って解析されていた問題を修正しました。
  • 全く未知の map 型変数を与えられたときに templatefile 関数がパニックする問題を修正しました。
  • 変数に map 型とマークされた値が含まれているときに templatefile 関数がパニックする問題を修正しました。
  • リソースブロックが for_each を使用する import ブロックと組み合わせて使用されているときに、 リソースも同じ for_each 引数を使用させる制約を削除しました。(なお、 PR#36119 を見ると、削除された制約はより良い静的検証エラーを生成する制約にすることを検討しているようです。)
  • backend/s3: オブジェクトロックが有効になっているバケットにロックファイルが書き込めない問題を修正しました。

Terraform 1.10.2 の主な更新内容

  • plan 実行中に自動ロードされた tfvars ファイルによってオーバーライドされた変数が apply 中に誤って変更されたと表示される問題を修正しました。

Terraform 1.10.3 の主な更新内容

  • plan 内容のエンコード中にエラー発生したとき、 Terraform がパニックする問題を修正しました。

Terraform 1.10.4 の主な更新内容

  • 空の map 変数を型変換する際に正しい型の情報を返却するよう修正しました。
  • terraform console で Ephemeral values を表示するとクラッシュする問題を修正しました。

まとめ

Terraform 1.10 に関連する変更点について紹介しました。
Terraform 1.10 では、AWS 環境で S3 バックエンドを使用している方向けの新しいロック機構の実験的機能や、 Ephemeral resources と Ephemeral values といった新機能が追加されました。
特に Ephemeral resource の機能はいろいろと検証して、使い勝手を紹介したいと思います。
この記事が Terraform を使っている方々の参考になれば幸いです。

Discussion