プレフィックス指定したS3ライフサイクルルールの動作を確認してみた

S3ではバケットにライフサイクルルールを設定することで、ストレージクラスの移行や、オブジェクトを失効(削除)させる可能です。本エントリでは、1つのバケットに複数のライフサイクルルールを設定し、プレフィックスでルール適用範囲を指定した動作確認を行いたいと思います。
2020.05.25

構成

ライフサイクルルールの確認に使用するテストオブジェクトのPUTは、Lambda Functionを用いて自動化しました。

検証準備

Lambda Function作成

S3へオブジェクトをPUTするLambda Functionを作成しました。また、検証の確認がしやすいように、PUT後にS3バケットに格納されたオブジェクトの一覧を出力しています。

TestPutObject

import boto3
import os
import jmespath
from datetime import datetime

s3 = boto3.resource('s3')
s3_client = boto3.client('s3')

def lambda_handler(event, context):
    bucket_name = os.environ['BUCKET_NAME']     #環境変数よりバケット名取得
    fixed_key=['rds-cluster/audit/','rds-cluster/general/']  #S3階層固定値指定
    variable_key=datetime.now().strftime('%Y/%m/%d/%H/')  #S3階層可変(日時)値として利用
    key_name = datetime.now().strftime('%Y%m%d%H%M%S') + '.txt'  # S3に作成するオブジェクト名指定
    full_path_key=[] #キーフルパスを代入するリスト

    #キーフルパス作成
    for item in fixed_key:
        full_path_key.append(item + variable_key + key_name)
        print

    #S3アップロード
    for item in full_path_key:
        obj = s3.Object(bucket_name,item)
        obj.put( Body='test' )
        print("アップロード:" + obj.key)

    #S3オブジェクト一覧取得(キー名、更新日、ストレージクラスを出力)
    res_list_objects = s3_client.list_objects_v2(Bucket=bucket_name)
    for obj in res_list_objects['Contents']:
        key=obj["Key"]
        last_modified=obj["LastModified"]
        storage_class=obj["StorageClass"]
        print('{},{},{}'.format(key, last_modified,storage_class))

バケット名などLambda Functionの環境変数で指定しました。

$ FUNCTION_NAME=TestPutObject
$ aws lambda get-function \
  --function-name ${FUNCTION_NAME} \
  --query 'Configuration.Environment'
{
    "Variables": {
        "TZ": "Asia/Tokyo",
        "BUCKET_NAME": "test-lifecycle-bucket-2020"
    }
}

Lambda Functonに付与するロールには、該当バケットへのPUT権限が必要になりますのでご注意ください。

CloudWatch Rule

Lambda Functionが自動起動するよう、CloudWatch RuleをCron式で設定しました。ここでは、18:00 JST/日時で起動するようにしています。

$ EVENT_NAME=TestPutObjectRule
$ aws events describe-rule \
    --name ${EVENT_NAME}
{
    "Name": "TestPutObjectRule",
    "Arn": "arn:aws:events:ap-northeast-1:XXXXXXXXXXXX:rule/TestPutObjectRule",
    "ScheduleExpression": "cron(0 9 * * ? *)",
    "State": "ENABLED",
    "EventBusName": "default"
}

CloudWatch Ruleの詳細については以下をご確認ください。

S3ライフサイクル設定

該当バケットに以下のライフサイクルを設定しました。

ルール名 プレフィックス ストレージクラス移行 失効
audit-lifecycle rds-cluster/audit/ 1日(Glacier) 2日
general-lifecycle rds-cluster/general/ 1日

以下、AWS CLIでライフサイクルルールを確認した結果です。


ライフサイクルルール設定
$ BUCKET_NAME=test-lifecycle-bucket-2020
$ aws s3api get-bucket-lifecycle-configuration \
  --bucket ${BUCKET_NAME} \
  --output json
{
    "Rules": [
        {
            "Expiration": {
                "Days": 2
            },
            "ID": "audit-lifecycle",
            "Filter": {
                "Prefix": "rds-cluster/audit/"
            },
            "Status": "Enabled",
            "Transitions": [
                {
                    "Days": 1,
                    "StorageClass": "GLACIER"
                }
            ]
        },
        {
            "Expiration": {
                "Days": 1
            },
            "ID": "general-lifecycle",
            "Filter": {
                "Prefix": "rds-cluster/general/"
            },
            "Status": "Enabled"
        }
    ]
}

