Blog

aws s3 bucket lifecycle configurationの仕様変更

はじめに

こんにちは。ニフティの山田です。

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のドキュメントに記載されている変更に対処するものとなります。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#lifecycle-configuration-constraints

従来は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となります。

5.86.1 ~

これ以降は all_storage_classes_128K となり、AWSの挙動に揃うことになりました。

5.70.0 ~ 5.86.0で一度もapplyしていない場合はchangedが出ませんが、使用している場合はchangedが出ることになります。

対応方法

  • Terraform AWS Provider 5.86.1以降に上げる
  • デフォルト値 all_storage_classes_128K に従う

基本的にAWS側のデフォルト挙動に従うべき項目なので、5.86.1以降の挙動で揃えるべきだと考えます。

5.70.0 ~ 5.86.0でapplyしてしまっていた場合は差分をapplyしてデフォルト挙動に戻しておきます。

filterを指定しない場合の設定

filterはライフサイクルルールの適用対象を特定パスなどに制限するための設定です。

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ブロックを追加した場合については、5.86.0~5.98.0までで一度applyしている場合には差分となることがあります。applyしてもAWS上の設定値には変化はありません。

おわりに

aws_s3_bucket_lifecycle_configurationの仕様変更について解説しました。
参考になれば幸いです。

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!