Amazon S3オブジェクトのライフサイクルをAWS CLIから設定する

Amazon S3のライフサイクル設定を使用すると、バケット内のオブジェクトのライフサイクル管理を指定することができます。

具体的には以下のアクションを定義できます。

これらのアクションにより、ストレージコストを抑えたり、古いデータを定期的に掃除したりできます。

今回は、このAmazon S3ライフサイクルをCLIから操作する方法を紹介します。

ライフサイクル操作用APIについて

ライフサイクルを操作するには以下のAPIを利用します。

以下のAPIは非推奨のため、新規には使わないようにして下さい。

  • 参照 get-bucket-lifecycle
  • 設定 put-bucket-lifecycle

ライフサイクルを確認

バケットに設定されたライフサイクルを確認するには get-bucket-lifecycle-configuration API を利用します。

引数にバケット名を指定します。

ライフサイクルが設定されていない場合

HTTP 404ステータスで NoSuchLifecycleConfiguration エラーが発生します。

$ aws s3api get-bucket-lifecycle --bucket BUCKET_NAME

An error occurred (NoSuchLifecycleConfiguration) when calling the GetBucketLifecycle operation: The lifecycle configuration does not exist

ライフサイクルが設定されている場合

バケットに設定されているライフサイクルがJSONでかえってきます。

$ aws s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME
{
    "Rules": [
        {
            "Filter": {
                "Prefix": "documents/"
            },
            "Status": "Enabled",
            "Transitions": [
                {
                    "Days": 365,
                    "StorageClass": "GLACIER"
                }
            ],
            "Expiration": {
                "Days": 3650
            },
            "ID": "documents"
        }
    ]
}

各ルールにはStatusというフィールドが存在し、ルール単位で有効/無効(Enabled/Dsiabled)を制御できます。 「ルールが存在する」と「ルールが有効である」は別のため、注意して下さい。

ライフサイクルを設定

バケットに新しいライフサイクルを設定するには put-bucket-lifecycle-configuration API を利用します。

引数にバケット名ルールを指定します。

新規にルールを追加

365日後にGLACIERに移行("Transitions")し、3650日後に削除("Expiration")されるルールをJSONで用意します。

{
    "Rules": [
        {
            "Filter": {
                "Prefix": "documents/"
            },
            "Status": "Enabled",
            "Transitions": [
                {
                    "Days": 365,
                    "StorageClass": "GLACIER"
                }
            ],
            "Expiration": {
                "Days": 3650
            },
            "ID": "documents"
        }
    ]
}

バケット名とルールを指定して put-bucket-lifecycle-configuration API を叩きます。

$ aws s3api put-bucket-lifecycle-configuration \
  --bucket BUCKET_NAME \
  --lifecycle-configuration file://simple.json
$

レスポンスボディーはありません。 設定したルールを確認しましょう。

$ aws s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME
{
    "Rules": [
        {
            "Filter": {
                "Prefix": "documents/"
            },
            "Status": "Enabled",
            "Transitions": [
                {
                    "Days": 365,
                    "StorageClass": "GLACIER"
                }
            ],
            "Expiration": {
                "Days": 3650
            },
            "ID": "documents"
        }
    ]
}

無事設定されていますね。

新しいルールを追加

新規にルールを追加したい場合は、まずは既存のルールと新規ルールをまとめたJSONを用意します。

{
    "Rules": [
        {
            "Filter": {
                "Prefix": "documents/"
            },
            "Status": "Enabled",
            "Transitions": [
                {
                    "Days": 365,
                    "StorageClass": "GLACIER"
                }
            ],
            "Expiration": {
                "Days": 3650
            },
            "ID": "documents"
        },
        {
            "Filter": {
                "Prefix": "logs/"
            },
            "Status": "Enabled",
            "Expiration": {
                "Days": 30
            },
            "ID": "logs"
        }
    ]
}

同じAPIを呼び出して設定を更新します。

$ aws s3api put-bucket-lifecycle-configuration \
  --bucket BUCKET_NAME \
  --lifecycle-configuration file://updated.json
$
$ aws s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME
{
    "Rules": [
        {
            "Filter": {
                "Prefix": "documents/"
            },
            "Status": "Enabled",
            "Transitions": [
                {
                    "Days": 365,
                    "StorageClass": "GLACIER"
                }
            ],
            "Expiration": {
                "Days": 3650
            },
            "ID": "documents"
        },
        {
            "Filter": {
                "Prefix": "logs/"
            },
            "Status": "Enabled",
            "Expiration": {
                "Days": 30
            },
            "ID": "logs"
        }
    ]
}

新しいライフサイクルに置き換わっています。

新しく追加されたルールは既存のオブジェクトとそれ以降に追加されるオブジェクトの両方に適用されます。

同様にして、ルールを削る場合は、削った状態のルール一式を put-bucket-lifecycle-configuration で更新すればOKです。

ライフサイクルを削除

バケットに設定されたライフサイクルを削除するには delete-bucket-lifecycle API を利用します。

引数にバケット名を指定します。

$ aws s3api delete-bucket-lifecycle --bucket BUCKET_NAME
$

レスポンスボディーはありません。

ライフサイクル設定を確認しましょう。

$ aws s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME

An error occurred (NoSuchLifecycleConfiguration) when calling the GetBucketLifecycleConfiguration operation: The lifecycle configuration does not exist

ライフサイクルが削除されていないため NoSuchLifecycleConfiguration エラーが発生しました。

APIの注意点

ライフサイクルAPIにはいくつかの注意点があります。

操作の粒度

設定・参照・削除ともにバケット単位でしか操作できません。 ルールIDを指定するなどして、ルール単位で参照・設定・削除する手段は用意されていません。

設定書式は XML? それとも JSON?

CLIから操作する場合、ライフサイクル設定のインターフェースはJSONです。 REST APIとしてはXMLのため、REST APIリファレンスを読むときは読み替えましょう(CLIがJSON↔XMLを変換)

ライフサイクルを無効・削除した時の影響

ライフサイクルを無効・削除すると、オブジェクトの移行・削除スケジュールは解除され、オブジェクトの削除や移行は実行されません。

非推奨APIは使わない

繰り返しになりますが以下の非推奨APIは使わないようにして下さい。

  • 参照 get-bucket-lifecycle
  • 更新 put-bucket-lifecycle

APIは非推奨な上、ライフサイクルフォーマットも異なるため、混乱のもとです。

代わりに

  • 参照 get-bucket-lifecycle-configuration
  • 更新 put-bucket-lifecycle-configuration

を使って下さい。

マネジメントコンソールではどこからライフサイクルを設定する?

2016年11月にS3のマネジメントインターフェースが変更されました。 新UIでは「Management→Lifecycle」以下で設定します。

amc-s3-lifecycle

参照