検証

検証準備後、数日放置しました。Lambda Functionが自動で起動され、CloudWatch Logsに以下ログを出力しています。

$ LOG_GROUP_NAME=/aws/lambda/${FUNCTION_NAME}
$ aws logs describe-log-streams \
  --log-group-name ${LOG_GROUP_NAME} \
  --query "logStreams[].logStreamName" \
  --output table
----------------------------------------------------------
|                   DescribeLogStreams                   |
+--------------------------------------------------------+
|  2020/05/17/[$LATEST]6fff1f2fa64a4b8a9083f4767a4a0aa4  |
|  2020/05/18/[$LATEST]b669fbec386f4f1cbd90d509a0d9fdc6  |
|  2020/05/19/[$LATEST]a64dd3a2a68a4f668d9ad7696502ca6a  |
|  2020/05/20/[$LATEST]e17a69353e394cb1b4346a19c4eb7fb9  |
|  2020/05/21/[$LATEST]e4a94efb76eb472c9a62f4cb3b842c3e  |
+--------------------------------------------------------+

こちらのログより、該当バケットに格納されたオブジェクト、ストレージクラスなどを確認していきたいと思います。

まずは、想定される動作を整理します。ライフサイクルのタイミングは、ルールに指定した日数を加算し、得られた日時の翌日 00:00 UTCに丸められ、その時刻を経過すると処理が行われます。

「audit-lifecycle」ルールを例に整理します。5/17 9:00 UTC(5/17 18:00 JST)にオブジェクトがPUTされると、ストレージクラス移行の場合は、ルールに指定した日数(1日)の加算と丸めこみで、5/19 00:00 UTC(5/19 9:00 JST)に処理が行われます。失効も考え方は同様で、ルールに指定した日数(2日)の加算と丸めこみで、5/20 00:00 UTC(5/20 9:00 JST)に処理が行われます。ここでは、Lambda Functionの実行タイミングは18:00 JSTなので、以下が想定されます。

以降は、Lambda Functionが出力したCloudWatch Logsの内容です。

5/17 18:00

ログストリーム2020/05/17/[$LATEST]6fff1f2fa64a4b8a9083f4767a4a0aa4の内容です。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                                                 message                                                                                  |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1589706005254 | START RequestId: 086307b1-1f71-4c76-b69e-aeaefab19b82 Version: $LATEST                                                                                                   |
| 1589706005573 | アップロード:rds-cluster/audit/2020/05/17/18/20200517180005.txt                                                                                                                |
| 1589706005627 | アップロード:rds-cluster/general/2020/05/17/18/20200517180005.txt                                                                                                              |
| 1589706005824 | rds-cluster/audit/2020/05/17/18/20200517180005.txt,2020-05-17 09:00:06+00:00,STANDARD                                                                                    |
| 1589706005824 | rds-cluster/general/2020/05/17/18/20200517180005.txt,2020-05-17 09:00:06+00:00,STANDARD                                                                                  |
| 1589706005826 | END RequestId: 086307b1-1f71-4c76-b69e-aeaefab19b82                                                                                                                      |
| 1589706005826 | REPORT RequestId: 086307b1-1f71-4c76-b69e-aeaefab19b82 Duration: 571.65 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 76 MB Init Duration: 387.08 ms   |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

20200517180005.txtのPUTが行われ、指定バケットのrds-cluster/auditrds-cluster/general配下にオブジェクトが格納されていることがわかります。

5/18 18:00

