はじめに
こんにちは。ニフティの山田です。
2024年の9月にS3のライフサイクルルールを決めるリソースであるaws_s3_bucket_lifecycle_configurationに変更が入り、予期しないchangedやwarningが出るようになりました。
今回は、その解説と対処法について説明します。
影響範囲
transition_default_minimum_object_size
- Terraform AWS Provider 5.70.0以降 2024/10/4
- Terraform AWS Provider 5.86.1以降 2025/2/11
の2段階
filter
- Terraform AWS Provider 5.88.0以降 2025/2/21
- 5.86.0以降でも影響あるかもしれません
内容
transition_default_minimum_object_size
AWSのドキュメントに記載されている変更に対処するものとなります。
従来はS3 → S3 Gracierへのオブジェクト移行はすべてのオブジェクトに対して行われていましたが、Gracierは128KB単位での課金となるため、128KB未満のオブジェクトを移行してしまうとコスト増になってしまっていました。
そこでAWS側に設定が追加され、
- APIを叩くときに
x-amz-transition-default-minimum-object-size
ヘッダで最小移行サイズを設定できるようになる - この値のデフォルトが128KBとなる
- つまり128KB未満のオブジェクトはデフォルトで移行されなくなる
- この挙動は2024/9月以降有効となる
という変更が入りました。
これをTerraformで設定する項目がtransition_default_minimum_object_size
ですが、Terraform AWS Providerのバージョンでデフォルト値が異なります。
5.70.0 ~ 5.86.0
この時点では varies_by_storage_class
(従来挙動)がデフォルト値でした。
AWS側のデフォルト値は all_storage_classes_128K
なので、この間のバージョンを適用すると初回は必ずchangedとなります。
1 |
~ transition_default_minimum_object_size = "all_storage_classes_128K" -> "varies_by_storage_class" |
5.86.1 ~
これ以降は all_storage_classes_128K
となり、AWSの挙動に揃うことになりました。
5.70.0 ~ 5.86.0で一度もapplyしていない場合はchangedが出ませんが、使用している場合はchangedが出ることになります。
1 |
~ transition_default_minimum_object_size = "varies_by_storage_class" -> "all_storage_classes_128K" |
対応方法
- Terraform AWS Provider 5.86.1以降に上げる
- デフォルト値
all_storage_classes_128K
に従う
基本的にAWS側のデフォルト挙動に従うべき項目なので、5.86.1以降の挙動で揃えるべきだと考えます。
5.70.0 ~ 5.86.0でapplyしてしまっていた場合は差分をapplyしてデフォルト挙動に戻しておきます。
filterを指定しない場合の設定
filterはライフサイクルルールの適用対象を特定パスなどに制限するための設定です。
1 2 3 |
filter { prefix = "logs/" } |
Terraform AWS Provider 5.86.0 ~ 5.88.0で行われた変更により、本来は誤った設定でもTerraform AWS Provider側で吸収していましたが、この挙動をdeprecatedにしてシンプル化することになりました。
filterの設定は言及されていませんでしたが、変更に巻き込まれており、filterを設定しない挙動がどうやってもwarningになるという状態になっていました。
紆余曲折あり5.99.0でようやく挙動が確定し、
- filterブロックの省略は不可
- filterを何も設定しない場合、空ブロックで指定する
filter {}
が正しいということになりました。
対応方法
- Terraform AWS Provider 5.99.0以降に上げる
- filterを設定しないルールがある場合
- filterを記述していない:
filter {}
を追加 - filter {}を記述している: そのまま
- filterを記述していない:
filterブロックを追加した場合については、5.86.0~5.98.0までで一度applyしている場合には差分となることがあります。applyしてもAWS上の設定値には変化はありません。
1 2 3 |
+ filter { # (1 unchanged attribute hidden) } |
おわりに
aws_s3_bucket_lifecycle_configurationの仕様変更について解説しました。
参考になれば幸いです。