tech.guitarrapc.cóm

Technical updates

2024年9月のS3 Lifecyce Transitionの変更に伴うaws_s3_bucket_lifecycle_configurationの変更

以前記事を書いたEphemeral Resourceに対応するにはAWS Providerの更新が必要。ということでAWS Provider 5.87.0に更新作業をしていたところ、2024年9月のS3 Lifecyce Transitionの変更に伴うaws_s3_bucket_lifecycle_configurationの破壊的変更がAWS Provider 5.86.1に入っていることに気づきました。ということでその対応メモです。

image

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_sizeattributeのデフォルトが変わることです。設定値はドキュメントに記載があります。

  • 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 KB
  • all_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_sizevaries_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の更新で差分が出ることはそこまで多くないので、こういうことがあると楽しいですね。

参考


  1. 私の認識はもとより128KBは明示的に指定しないと移行されないだったので、丁寧な対応で驚きでした。
  2. こんなルールは書きたくない。