S3ライフサイクルを使用してオブジェクトを移動・削除する


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

はじめに

S3に保存したログ(オブジェクト)の管理などに利用される機能として、S3ライフサイクルがあります。実際にこの機能を使用して、どのような事が行えるか自身の理解を深めるためにも検証しました。

S3ライフサイクルとは

S3ライフサイクルは、S3に保存されたデータを設定した期限に自動的に別のストレージクラスに移動したり、削除することができる機能です。S3ライフサイクルのユースケースとして、以下のような場合に利用します。

  • アクセスログや各サービスの監視に使用しているCloudWatch Logsなど長期保管している大量のログを、一定の期間経過後により経済的なストレージクラスに移動することでコストを下げる。
  • アクセス頻度が少ないオブジェクトをアーカイブするためにアーカイブ用ストレージクラスに移動する。
  • バージョンアップにより、旧バージョンになったオブジェクトを別のストレージクラスに移動したり削除する。

S3のストレージクラス

ストレージクラス名 説明
S3 Standard アクセス頻度の高いデータ向けのストレージクラス。
S3 Standard-Infrequent Access アクセス頻度は低いが、必要に応じてすぐに取り出すことが可能なストレージクラス。
S3 Intelligent-Tiering アクセス頻度が変化するデータ向けのストレージクラス。
S3 One Zone-Infrequent Access アクセス頻度は低く、重要度が低いデータ向けのストレージクラス。
S3 Glacier Instant Retrieval アクセスされることがほとんどないが、必要に応じてすぐに取り出すことが可能なアーカイブ用ストレージクラス。
S3 Glacier Flexible Retrieval 年に1~2 回しかアクセスされず、取り出しに数分から数時間かかるアーカイブ用ストレージクラス。
S3 Glacier Deep Archive 年に1~2 回しかアクセスされず、7〜10年間データを保持するアーカイブ用ストレージクラス。

S3ライフサイクルの機能確認

今回はユースケースの中で、「バージョンアップにより、旧バージョンになったオブジェクトを別のストレージクラスに移動・削除」を検証してみます。検証には、検証用に作成したテキストファイルを3つのバージョンにして使用します。

構成

テキストファイルがS3ライフサイクルによって移動・削除されることはマネジメントコンソール上でも確認できますが、今回はAWS CloudShellからAWS CLIコマンドをうって確認してみます。

AWS CloudShell:マネジメントコンソールから直接起動して操作できるシェル

AWS CLI:コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツール

S3ライフサイクル構成

S3バケットの作成

S3バケットに保存したテキストファイルは、バージョニングを有効化することで、アップデートする度にバージョンで区別されて保存されます。今回はバージョニングを有効化します。
以下の設定値で作成します。2つの検証を行うため、バケットは2つ作成します。

設定項目 設定値 説明
バケット名 s3-lifecycle-test-yoshimi 任意
AWS リージョン eu-west-1 アイルランドリージョン指定
オブジェクト所有者 ACL 無効 (推奨) 要件にないためデフォルト
このバケットのブロックパブリックアクセス設定 パブリックアクセスをすべて ブロック 要件にないためデフォルト
バケットのバージョニング 有効にする オブジェクトをバージョンで管理
タグ:User yoshimi 任意
暗号化キータイプ Amazon S3 マネージドキー (SSE-S3) 要件にないためデフォルト
バケットキー 有効にする 要件にないためデフォルト
オブジェクトロック 無効にする 要件にないためデフォルト

S3ライフサイクルの設定

「ストレージクラス間を移動」の検証では、3つのバージョンの中でもっとも古いバージョンをStandardからIntelligent-Tieringに移動します。実行日は「オブジェクトが現行バージョンでなくなってからの日数」で指定します。

「有効期限でオブジェクトを削除」の検証では、3つのバージョンの中でもっとも古いバージョンを削除します。実行日は「オブジェクトが現行バージョンでなくなってからの日数」で指定します。

※S3ライフサイクルが実行される日は、午前9時(日本時間)が基準になり、例えば「オブジェクトが現行バージョンでなくなってからの日数」を0日に設定している場合、当日の午前9時よりに前に作成したオブジェクトは、当日の午前9時に実行され、当日の午前9時より後に作成した場合は、翌日の午前9時に実行されます。

ライフサイクルルール: オブジェクトの存在時間に基づく