ログストリーム2020/05/18/[$LATEST]b669fbec386f4f1cbd90d509a0d9fdc6の内容です。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                                                 message                                                                                  |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1589792405063 | START RequestId: 96df977d-10e7-4a02-8181-e250351e5403 Version: $LATEST                                                                                                   |
| 1589792405388 | アップロード:rds-cluster/audit/2020/05/18/18/20200518180005.txt                                                                                                                |
| 1589792405438 | アップロード:rds-cluster/general/2020/05/18/18/20200518180005.txt                                                                                                              |
| 1589792405618 | rds-cluster/audit/2020/05/17/18/20200517180005.txt,2020-05-17 09:00:06+00:00,STANDARD                                                                                    |
| 1589792405618 | rds-cluster/audit/2020/05/18/18/20200518180005.txt,2020-05-18 09:00:06+00:00,STANDARD                                                                                    |
| 1589792405618 | rds-cluster/general/2020/05/17/18/20200517180005.txt,2020-05-17 09:00:06+00:00,STANDARD                                                                                  |
| 1589792405618 | rds-cluster/general/2020/05/18/18/20200518180005.txt,2020-05-18 09:00:06+00:00,STANDARD                                                                                  |
| 1589792405631 | END RequestId: 96df977d-10e7-4a02-8181-e250351e5403                                                                                                                      |
| 1589792405631 | REPORT RequestId: 96df977d-10e7-4a02-8181-e250351e5403 Duration: 566.76 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 76 MB Init Duration: 383.93 ms   |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

新たに20200518180005.txtのPUTが行われています。指定バケットには、20200517180005.txt20200518180005.txtが格納されている状態です。ライフサイクルの日時をむかえていないため、ストレージクラスの移行や、オブジェクトの失効は行われていません。

5/19 18:00

ログストリーム2020/05/19/[$LATEST]a64dd3a2a68a4f668d9ad7696502ca6aの内容です。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                                                 message                                                                                  |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1589878805083 | START RequestId: b18eaad2-db11-4dca-abc5-b62d40e55439 Version: $LATEST                                                                                                   |
| 1589878805361 | アップロード:rds-cluster/audit/2020/05/19/18/20200519180005.txt                                                                                                                |
| 1589878805413 | アップロード:rds-cluster/general/2020/05/19/18/20200519180005.txt                                                                                                              |
| 1589878805594 | rds-cluster/audit/2020/05/17/18/20200517180005.txt,2020-05-17 09:00:06+00:00,GLACIER                                                                                     |
| 1589878805594 | rds-cluster/audit/2020/05/18/18/20200518180005.txt,2020-05-18 09:00:06+00:00,STANDARD                                                                                    |
| 1589878805594 | rds-cluster/audit/2020/05/19/18/20200519180005.txt,2020-05-19 09:00:06+00:00,STANDARD                                                                                    |
| 1589878805594 | rds-cluster/general/2020/05/18/18/20200518180005.txt,2020-05-18 09:00:06+00:00,STANDARD                                                                                  |
| 1589878805594 | rds-cluster/general/2020/05/19/18/20200519180005.txt,2020-05-19 09:00:06+00:00,STANDARD                                                                                  |
| 1589878805613 | END RequestId: b18eaad2-db11-4dca-abc5-b62d40e55439                                                                                                                      |
| 1589878805613 | REPORT RequestId: b18eaad2-db11-4dca-abc5-b62d40e55439 Duration: 529.83 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 76 MB Init Duration: 365.98 ms   |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

新たに20200519180005.txtのPUTが行われています。ライフサイクルで指定した日時を経過しているので、rds-cluster/audit配下20200517180005.txtのストレージクラスが移行され、rds-cluster/general配下の20200517180005.txtが削除されました。

5/20 18:00

