3月 28, 2022 AWS , S3
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)
{
"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)
{
"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 をユニークにする必要があります。
{
"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
{
"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
}
}
...
]
}
関連資料