Trusted Advisorで「S3 の不完全なマルチパートアップロードの中止設定」が推奨されたので対処してみた
こんにちは、AWS事業本部 コンサルティング部の荒平(@0Air)です。
Trusted Advisorを普段ご覧の方は、ご存知の方が多いと思いますが、
2023 年 12 月 7 日に「Amazon S3 で不完全なマルチパートアップロードを中止するための設定」が追加されていました。
この項目に対応するための備忘録です。
これは何?
説明文を見てみましょう。
(説明文)
各 S3 バケットに、7 日間が経過しても未完了のままとなっているマルチパートアップロードを中止する
ライフサイクルルールが設定されていることを確認してください。
これらの不完全なアップロードを中止したり、関連付けられたストレージを削除したりするためにライフサイクルルール
を使用することが推奨されています。
(アラート基準)
黄色: ライフサイクル設定バケットには、7 日間が経過しても未完了のままとなっている
すべてのマルチパートアップロードを中止するライフサイクルルールが含まれていません。
マルチパートアップロードでは、1つのファイル(オブジェクト)を複数に区分し、それぞれのパーツごとにS3バケットへアップロードすることができます。
一般的に100MBを超えるようなファイルをアップロードする際は、マルチパートアップロードを利用して複数のパーツに分けてアップロードすることが推奨されています。
これを利用すれば、スループットの向上、ネットワーク問題からの回復、アップロードの一時停止が可能です。
特に大容量のファイルでは、ネットワークの切断が発生した場合でも、最初からアップロードし直す必要が無い点が嬉しいです。
このマルチパートアップロード(MPU)が不完全な状態で放置されると、予期しないストレージコストが発生する場合があるため、7日が経過しても完了しないマルチパートアップロードは中止する、という設定を入れることがベストプラクティスになっています。
デフォルトでは、このライフサイクル設定は入っていないため、私個人のアカウントでも大半のバケットに警告が出ていました。
対応方法
CloudShellからAWS CLIのコマンドを実行することで対応します。
前提として、特にCloudShellの起動権限、S3のライフサイクルを付与する権限を持つユーザーで操作するものとします。
【注意】このコマンドは、既存のライフサイクルルールを書き換えるため、既にS3バケットにルールが設定されている場合は利用に注意してください。
1. JSONファイルを用意する
以下のコードを lifecycle.json
として保存します。(ファイル名は任意)
vim lifecycle.json
{
"Rules": [
{
"ID": "AbortIncompleteMultipartUpload",
"Status": "Enabled",
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
},
"Filter": {
"Prefix": ""
}
}
]
}
なお、DaysAfterInitiation
で7日経過したものを中止する設定にしていますが、環境に応じて日数を短くして問題ありません。
アーカイブなど他のルールを追加したい場合は、お好みでアレンジしてください。
2. バケットに対してライフサイクルポリシーを適用する
S3APIコマンドにてライフサイクルを設定します。
aws s3api put-bucket-lifecycle-configuration --bucket {バケット名} --lifecycle-configuration file://lifecycle.json
3. バケットへライフサイクルポリシーが適用されていることを確認する
以下のコマンドで確認することができます。
1で保存したポリシーが表示されれば完了です。
aws s3api get-bucket-lifecycle-configuration --bucket {バケット名}
主な手順はここまでですが、アカウント内に大量のバケットがある場合、ちまちま実施するのは避けたいところです。
なので、一括で実施できるスクリプトを作りました。
対応方法(一括)
【注意】このスクリプトは、既存のライフサイクルルールを書き換えるため、既にS3バケットにルールが設定されている場合は利用に注意してください。
例えば、30日後にGlacierへ移動するという設定を入れている場合は、スクリプトの実行で無くなってしまいます。
バケットにルール配布したい場合は、lifecycle.json
を書き換えるなど十分注意してください。
#!/bin/bash
buckets=({amazon-s3-bucket-name-1} {amazon-s3-bucket-name-2} {amazon-s3-bucket-name-3} ...)
cat << EOF > lifecycle.json
{
"Rules": [
{
"ID": "AbortIncompleteMultipartUpload",
"Status": "Enabled",
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
},
"Filter": {
"Prefix": ""
}
}
]
}
EOF
for bucket in "${buckets[@]}"
do
echo "Configuring bucket: $bucket"
aws s3api put-bucket-lifecycle-configuration --bucket "$bucket" --lifecycle-configuration file://lifecycle.json
if [ $? -eq 0 ]; then
echo "Configuration applied successfully to $bucket"
else
echo "Failed to apply configuration to $bucket"
fi
done
rm lifecycle.json
echo "Configuration process completed."
上記のスクリプトを保存して実行します。
vim config-s3.sh
chmod +x config-s3.sh
sh config-s3.sh
Failedが出ていなければ、正常にライフサイクルポリシーが適用されています。
Trusted Advisorでは、即時チェックはされないため最大1日程度待つことになりますが、ステータスが変わって問題なくなっていることを確認できました。
おわりに
「マルチパートアップロードなんて使ってないよ!」という声が聞こえそうですが、aws s3 cp
や aws s3 sync
を利用すると自動で容量に応じてマルチパートになります。
マルチパートアップロードは仕様上、「完了または中止された後にのみ、パートの保存に使用されていたスペースを解放し、保存に対する課金を停止」されるため(参考)、知らずに課金が発生している環境もあるかもしれません。
是非、Trusted Advisorを活用して中止設定が入っているか確認してください!
このエントリが誰かの助けになれば幸いです。
それでは、AWS事業本部 コンサルティング部の荒平(@0Air)がお送りしました!
参考