ログストリーム2020/05/20/[$LATEST]e17a69353e394cb1b4346a19c4eb7fb9の内容です。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                                                 message                                                                                  |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1589965205342 | START RequestId: b1b11d71-e64c-4b1a-a018-d7b2064f1b44 Version: $LATEST                                                                                                   |
| 1589965205677 | アップロード:rds-cluster/audit/2020/05/20/18/20200520180005.txt                                                                                                                |
| 1589965205847 | アップロード:rds-cluster/general/2020/05/20/18/20200520180005.txt                                                                                                              |
| 1589965205998 | rds-cluster/audit/2020/05/18/18/20200518180005.txt,2020-05-18 09:00:06+00:00,GLACIER                                                                                     |
| 1589965205998 | rds-cluster/audit/2020/05/19/18/20200519180005.txt,2020-05-19 09:00:06+00:00,STANDARD                                                                                    |
| 1589965205998 | rds-cluster/audit/2020/05/20/18/20200520180005.txt,2020-05-20 09:00:06+00:00,STANDARD                                                                                    |
| 1589965205998 | rds-cluster/general/2020/05/19/18/20200519180005.txt,2020-05-19 09:00:06+00:00,STANDARD                                                                                  |
| 1589965205998 | rds-cluster/general/2020/05/20/18/20200520180005.txt,2020-05-20 09:00:06+00:00,STANDARD                                                                                  |
| 1589965206012 | END RequestId: b1b11d71-e64c-4b1a-a018-d7b2064f1b44                                                                                                                      |
| 1589965206012 | REPORT RequestId: b1b11d71-e64c-4b1a-a018-d7b2064f1b44 Duration: 670.33 ms Billed Duration: 700 ms Memory Size: 128 MB Max Memory Used: 78 MB Init Duration: 392.61 ms   |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

新たに20200520180005.txtのPUTが行われています。ライフサイクルで指定した日時を経過しているので、ストレージクラスが移行されたrds-cluster/audit配下の20200517180005.txtは削除され、20200518180005.txtのストレージクラスが移行されています。rds-cluster/general配下にあった、20200518180005.txtが削除されました。

5/21 18:00

ログストリーム2020/05/21/[$LATEST]e4a94efb76eb472c9a62f4cb3b842c3eの内容です。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                                                 message                                                                                  |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1590051605007 | START RequestId: 38c59e96-ed33-4123-83f8-874fd7965762 Version: $LATEST                                                                                                   |
| 1590051605319 | アップロード:rds-cluster/audit/2020/05/21/18/20200521180005.txt                                                                                                                |
| 1590051605400 | アップロード:rds-cluster/general/2020/05/21/18/20200521180005.txt                                                                                                              |
| 1590051605558 | rds-cluster/audit/2020/05/19/18/20200519180005.txt,2020-05-19 09:00:06+00:00,GLACIER                                                                                     |
| 1590051605558 | rds-cluster/audit/2020/05/20/18/20200520180005.txt,2020-05-20 09:00:06+00:00,STANDARD                                                                                    |
| 1590051605576 | rds-cluster/audit/2020/05/21/18/20200521180005.txt,2020-05-21 09:00:06+00:00,STANDARD                                                                                    |
| 1590051605576 | rds-cluster/general/2020/05/20/18/20200520180005.txt,2020-05-20 09:00:06+00:00,STANDARD                                                                                  |
| 1590051605576 | rds-cluster/general/2020/05/21/18/20200521180005.txt,2020-05-21 09:00:06+00:00,STANDARD                                                                                  |
| 1590051605578 | END RequestId: 38c59e96-ed33-4123-83f8-874fd7965762                                                                                                                      |
| 1590051605578 | REPORT RequestId: 38c59e96-ed33-4123-83f8-874fd7965762 Duration: 570.26 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 78 MB Init Duration: 338.55 ms   |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

新たに20200521180005.txtのPUTが行われています。ライフサイクルで指定した日時を経過しているので、ストレージクラスが移行されたrds-cluster/audit配下の20200518180005.txtは削除され、20200519180005.txtのストレージクラスが移行されています。rds-cluster/general配下にあった、20200519180005.txtが削除されました。

確認したログは以上です。想定した動作となりました。

さいごに

プレフィックスを指定したライフサイクルルールの動作を確認してみました。今回はS3スタンダードから、S3 Glacierへストレージを移行しました。移行先のストレージによっては、制約等が異なりますのでご注意ください。

ライフサイクルルール設定方法など、誰かのお役に立てれば幸いです。

参考