以前記事を書いたEphemeral Resourceに対応するにはAWS Providerの更新が必要。ということでAWS Provider 5.87.0に更新作業をしていたところ、2024年9月のS3 Lifecyce Transitionの変更に伴うaws_s3_bucket_lifecycle_configuration
の破壊的変更がAWS Provider 5.86.1に入っていることに気づきました。ということでその対応メモです。
- Objects smaller than 128 KB will not transition by default to any storage class
- Terraform Provider 5.86.1以降の差分
- AWS Provider更新時の差分に対応する
- まとめ
- 参考
Objects smaller than 128 KB will not transition by default to any storage class
AWS Docsにある通り、2024年9月以降、128KB未満のオブジェクトはデフォルトでどのストレージクラスにも移行されなくなります。1以下は引用です。
2024 年 9 月に、Amazon S3 は小さなオブジェクトのデフォルトの遷移動作を次のように更新しました。
- デフォルトの移行動作の更新 - 2024 年 9 月以降、デフォルトの動作により、128 KB 未満のオブジェクトはどのストレージ クラスにも移行されなくなる
- 以前のデフォルトの移行動作 - 2024 年 9 月より前のデフォルトの動作では、128 KB 未満のオブジェクトは S3 Glacier および S3 Glacier Deep Archive ストレージクラスにのみ移行できた
2024 年 9 月より前に作成された設定は、変更しない限り、以前の移行動作が保持されます。つまり、ルールを作成、編集、または削除すると、設定のデフォルトの移行動作が更新された動作に変わります。ユースケースで必要な場合は、128 KB 未満のオブジェクトが S3 Glacier および S3 Glacier Deep Archive に移行するように、デフォルトの移行動作を変更できます。これを行うには、 PutBucketLifecycleConfigurationx-amz-transition-default-minimum-object-sizeリクエストでオプションのヘッダーを使用します。
以前は以下の構成をすることで128KB未満のオブジェクトをGlacierに移行できましたが、2024年9月以降は明示的に許可しない限り移行を阻止します。
<LifecycleConfiguration> <Rule> <ID>Allow small object transitions</ID> <Filter> <ObjectSizeGreaterThan>1</ObjectSizeGreaterThan> </Filter> <Status>Enabled</Status> <Transition> <Days>365</Days> <StorageClass>GLACIER_IR</StorageClass> </Transition> </Rule> </LifecycleConfiguration>
Terraform Provider 5.86.1以降の差分
AWS Provider 5.86.1に入った本変更アナウンスが#41126に出ています。
Terraformでaws_s3_bucket_lifecycle_configuration
を使ってS3のライフサイクル設定を管理している時の差分を見てみましょう。AWS Provider 5.86.1前まで以下のようにしていたとします。
# 例えばこうしていたら resource "aws_s3_bucket_lifecycle_configuration" "bucket-config" { bucket = aws_s3_bucket.this.bucket # ... 省略 }
AWS Provider 5.86.1.0から次の変更がplan時に表示されます。
~ resource "aws_s3_bucket_lifecycle_configuration" "bucket-config" { id = "example-bucket" ~ transition_default_minimum_object_size = "varies_by_storage_class" -> "all_storage_classes_128K"
ポイントはtransition_default_minimum_object_size
attributeのデフォルトが変わることです。設定値はドキュメントに記載があります。
varies_by_storage_class
(これまでのデフォルト): Objects smaller than 128 KB will transition to Glacier Flexible Retrieval or Glacier Deep Archive storage classes. By default, all other storage classes will prevent transitions smaller than 128 KBall_storage_classes_128K
(2024年9月以降のデフォルト): Objects smaller than 128 KB will not transition to any storage class by default
5.70.0でユーザーがtransition_default_minimum_object_size
を選べるようになっていたのですが、5.86.1でデフォルト値が変わりました。この修正がかかった理由は、もし128KB未満のオブジェクトをGlacier Instant Retrievalに移行すると予期せぬコスト増加につながるためです。S3価格表に記載がある通り、S3 Glacier Instant Retrievalは128KB未満のオブジェクトでも128KBとして請求されます。1KBでも128KBとして請求されるので、128KB未満のオブジェクトをGlacier Instant Retrievalに移行するのはやめたほうがいいです。
そして今回の変更で、128KB未満のオブジェクトをGlacier Instant Retrievalに移行することをよりきっちり防げるのでユーザーにとっては安心を与える変更だと認識しています。
S3 Glacier Instant Retrieval has a minimum billable object size of 128 KB.
AWS Provider更新時の差分に対応する
もとより128KB未満のオブジェクトをGlacier Instant Retrievalに移行する設定をわざわざ入れていないなら、特に何もしなくてもよいでしょう。ただ、この変更はユーザーが事故らないようにデフォルトが変わる差分なので、その差分にしたがって明示的にtransition_default_minimum_object_size
を指定するのがより良いでしょう。
つまりこう。
resource "aws_s3_bucket_lifecycle_configuration" "bucket-config" { bucket = aws_s3_bucket.this.bucket transition_default_minimum_object_size = "all_storage_classes_128K" # ここを明示的に指定 # ... 省略 }
もしも128KB未満のオブジェクトをGlacier Instant Retrievalに移行させたい場合
移行する理由がないのでやらないと前提を置いた上ですが.... もしも万が一、何かしらのやむにやまれない事情で、仕方なく128KB以下のオブジェクトをGlacier Instant Retrievalに移行させたい場合は、transition_default_minimum_object_size
をvaries_by_storage_class
に設定しつつ、フィルタールールでobject_size_greater_than = 1
など128KB未満のオブジェクトも明示的にGlacier移行を指定する必要があります。2
resource "aws_s3_bucket_lifecycle_configuration" "example" { bucket = aws_s3_bucket.this.bucket transition_default_minimum_object_size = "varies_by_storage_class" # ここを明示的に指定 # 128KB未満のオブジェクトをGlacierに移行するルールも明示的に追加 rule { id = "Allow small object transitions" filter { object_size_greater_than = 1 } status = "Enabled" transition { days = 365 storage_class = "GLACIER_IR" } } }
まとめ
Ephemeral Resourceに対応したかっただけなのに、AWS Providerの更新で差分が出てあららという感じでした。S3 Lifecycle Transitionのデフォルト変更があったのに気づかなかったものの、object_size_greater_than
を変更する理由がなかったので特に問題はなかったですが気をつけておきたいですね。
AWS Providerの更新で差分が出ることはそこまで多くないので、こういうことがあると楽しいですね。
参考
- Transitioning objects using Amazon S3 Lifecycle - Amazon Simple Storage Service
- Constraints and considerations for transitions - Transitioning objects using Amazon S3 Lifecycle | Amazon Simple Storage Service
- PutBucketLifecycleConfiguration | Amazon Simple Storage Service
- Amazon S3 pricing
- 最小オブジェクトサイズより小さなオブジェクトを格納した際にストレージ料金はどのように課金されるのか | DevelopersIO