良さそうなライフサイクルルール設定を考えてみた(いろいろ注意点あり)

    良さそうなライフサイクルルール設定を考えてみた(いろいろ注意点あり)

    本記事はAsiaQuest Advent Calendarの7日目です。

    目次

      はじめに

      クラウドインテグレーション部の渡邊です。
      今回はAmazon Simple Storage Service(以下、S3と呼ぶ)のライフサイクルルールの設定方針と設定時の注意点について説明します。
      設定方針は公式の見解ではない点、ご了承ください。
      また、バージョニングの有効化を前提としております。

      ライフサイクルルール設定時には、S3にどのようなデータが格納されるか考えるとよいと思います。
      たとえば、静的ウェブサイトホスティングが有効なバケットにおいてライフサイクルルールを設定する場合を考えてみましょう。
      ウェブサイトとして画像などのオブジェクトを提供するため、サービスが継続する限り、オブジェクトの現行バージョンは有効期限切れにするべきではありません。
      しかし、ログバケットでよくある設定として、一定期間で現行バージョンを期限切れにする設定を適用してしまうと、ある日を境に表示したいコンテンツが見られないということが考えられます。

      このようなことを避けるためにも、ライフサイクルルール設定時にはどのようなデータを格納するか考えたほうがよいと思います。

      私が考えたライフサイクルルール設定

      早速結論となりますが、以下のライフサイクルルールのアクションの設定方針がよいと考えました。
      以下を満たすバケットがこの設定に向いていると思います。

      • すべてのオブジェクトを適用対象とする
      • オブジェクトのアクセス頻度が偏っていない
      • 非現行バージョンを一定期間で削除する
      • アップロードに1日以上かかるようなオブジェクトはない
      ライフサイクルルールのアクション 設定
      オブジェクトの現行バージョンをストレージクラス間で移動 -
      オブジェクトの非現行バージョンをストレージクラス間で移動 -
      オブジェクトの現行バージョンを有効期限切れにする 要件の保持期間にする(ない場合はこのアクションを無効)
      オブジェクトの非現行バージョンを完全に削除 ・要件の保持期間または長期休暇を考慮した日数(14日)
      ・すべての非現行バージョンをアクションの対象とする
      有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除 ・有効期限切れのオブジェクト削除マーカー:有効
      ・不完全なマルチパートアップロードを削除:1日

      ※こちらを以下「上表」と呼びます。

      各ルールのアクションについて言及します。

      • ストレージクラス間で移動
        オブジェクトのアクセス頻度が偏っている場合は、ストレージクラス間で移動するアクションを適用するのもよいと思います。
      • オブジェクトの現行バージョンを有効期限切れにする

        要件に保持期間の方針があるはずなので、そちらにしたがって設定すればよいと思います。
        静的ウェブサイトホスティングなど、コンテンツを常に参照するようなケースの場合、こちらのアクションは無効にする場合が多いかと思います。

      • オブジェクトの非現行バージョンを完全に削除
        バージョニングを有効にしている場合に、コスト削減を図るため設定してよいと思います。
        非現行バージョンのオブジェクトについて要件がない場合は、誤削除に対応できるように一般的な長期休暇よりも長い日数(GWが10連休と考え、上表では14日と記載しました)を設定するとよいと思います。 バージョニングを有効にしたバケットで、同じ名前のオブジェクトを何度も上書きするようなファイルが存在する場合、非現行バージョンを削除するアクションを設定しないと、すべての世代を保持してしまうため注意しましょう。
      • 有効期限切れのオブジェクト削除マーカー
        公式の「削除マーカーの管理」に記載の通り、削除マーカーは、期限切れオブジェクトのマーカーと古いバージョンを現行バージョンにするためのマーカーがあります。
        有効期限切れのオブジェクト削除マーカーは、復元にも使用できず、残しておく必要がないと考え、有効化しました。

      期限切れのオブジェクト削除マーカーは、すべてのオブジェクトバージョンが削除され、単一の削除マーカーだけが残っている場合のマーカー

      引用元:期限切れの削除マーカーを自動的にクリーンアップするライフサイクルの設定

      • 不完全なマルチパートアップロードの削除
        マルチパートアップロードによって、単一のオブジェクトを、分割および並列してアップロードできます。
        不完全なマルチパートアップロードを削除するアクションは、指定の日数以内に完了しない場合、マルチパートアップロードを中止し、途中までアップロードした分割データを削除するアクションです。
        上表では、設定日数を1日にしていますが、アップロードに1日以上かかるような非常に大きなオブジェクトがある場合、設定日数を検討する必要があります。
        以下の公式ドキュメントの記述にしたがって、設定することをオススメします。

      ベストプラクティスとして、ストレージコストを最小限に抑えるため、AbortIncompleteMultipartUpload アクションを使用してライフサイクルルールを設定することをお勧めします。

      引用元:不完全なマルチパートアップロードを削除するためのバケットライフサイクル設定の設定

      ライフサイクルルール設定時の注意点

      バケットの[管理]タブから、ライフサイクルルールを作成します。
      ルールスコープは以下の2つの選択肢があります。
      フィルターを使用する場合、3つのフィルターパターンを検討する必要があります。

      • バケット内のすべてのオブジェクトに適用
      • 1つ以上のフィルターを使用してこのルールのスコープを制限する
        • プレフィックス
        • オブジェクトタグ
        • オブジェクトサイズ

      プレフィックス指定時には、キープレフィックス (tax/example/) などを指定するため、バケット名を含めないように注意しましょう。
      今回は、バケット内のすべてのオブジェクトを対象にするため、「バケット内のすべてのオブジェクトに適用」を選択します。

      202312_s3_lifecycle_01

      上表で対象にした、ライフサイクルルールのアクションを有効化した状態の設定画面です。
      設定画面に、以下の注意書きがあります。

      [オブジェクトの現在のバージョンの有効期限切れ] を有効にした場合、 [期限切れのオブジェクト削除マーカーの削除] を有効にすることはできません。

      202312_s3_lifecycle_02

      よって、私が冒頭で示したライフサイクルルールを適用するために、少なくとも、2つのルールを作成する必要があります。
      以降では、各ライフサイクルルールの作成時の注意点を示します。

      また、ライフサイクルルールは、新規および既存のオブジェクト両方に適用されるため、注意してください。

      ライフサイクル設定をバケットに追加すると、設定ルールは既存のオブジェクトとそれ以降に追加されるオブジェクトの両方に適用されます。

      引用元:バケットのライフサイクル設定の指定

       

      現行バージョンと非現行バージョンのライフサイクルルール設定

      まず、現行バージョンと非現行バージョンのライフサイクルルール設定を実施します。
      以下の記述したがって、設定値を入力します。

      選択したアクションには有効期限が必要です。値を入力するか、アクションの選択を解除します。

      0日と設定して作成しようとすると、設定値の下に警告が表示されます。

      整数値は 0 より大きい必要があります。

      202312_s3_lifecycle_03

      202312_s3_lifecycle_04

      作成を試みると、やはり失敗します。

      202312_s3_lifecycle_05

      では、正の値を設定した上で、保持する新しいバージョンの数を0にします。
      こちらの設定によって、一定期間経過したすべての非現行バージョンのオブジェクトを削除します。
      保持する新しいバージョンの数は、アクションの対象外とする世代数を表します。

      202312_s3_lifecycle_06

      すると、正の値を入力する旨を促すエラーが発生して作成に失敗します。

      'NewerNoncurrentVersions' for NoncurrentVersionExpiration action must be a positive integer

      202312_s3_lifecycle_07

      もし、すべての非現行バージョンを対象にアクションを適用したい場合は、値を空白にすることで実現できます。

      202312_s3_lifecycle_08

      ルールの作成を試みたところ、成功しました。

      202312_s3_lifecycle_09

      作成したライフサイクルルールを確認すると、想定通りの設定となっております。

      202312_s3_lifecycle_10

      削除マーカーとマルチパートアップロードのライフサイクルルール設定

      次に、アクション「有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除」についてです。
      今回の設定方針では問題ありませんが、該当アクションの下に記載の通り、一部のフィルター設定では制約があるため注意してください。

      オブジェクトタグまたはオブジェクトサイズでフィルタリングする場合、これらのアクションはサポートされません。

      202312_s3_lifecycle_11

      こちらも0より大きい値を設定する必要があります。

      整数は 0 より大きくする必要があります。

      202312_s3_lifecycle_12

      202312_s3_lifecycle_13

      2つ目のルールの作成に成功しました。

      202312_s3_lifecycle_14

      設定も想定通りになっています。

      202312_s3_lifecycle_15

      まとめ

      • ライフサイクルルールの設定例として、以下をオススメします(再掲)
        • 要件やバケットの用途によって設定を変更しましょう
      ライフサイクルルールのアクション 設定
      オブジェクトの現行バージョンをストレージクラス間で移動 -
      オブジェクトの非現行バージョンをストレージクラス間で移動 -
      オブジェクトの現行バージョンを有効期限切れにする 要件の保持期間にする(ない場合はこのアクションを無効)
      オブジェクトの非現行バージョンを完全に削除 ・要件の保持期間または長期休暇を考慮した日数(14日)
      ・すべての非現行バージョンをアクションの対象とする
      有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除 ・有効期限切れのオブジェクト削除マーカー:有効
      ・不完全なマルチパートアップロードを削除:1日
      • ライフサイクルルールのアクションにおいて、以下の設定時の制約に注意しましょう

        • 入力が必須かつ正の値しか入力できないもの
        • 入力がオプションかつ、入力する場合は正の値が必須であるもの
      • ライフサイクルルールは、新規および既存のオブジェクト両方に適用されます

      • 「オブジェクトの非現行バージョンを完全に削除」で設定する、保持する新しいバージョンの数は、アクションの対象外とする世代数を表します

      • 「有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除」はオブジェクトタグまたはオブジェクトサイズでフィルタリングする場合、設定できないです

      【参考】

      S3 ライフサイクル設定の例