以下の設定値で作成します。

設定項目 設定値 説明
ライフサイクルルール名 s3-lifecyclerole-test-yoshimi 任意
ルールスコープを選択 バケット内のすべてのオブジェクトに適用 バケット内すべてのオブジェクトを対象にするため
オブジェクト所有者 ACL 無効 (推奨) 要件にないためデフォルト
現行バージョンではないオブジェクトをストレージクラス間で移行する(ストレージクラス間を移動の検証ではこちらの項目を設定)
ライフサイクルルールのアクション オブジェクトの非現行バージョンをストレージクラス間で移動 旧バージョンのみストレージクラスを変更
ストレージクラスの移行を選択 Intelligent-Tiering 最短で移動できるストレージクラスのため
オブジェクトが現行バージョンでなくなってからの日数 0 旧バージョンになってからの経過日数
保持する新しいバージョンの数 1 最新から1つ前のバージョンは対象外
オブジェクトの非現行バージョンを完全に削除(有効期限でオブジェクトを削除の検証ではこちらの項目を設定)
オブジェクトが現行バージョンでなくなってからの日数 1 旧バージョンになってからの経過日数
保持する新しいバージョンの数 1 最新から1つ前のバージョンは対象外

古いバージョンのオブジェクトをストレージクラス間で移動

バケットに保存したテキストファイルの3つのバージョンの中で、もっとも古いバージョンのみストレージクラスが移動しますので、S3ライフサイクルが実行後にストレージクラスがStandardからIntelligent-Tieringに変われば想定通りです。

※オブジェクトが128KB未満の場合は、ストレージクラスの移行ができないため、アップロードするファイルの容量に注意が必要です。

制約

バージョン確認コマンド
aws s3api:オブジェクトやバケットの作成、操作、削除などAmazon S3 API へアクセスして行う。
list-object-versions:バケット内のオブジェクトのすべてのバージョンに関するメタデータを返す。
–bucket:オブジェクトを含むバケット名を指定するオプション。

aws s3api list-object-versions  --bucket バケット名

バージョニングが有効なバケットでのオブジェクトのリスト取得

「StorageClass」を確認すると、各バージョンのストレージクラスが全てSTANDARDであることが確認できます。

[cloudshell-user@ip-10-6-86-75 ~]$ aws s3api list-object-versions  --bucket s3-lifecycle-test-yoshimi
{
    "Versions": [
        {
            "ETag": "\"50e8c39289ca4807c0a103a79cb2262a\"",
            "Size": 150000,
            "StorageClass": "STANDARD",
            "Key": "test_version.txt",
            "VersionId": "My4OePlL2cr3gq6nVhawEPLunp5R8RqD",
            "IsLatest": true,
            "LastModified": "2023-03-07T08:17:46+00:00",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            }
        },
        {
            "ETag": "\"50e8c39289ca4807c0a103a79cb2262a\"",
            "Size": 150000,
            "StorageClass": "STANDARD",
            "Key": "test_version.txt",
            "VersionId": "pyvdoxqEFeR1dDORY6bV.P_5THic5HQr",
            "IsLatest": false,
            "LastModified": "2023-03-07T07:57:30+00:00",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            }
        },
        {
            "ETag": "\"50e8c39289ca4807c0a103a79cb2262a\"",
            "Size": 150000,
            "StorageClass": "STANDARD",
            "Key": "test_version.txt",
            "VersionId": "IRZb3k96d7G2NNKhNq7gps0NwLFR3ngg",
            "IsLatest": false,
            "LastModified": "2023-03-07T07:19:47+00:00",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            }
        }
    ]
}

S3ライフサイクル実行後も同様に確認しますと、もっとも古いバージョンのみストレージクラスがINTELLIGENT_TIERINGに変わったことが確認できますので、想定通りに実行されています。

