コマンド
aws s3api list-objects-v2 \
--bucket <bucket_name> \
--prefix <prefix> \
--query 'Contents[?(LastModified >= `開始日時` && LastModified <= `終了日時` && StorageClass==`ストレージクラス`)].[Key]' \
--output text | \
xargs -I {} sh -c \
"aws s3api restore-object --bucket <bucket_name> --key \"{}\" --restore-request Days=5,GlacierJobParameters={Tier=Standard} || true"
使い方
-
開始日時
,終了日時
を2025-01-01
,2025-01-01T10:00:00
,2025-01-01T10:00:00+00:00
のようにISO 8601形式のUTCで記述 -
<bucket_name>
を対象のバケット名で置き換え -
<prefix>
を対象のオブジェクトで共通のプレフィックスで置き換える -
ストレージクラス
を対象オブジェクトに合わせてGLACIER
またはDEEP_ARCHIVE
に置き換える -
Days=5
,Tier=Standard
も適宜変えてください
解説
Tier (BulkとStandard)
違いはトレードオフになっている復元の料金と時間です。
- Standard (デフォルト)
- 12時間以内で復元できます
- 東京リージョンで1 GBあたり0.022 USDかかります cf. https://dev.classmethod.jp/articles/tsnote-s3-glacier-deep-archive-cost/
- Bulk
- ペタバイト級のデータを安く復元させるユースケースで使います
- 最大48時間かかりますが、Standardに比べて8割ほど安いです
--query
で使うJMESPath
リファレンスを見る限り、文字列で解釈されるLastModified
で順序演算子(>
, <
など)を使うと結果はnull
になると書いてますが、動作確認する限りはちゃんと使えていました。
JMESPathとか詳しくなりたくないので、よく分からないです
一応、AWS CLI v2ユーザーガイドでも別のケースで日付をフィルターする例が紹介されています。
参考