TerraformのAWS Provider Version 5がGAになりました

2023.05.27

TerraformのAWS Providerのversion 5がGA(一般提供開始)になりました。アップデート内容を確認していきましょう。

リソースタグ・デフォルトタグが改良された

リソースタグは、各リソースで定義するタグのことです。

デフォルトタグという機能は、デフォルトタグを設定したAWS Provider経由で作成したリソース全てに簡単に共通のタグを付けられる機能です。

これらタグまわりが改良されました。

ゼロ値("")が使えるようになった

これまで、ゼロ値(""、いわゆる空文字)をタグ値に使った場合、一部リソースではそのタグがそもそもセットされないことがありました。

また、一度ゼロ値じゃない値が入ったタグを作成した後、ゼロ値にコードを修正してapplyした際に、その変更が反映されない=ゼロ値じゃない値が入ったままになるリソースもありました。今回これらの不具合が修正されています。

null値も使えるようになった (v5.0.1から)

null値を指定したタグは作成されなくなります。

変数と組み合わせることで、「開発環境では付与するけど、本番環境では付与しないタグ」みたいなのが実現できますね。

リソースタグとデフォルトタグで同じタグを定義した場合のエラーが修正された

Plan結果がおかしくなるのが修正された

Computed valueを使えるようになった

Computed valueというのはTerraformを実行(apply)してみてはじめて判明する値のことを指します。このComputed valueをタグ値として使えるようになりました。

timestamp()がcomputed valueです

resource "aws_vpc" "v5" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name             = "v5"
    last_modified_at = timestamp()
  }
}

デフォルトタグではエラーになる(場合がある)

このcomputed valueはデフォルトタグで使うとエラーになります。Version 5でOKになったのは、各リソースのタグでComputed valueを使うことのみです。

デフォルトタグでcomputed valueを使った際のエラー

│ Error: Provider produced inconsistent final plan
│ 
│ When expanding the plan for aws_vpc.v5 to include new values learned so far
│ during apply, provider "registry.terraform.io/hashicorp/aws" produced an invalid
│ new value for .tags_all: new element "last_modified_at" has appeared.
│ 
│ This is a bug in the provider, which should be reported in the provider's own
│ issue tracker.

ただ、デフォルトタグでcomputed valueを使って、リソースのタグを何も指定しなかったらエラーにならなかったんですよね… リソースのタグが何かしら(=computedじゃない静的な値でも)定義されている場合にエラーになりました。
とはいえリソース固有のタグを全てのリソースで書かないなんてことは現実的では無いと思うので、ほとんどの場合でデフォルトタグでcomputed valueを使うことはできないのではないかと思います。

EC2-Classic関連の機能廃止

EC2-ClassicはVPCがリリースされる以前のEC2インスタンスの利用方法で、インスタンスは他の顧客と共有される単一のフラットなネットワーク上で稼働します。この機能は2022年8月に廃止されました。Terraform上でもEC2-Classicに関連する機能はDeprecated(非推奨)になっていましたが、この度(Version 5より)廃止されることになりました。まあ、皆さんはEC2-ClassicからVPCへの移行が完了しているはず(ですよね?)ので特にこの点について気にする必要はないかと思います。

具体的にどのようなものが廃止になったのかは、以下Version 5 へのアップグレードガイドに記載されています。

他にも廃止されたり変更になったAttributesが結構ある

EC2-Classic関連以外でも廃止されたり変更になったAttributesが結構な量あります。アップグレードガイドのここ以下を読んで、お使いのリソースに影響が無いかを確認しましょう。

影響が大きそうなのはaws_db_instance=RDBインスタンスの変更でしょうか。

  • id is no longer the identifier
  • Use db_name instead of name

S3のbreaking changesはどうなったの?

Version 4のGA時に、S3バケット(aws_s3_bucketリソース)にbreaking change(破壊的変更)がありました。つまりVersion 3と同じコードだとエラーになるようになりました。

その後Version 4.9.0にて、breaking changeは撤回つまりversion 3と同じコードでもエラーにならなくなりました。ただしDeprecatedとしてWarningが表示されます。

Version 5にて再び旧来の(Version 3までの)コードだとエラーになるようにする予定ということがドキュメントに書かれていました。

In the next major version, v5.0, the parameters listed below will be removed entirely from the aws_s3_bucket resource. For this reason, a deprecation notice is printed in the Terraform CLI for each of the parameters when used in a configuration.

なのですが、方針が再度変更され、Version 5系では旧来のコードをエラーにすることは見送りになったようです。代わりにVersion 6で実施予定とのこと。(参照元)

参考情報