[cloudshell-user@ip-10-6-5-113 ~]$ aws s3api list-object-versions  --bucket s3-lifecycle-test-yoshimi
{
    "Versions": [
        {
            "ETag": "\"50e8c39289ca4807c0a103a79cb2262a\"",
            "Size": 150000,
            "StorageClass": "STANDARD",
            "Key": "test_version.txt",
            "VersionId": "My4OePlL2cr3gq6nVhawEPLunp5R8RqD",
            "IsLatest": true,
            "LastModified": "2023-03-07T08:17:46+00:00",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            }
        },
        {
            "ETag": "\"50e8c39289ca4807c0a103a79cb2262a\"",
            "Size": 150000,
            "StorageClass": "STANDARD",
            "Key": "test_version.txt",
            "VersionId": "pyvdoxqEFeR1dDORY6bV.P_5THic5HQr",
            "IsLatest": false,
            "LastModified": "2023-03-07T07:57:30+00:00",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            }
        },
        {
            "ETag": "\"50e8c39289ca4807c0a103a79cb2262a\"",
            "Size": 150000,
            "StorageClass": "INTELLIGENT_TIERING",
            "Key": "test_version.txt",
            "VersionId": "IRZb3k96d7G2NNKhNq7gps0NwLFR3ngg",
            "IsLatest": false,
            "LastModified": "2023-03-07T07:19:47+00:00",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            }
        }
    ]
}

有効期限でオブジェクトを削除

S3ライフサイクルが実行されると、3つのバージョンの中で、もっとも古いバージョンのみ削除され、バージョンが2つに減ることを確認します。

S3ライフサイクル実行前に「VersionId」を確認すると、3つのバージョンが存在することがわかります。

[cloudshell-user@ip-10-6-86-75 ~]$ aws s3api list-object-versions  --bucket s3-lifecycle-test-yoshimi
{
    "Versions": [
        {
            "LastModified": "2023-03-03T01:57:21.000Z",
            "VersionId": "HouzCh5IDoOMHrh98nCMk5MBMQ7ciPpD",
            "ETag": "\"aad2ae1ab52a0c16a88b2fcff050454d\"",
            "StorageClass": "STANDARD",
            "Key": "test_delete.txt",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            },
            "IsLatest": true,
            "Size": 82
        },
        {
            "LastModified": "2023-03-03T01:36:00.000Z",
            "VersionId": "AqAtwiNqSsNPpz4ox9Yre3lgO_aqIcm_",
            "ETag": "\"ff5ed268c4893bb1a1601e6b05a92568\"",
            "StorageClass": "STANDARD",
            "Key": "test_delete.txt",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            },
            "IsLatest": false,
            "Size": 82
        }
        {
            "LastModified": "2023-03-03T01:27:36.000Z",
            "VersionId": "9FQ_f4ndEtuBs.oOb3fwJ2lh9nEfe.RR",
            "ETag": "\"f1a8828fecdc8aeb8d51f53fb18850be\"",
            "StorageClass": "STANDARD",
            "Key": "test_delete.txt",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            },
            "IsLatest": false,
            "Size": 73
        }
    ]
}

S3ライフサイクル実行後も同様に確認しますと、もっとも古いバージョンのみ削除され、バージョンが2つに減ったことが確認できますので、想定通りに実行されています。

[cloudshell-user@ip-10-6-86-75 ~]$ aws s3api list-object-versions  --bucket s3-lifecycle-test-yoshimi
{
    "Versions": [
        {
            "ETag": "\"aad2ae1ab52a0c16a88b2fcff050454d\"",
            "Size": 82,
            "StorageClass": "STANDARD",
            "Key": "test_delete.txt",
            "VersionId": "HouzCh5IDoOMHrh98nCMk5MBMQ7ciPpD",
            "IsLatest": true,
            "LastModified": "2023-03-03T04:57:21+00:00",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            }
        },
        {
            "ETag": "\"ff5ed268c4893bb1a1601e6b05a92568\"",
            "Size": 82,
            "StorageClass": "STANDARD",
            "Key": "test_delete.txt",
            "VersionId": "AqAtwiNqSsNPpz4ox9Yre3lgO_aqIcm_",
            "IsLatest": false,
            "LastModified": "2023-03-03T04:36:00+00:00",
            "Owner": {
                "DisplayName": "aws-ac-dev03",
                "ID": "c335a653f140f6dab0852ddb69f633f70a6c1c7700b83d77ed47dc3b31eb4a9a"
            }
        }
    ]
}

まとめ

S3ライフサイクルを使用することで、オブジェクトのアップデートによりオブジェクトのバージョンが増えてしまっても、ストレージクラスを移動したり、削除を自動で行えるため便利な機能であることを確認しました。SAA試験によく出題される機能ですが、ハンズオンすることで理解が深まりました。

Last modified: 2023-03-13

Author