👏

Glacier Flexible Retrieval から Glacier Instant Retrieval に変換する方法(S3)

2024/11/22に公開

AWS S3 へのファイルの保存形式(Storage Class)は複数種類があり、そのうち低頻度のアクセスしかないものは Glacier という形式で保存することで予算を抑えられることはよく知られている。

Glacier についても幾つかの種類があり、2024年11月現在では以下の種類が存在する

  • Glacier Deep Archive
  • Glacier Flexible Retrieval
  • Glacier Instnat Retrieval

上に行くほど保存料金は安いが、取り出す時にコスト(時間、お金)がかかるというモデルになっている。

Glacier の仕様について詳細に語るのは記述が冗長になるので、この記事では直近直面した事象(Flexible Retrieval から Instant Retrieval への変換)についてスコープを置いて以下記述する。

Glacier Instant Retrieval の特徴

https://aws.amazon.com/jp/s3/storage-classes/glacier/instant-retrieval/

Glacier と名前がついているが、復元にかかる時間が極小化されており数ミリ秒で取得することができる Storage Class。Standard-IA よりは安く、そして復元コストについては Glacier (Flexible Retrieval)よりも少なく済む、という立ち位置のものになる。

以下テーブルは2024年11月現在のスナップショット。詳細はAWSのサイトを確認ください。
Glacier Instant Retrieval のストレージ料金は Glacier Flexible Retrieval の約10倍、ただし取り出しにかかる時間もお金もコストが低い、というのが特徴になる。

storage class price データ取り出しリクエスト (1,000 リクエストあたり) データ取り出し (GB あたり)
Glacier Instant Retrieval USD 0.005/GB なし USD 0.03
Glacier Flexible Retrieval USD 0.0045/GB USD 11.00 (Expedited) / なし(Bulk) USD 0.033 / なし(Bulk)

Glacier Flexible Retrieval から Glacier Instant Retrieval への変換方法

Glacier Flexible Retrieval で保存されたファイルは、そのままの形では Storage Class の変換を行うことができない。
以下のように、一度 Glacier から復元し、復元されたファイルを copy して Storage Class を変換する必要がある。

  1. Glacier への復元リクエスト
  2. (復元待ち)
  3. データを一時領域に保存(copy)。その際にストレージクラスを変更
  4. 元のオブジェクトの削除
  5. 2で作成したファイルを3の場所に移動

Glacier Flexible Retrieval への復元リクエスト

Glacier Flexible Retrieval の復元方法は3種類ある。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/restoring-objects-retrieval-options.html

type duration price
Expedited 1~5 分 $11.00 per 1,000 requests
Standard 3~5 時間 $0.03426 per 1,000 requests
Bulk 5~12 時間 $0.00 per 1,000 requests

Expedited モードは、復元速度は速いがお金がかかる。
Bulk モードは、復元に時間がかかるがお金はかからない。
Standard モードは、Expedited と Bulk の中間。

Standard は中途半端な印象があり、速く復元したいのなら Expedited、 お金をかけたくないなら Bulk、という選択肢になると思われる。

復元対象の Glacier Flexible Retrieval ファイルのリストを取得する AWS CLI コマンド

aws s3api list-objects --bucket ${BUCKET_NAME} --prefix ${PREFIX} --query "Contents[?StorageClass=='GLACIER'].[Key]" --output text 

結果をリダイレクトしてファイルに残しておくと後続の処理が行いやすい。

復元を行う AWS CLI コマンド

上述の1の手順を行うコマンド。
以下は Bulk モードで復元し、復元したファイルを7日間保持する例。

1. retrieve
aws s3api restore-object --bucket "${BUCKET_NAME}" --key "${KEY}" --restore-request '{"Days":7,"GlacierJobParameters":{"Tier":"Bulk"}}'

Bulk モードでの復元だと最大12時間処理に時間がかかるため、以降の処理は復元を待っての作業となる。

変換を行う AWS CLI コマンド

上述の3~5の手順を行うコマンド。
ファイルの置き換え後、Storage Class が意図通り変換されているかを確認するために最後に該当ファイルのStorage Class の取得を行っています。

# 3. cp
aws s3 cp s3://${BUCKET_NAME}/${KEY} s3://${BUCKET_NAME}/${KEY}.temp --storage-class GLACIER_IR
# 4. rm
aws s3 rm s3://${BUCKET_NAME}/${KEY} 
# 5. mv
aws s3 mv s3://${BUCKET_NAME}/${KEY}.temp s3://${BUCKET_NAME}/${KEY} --storage-class GLACIER_IR
# describe storage class
result=$(aws s3api head-object --bucket ${BUCKET_NAME} --key ${KEY} --query "StorageClass")
echo "storage class:  ${result}"

Discussion