S3 ライフサイクル管理をAWS CLI から設定する方法
S3 オブジェクトのライフサイクル管理とは
概要
- 以前、こちらの記事でS3にライフサイクルによる移行・有効期限アクションを設定する方法を紹介しました。今回は、AWS CLI から設定する方法を記載します。
- 先ず、ライフサイクルの概要です。ライフサイクル管理には、2種類のアクションがあります。
- 移行アクション
- 別のストレージクラスにオブジェクトを移行するタイミングを定義します。(例:デフォルトのSTANDARTからファイルの作成後365日目にGLACIER に移行)
- ストレージクラスによって、対象とされるアクセス頻度や可用性が異なります。また、ストレージクラスによって最小ストレージ期間が異なるため、注意してください。(例:GLACIERは90日未満であって90日分の料金が請求されます)
- 有効期限アクション
- オブジェクトの有効期限を定義します。バケットのバージョニング対応の可否によって、有効期限切れのオブジェクトが完全に削除されるか否かが異なります。
コストの留意事項
- コスト効率化のために行ったストレージクラスの移行が逆にコスト増加につながる可能性もあります。例えば、Glacierへのライフサイクル移行アクションは、リクエスト 1,000 件ごとに 0.0571USDかかります。特にELBやCloudFrontのアクセスログのような1オブジェクトのサイズが小さく、かつオブジェクトの数が多いような用途での移行は、移行にかかるコストの方が高くなることもあり得ます。
ライフサイクル管理の特徴
ログについて
- ライフサイクルのアクションは、CloudTrail には記録されません。(CloudTrail は外部エンドポイントに対して行われたリクエストのみをキャプチャするため)
- ライフサイクルのアクションは、S3 サーバーアクセスログを有効にすることでログに記録されます。以下、アクションごとの例です。
- S3.EXPIRE.OBJECT: ライフサイクルの有効期限が切れたため、オブジェクトを完全に削除した。
- S3.TRANSITION.OBJECT: オブジェクトの GLACIER ストレージクラスへの移行を開始した。
オブジェクトの 失効と完全削除について
- ライフサイクル管理は、バージョニング対応(バージョニング有効化あるいはバージョニングの使用を停止させた状態)およびバージョニング非対応(バージョニング無効化)のどちらのバケットにも追加できます。
- オブジェクトの失効は、バージョニング対応の可否によって動作が異なります。バージョニング非対応の場合は、失効によって、オブジェクトは完全に削除されます。
- バージョニング対応の場合は、失効は最新のバージョンにのみ適用されます。既存の最新バージョンは、以前のバージョンとして保持されます。
AWS CLI でライフサイクルを管理する方法
- 今回は、180日経過後にオブジェクトを削除するシンプルなルールを作成します。
- s3api put-bucket-lifecycle-configuration を使用しますが、注意すべき点は、ライフサイクルルールは上書きされるため、既存のルールがある場合はルールの置き換えとなります。必要に応じて、新規ルールに既存のルールを含めます。
CLIでライフサイクルルールを確認する
- 現在のライフサイクルルールを確認します。以下は、ライフサイクルルールが設定されていない状態です。
$ aws s3api get-bucket-lifecycle-configuration --bucket バケット名
An error occurred (NoSuchLifecycleConfiguration) when calling the GetBucketLifecycleConfiguration operation: The lifecycle configuration does not exist
CLIでバケット全体にルールを設定する
- ルールを記載したJSON を準備します。(例: bucket-rule.json)
- サンプルJSON
{
"Rules": [
{
"Expiration": {
"Days": 180
},
"ID": "Bucket-Rules for deletion after 180 days",
"Filter": {},
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 1
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}
- バケット全体にルールを設定します。オプションにバケット名(例: niikawa-test)、JSONファイルを指定します。
$ aws s3api put-bucket-lifecycle-configuration --bucket niikawa-test --lifecycle-configuration file://bucket-rule.json
- 現在のライフサイクルルールを確認します。
$ aws s3api get-bucket-lifecycle-configuration --bucket niikawa-test
{
"Rules": [
{
"Expiration": {
"Days": 180
},
"ID": "Bucket-Rules for deletion after 180 days",
"Filter": {},
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 1
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}
- コンソールから確認すると下記の設定となります。
- 詳細は、下記の通り。
CLIでフォルダに対するルールを設定する
- ルールを記載したJSON を準備します。(例: folder-rule.json)
- サンプルJSON
{
"Rules": [
{
"Expiration": {
"Days": 180
},
"ID": "Folder-Rules for deleting after 180 days",
"Filter": {
"Prefix": "dir1/"
},
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 1
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}
- フォルダにルールを設定します。オプションにバケット名(例: niikawa-test)、JSONファイルを指定します。
$ aws s3api put-bucket-lifecycle-configuration --bucket niikawa-test --lifecycle-configuration file://folder-rule.json
- 現在のライフサイクルルールを確認します。
$ aws s3api get-bucket-lifecycle-configuration --bucket niikawa-test
{
"Rules": [
{
"Expiration": {
"Days": 180
},
"ID": "Folder-Rules for deleting after 180 days",
"Filter": {
"Prefix": "dir1/"
},
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 1
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}
- コンソールから確認すると下記の設定となります。
- 詳細は、下記の通り。
CLIでフォルダに対する複数のルールを設定する
- 複数のルールを記載することも可能です。ルールを記載したJSON を準備します。(例: folder-rule2.json)
- 複数のルールを記載する場合は、Rule ID をユニークにする必要があります。
- サンプルJSON
{
"Rules": [
{
"Expiration": {
"Days": 180
},
"ID": "Folder-Rules for deleting after 180 days",
"Filter": {
"Prefix": "dir1/"
},
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 1
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
},
{
"Expiration": {
"Days": 365
},
"ID": "Folder-Rules for deleting after 365 days",
"Filter": {
"Prefix": "dir2/"
},
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 1
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}
- フォルダにルールを設定します。
$ aws s3api put-bucket-lifecycle-configuration --bucket niikawa-test --lifecycle-configuration file://folder-rule2.json
- 現在のライフサイクルルールを確認します。
$ aws s3api get-bucket-lifecycle-configuration --bucket niikawa-test
{
"Rules": [
{
"Expiration": {
"Days": 180
},
"ID": "Folder-Rules for deleting after 180 days",
"Filter": {
"Prefix": "dir1/"
},
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 1
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
},
{
"Expiration": {
"Days": 365
},
"ID": "Folder-Rules for deleting after 365 days",
"Filter": {
"Prefix": "dir2/"
},
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 1
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}
- コンソールから確認すると下記の設定となります。
(参考)CLIでライフサイクルルールを削除する
- ライフサイクルルールを削除する場合は、以下となります。
$ aws s3api delete-bucket-lifecycle --bucket niikawa-test
JSON Syntax
- 以下、JSON 構文です。(出典: AWS CLI Command Reference, put-bucket-lifecycle-configuration)
{ "Rules": [ { "Expiration": { "Date": timestamp, "Days": integer, "ExpiredObjectDeleteMarker": true|false }, "ID": "string", "Prefix": "string", "Filter": { "Prefix": "string", "Tag": { "Key": "string", "Value": "string" }, "ObjectSizeGreaterThan": long, "ObjectSizeLessThan": long, "And": { "Prefix": "string", "Tags": [ { "Key": "string", "Value": "string" } ... ], "ObjectSizeGreaterThan": long, "ObjectSizeLessThan": long } }, "Status": "Enabled"|"Disabled", "Transitions": [ { "Date": timestamp, "Days": integer, "StorageClass": "GLACIER"|"STANDARD_IA"|"ONEZONE_IA"|"INTELLIGENT_TIERING"|"DEEP_ARCHIVE"|"GLACIER_IR" } ... ], "NoncurrentVersionTransitions": [ { "NoncurrentDays": integer, "StorageClass": "GLACIER"|"STANDARD_IA"|"ONEZONE_IA"|"INTELLIGENT_TIERING"|"DEEP_ARCHIVE"|"GLACIER_IR", "NewerNoncurrentVersions": integer } ... ], "NoncurrentVersionExpiration": { "NoncurrentDays": integer, "NewerNoncurrentVersions": integer }, "AbortIncompleteMultipartUpload": { "DaysAfterInitiation": integer } } ... ] }