S3 Glacierストレージクラスの挙動を確認してみた

# 背景・目的
以前、下記の記事でストレージクラスやIntelligent-Tieringについて整理しました。今回は、Glacierについて整理し、挙動を確認してみます。

https://qiita.com/zumax/items/882d2ccc9f6f9598ff08

https://qiita.com/zumax/items/16d6479c7cf37bbd05e3


# まとめ
下記に特徴を整理します。

|特徴 |説明|
|:--|:--|
|Glacierストレージクラス|頻繁にはアクセスされない長期データを保存するためのコスト効率の高いソリューションを提供している|
|3つのストレージクラス|・S3 Glacier Instant Retrieval<BR>・S3 Glacier Flexible Retrieval<BR>・S3 Glacier Deep Archive|
|CLIでストレージクラスを指定する|`aws s3 cp ${ローカルファイルパス} s3://{オブジェクト} --storage-class {ストレージクラス}`<BR><BR>Glacierのストレージクラスは下記が指定可能<BR>・GLACIER_IR<BR>・GLACIER<BR>・DEEP_ARCHIVE|
|CLIでストレージクラスを確認する|`aws s3api head-object --bucket ${バケット名} --key ${オブジェクトキー}`|
|最小ストレージ期間|最小ストレージ期間前に、下記の操作を行うと残りの期間に対して料金が請求される<BR>・削除<BR>・上書き<BR>・別のストレージクラスに移行|
|アーカイブ用途|下記のストレージクラスは、リアルタイムアクセスはできない<BR>・S3 Glacier Flexible Retrieval<BR>・S3 Glacier Deep Archive|
|Instant Retrieval|ミリ秒単位での取り出しが要求される長期データに使用することを推奨<BR><BR>パフォーマンスが重視されるユースケースに最適<BR><BR>S3 Standard-IA と比較して、ストレージコストは低くなり、データアクセスコストは高くなる<BR><BR>最小オブジェクトサイズは 128 KB（最低128KBの料金で課金される）<BR><BR>最小ストレージ期間は 90 日間|
|Flexible Retrieval|年1〜2回程度のアクセス頻度<BR>即時アクセスを必要としないアーカイブ<BR> 数分〜数時間のアクセス時間<BR>無料の一括取り出し<BR>バックアップとディザスタリカバリに最適<BR>最小ストレージ期間は、90日間<BR>オブジェクトごとに40KBのメタデータが必要|
|Flexible Retrievalのリストア|アクセスするにはリストアが必要<BR><BR>取り出しには3つの階層がある<BR>・迅速取り出し<BR>・標準取り出し<BR>・一括取り出し|
|Deep Archive|アクセス頻度は、1年に1回未満のアーカイブデータ<BR>バックアップ、ディザスタリカバリ<BR>AWSで最も低コストのストレージオプション<BR> 最小ストレージ期間は180日間<BR>オブジェクトごとに40KBのメタデータが必要|
|Deep Archiveリストア|アクセスするには、復元リクエストが必要<BR><BR>取り出しには2つの階層がある<BR>・標準取り出し<BR>・一括取り出し|


## S3 Glacier ストレージクラスを選択する際の検討ポイント
|ストレージクラス|最小ストレージ期間|推奨アクセス頻度|平均取り出し時間|アーカイブ目的|
|:--|:--|:--|:--|:--|
|Instant Retrieval|90日間|四半期に一度|ミリ秒|不可|
|Flexible Retrieval|90日間|半年に一度|数分〜12H|可|
|Deep Archive|180日間|年に一度|9〜48H|可|


# 概要
下記のドキュメントを基に整理します。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/glacier-storage-classes.html

> Amazon S3 S3 Glacier ストレージクラスを使用すると、頻繁にはアクセスされない長期データを保存するためのコスト効率の高いソリューションを提供できます。S3 Glacier ストレージクラスは、次の 3 種類のストレージクラスに分類されます。
> - S3 Glacier Instant Retrieval
> - S3 Glacier Flexible Retrieval
> - S3 Glacier Deep Archive

> データにアクセスする頻度とデータの取り出し速度に応じて、これらのストレージクラスのいずれかを選択します。各ストレージクラスは S3 Standard ストレージクラスと同様の耐久性と回復性を、より低いストレージコストで提供します。S3 Glacier ストレージクラスの詳細については、https://aws.amazon.com/s3/storage-classes/glacier/ を参照してください。


- 頻繁にはアクセスされない長期データを保存するためのコスト効率の高いソリューションを提供している
- 下記のストレージクラスが存在する
    - S3 Glacier Instant Retrieval
    - S3 Glacier Flexible Retrieval
    - S3 Glacier Deep Archive


## S3 Glacier ストレージクラスの比較
> 各 S3 Glacier ストレージクラスには、すべてのオブジェクトについて、最小ストレージ期間があります。最小ストレージ期間より前にオブジェクトを削除、上書き、または別のストレージクラスに移行した場合、その期間の残りに対して料金が請求されます。

> S3 Glacier ストレージクラスの一部はアーカイブ用で、これらのクラスに保存されているオブジェクトはアーカイブされ、リアルタイムアクセスには使用できません。詳細については、「S3 Glacier Flexible Retrieval および S3 Glacier Deep Archive はアーカイブストレージクラスです。」を参照してください。

> 取り出し時間が長い低頻度アクセスパターン用に設計されたストレージクラスでは、ストレージコストがより低くなります。料金情報については、https://aws.amazon.com/s3/pricing/ を参照してください。


- S3 Glacier ストレージクラスには、すべてのオブジェクトについて最小ストレージ期間がある。最小ストレージ期間前に、下記の操作を行うと残りの期間に対して料金が請求される
    - 削除
    - 上書き
    - 別のストレージクラスに移行
- 下記のストレージクラスは、リアルタイムアクセスはできない
    - 3 Glacier Flexible Retrieval
    - S3 Glacier Deep Archive


> 次の表は、S3 Glacier ストレージクラスを選択する際に検討すべき重要ポイントをまとめたものです。


|ストレージクラス|最小ストレージ期間|推奨アクセス頻度|平均取り出し時間|アーカイブ目的|
|:--|:--|:--|:--|:--|
|Instant Retrieval|90日間|四半期に一度|ミリ秒|不可|
|Flexible Retrieval|90日間|半年に一度|数分〜12H|可|
|Deep Archive|180日間|年に一度|9〜48H|可|


## S3 Glacier Instant Retrieval

> S3 Glacier Instant Retrieval は、四半期に一度のアクセス頻度で、ミリ秒単位での取り出しが要求される長期データに使用することをお勧めします。このストレージクラスは、画像ホスティング、ファイル共有アプリケーション、予約時にアクセスする医療記録の保存など、パフォーマンスが重視されるユースケースに最適です。

> S3 Glacier Instant Retrieval ストレージクラスは、S3 Standard-IA ストレージクラスと同じレイテンシーとスループットパフォーマンスで、オブジェクトにリアルタイムでアクセスできます。S3 Glacier Instant Retrieval は、 S3 Standard-IA と比較して、ストレージコストは低くなりますが、データアクセスコストは高くなります。

> S3 Glacier Instant Retrieval ストレージクラスに保存されるデータの最小オブジェクトサイズは 128 KB です。また、このストレージクラスの最小ストレージ期間は 90 日間です。

- ミリ秒単位での取り出しが要求される長期データに使用することを推奨
- パフォーマンスが重視されるユースケースに最適
- S3 Standard-IA ストレージクラスと同じレイテンシーとスループットパフォーマンスで、オブジェクトにリアルタイムでアクセス可能
- S3 Standard-IA と比較して、ストレージコストは低くなりますが、データアクセスコストは高くなる
- 最小オブジェクトサイズは 128 KB（最低128KBの料金で課金される）
- 最小ストレージ期間は 90 日間

## S3 Glacier Flexible Retrieval

> S3 Glacier Flexible Retrieval は、1 年に 1～2 回のアクセス頻度で、即時アクセスを必要としないアーカイブデータに使用することをお勧めします。S3 Glacier Flexible Retrieval では柔軟な取り出し時間を選択でき、数分から数時間のアクセス時間と、無料の一括取り出しによるコストとのバランスをとるのに役立ちます。このストレージクラスは、バックアップとディザスタリカバリに最適です。

- 年1〜2回程度のアクセス頻度
- 即時アクセスを必要としないアーカイブ
- 数分〜数時間のアクセス時間
- 無料の一括取り出し
- バックアップとディザスタリカバリに最適

> S3 Glacier Flexible Retrieval に保存されたオブジェクトは、アーカイブされ、リアルタイムでアクセスできなくなります。詳細については、「S3 Glacier Flexible Retrieval および S3 Glacier Deep Archive はアーカイブストレージクラスです。」を参照してください。これらのオブジェクトにアクセスするには、まず復元リクエストを開始し、リクエストの完了時にアクセスできるオブジェクトの一時コピーを作成します。詳細については、アーカイブされたオブジェクトの操作 を参照してください。オブジェクトを復元するときは、ユースケースに合わせて取り出し階層を選択でき、復元時間が長くなるほど、コストは低くなります。

- アクセスするには、復元リクエスト後にアクセスする

> S3 Glacier Flexible Retrieval では、次の取り出し階層を使用できます。
> - 迅速取り出し — 通常、1～5 分でオブジェクトを復元します。迅速取り出しは、需要に応じて使用します。信頼性が高く、予測可能な復元時間を確保するには、プロビジョンド取り出しキャパシティを購入することをお勧めします。詳細については、「プロビジョンドキャパシティー」を参照してください。
> - 標準取り出し — 通常、3～5 時間でオブジェクトを復元します。S3 バッチオペレーションを使用すると、1 分～5 時間以内にオブジェクトを復元します。詳細については、「バッチオペレーションを使ってオブジェクトを復元する」を参照してください。
> - 一括取り出し — 通常、5～12 時間以内にオブジェクトを復元します。一括取り出しは無料です。

- 取り出し階層
    - 迅速取り出し
        - 通常1〜5分で復元
        - 需要に応じて変わる。安定的に復元時間を確保するにはプロビジョンド取り出しキャパシティを購入
    - 標準取り出し
        - 通常3〜5H
    - 一括取り出し
        - 通常5〜12時間
        - 一括取り出しは無料


> S3 Glacier Flexible Retrieval ストレージクラスのオブジェクトの最小ストレージ期間は 90 日間です。
> S3 Glacier Flexible Retrieval では、オブジェクトごとに 40 KB の追加メタデータが必要です。これには、データの特定と取得に必要な 32 KB のメタデータが含まれ、S3 Glacier Flexible Retrieval のデフォルトレートで課金されます。アーカイブされたオブジェクトのユーザー定義の名前とメタデータを維持するには、追加の 8 KB データが必要で、S3 標準レートで課金されます。

- 最小ストレージ期間は、90日間
- オブジェクトごとに40KBのメタデータが必要
    - データの特定と取得に必要な32KBのメタデータ
    - アーカイブされたオブジェクトのユーザ定義の名前とメタデータの維持に8KBのデータ

## S3 Glacier Deep Archive
> アクセス頻度が 1 年に 1 回未満のアーカイブデータには、S3 Glacier Deep Archive を使用することをお勧めします。このストレージクラスは、コンプライアンス要件を満たすためにデータセットを複数年間保持するように設計されており、バックアップやディザスタリカバリ、または取り出しまで最大 72 時間待機できるアクセス頻度の低いデータにも使用できます。S3 Glacier Deep Archive は、AWS で最も低コストのストレージオプションです。

- アクセス頻度は、1年に1回未満のアーカイブデータ
- バックアップ、ディザスタリカバリ
- AWSで最も低コストのストレージオプション

> S3 Glacier Deep Archive に保存されたオブジェクトは、アーカイブされ、リアルタイムでアクセスできなくなります。詳細については、「S3 Glacier Flexible Retrieval および S3 Glacier Deep Archive はアーカイブストレージクラスです。」を参照してください。これらのオブジェクトにアクセスするには、まず復元リクエストを開始し、リクエストの完了時にアクセスできるオブジェクトの一時コピーを作成します。詳細については、アーカイブされたオブジェクトの操作 を参照してください。オブジェクトを復元するときは、ユースケースに合わせて取り出し階層を選択でき、復元時間が長くなるほど、コストは低くなります。

- アクセスするには、復元リクエストが必要


> S3 Glacier Deep Archive では、次の取り出し階層を使用できます。
> - 標準取り出し — 通常、12 時間以内にオブジェクトを復元します。S3 バッチオペレーションを使用すると、9～12 時間以内にオブジェクトを復元します。詳細については、「バッチオペレーションを使ってオブジェクトを復元する」を参照してください。
> - 一括取り出し — 通常、標準取り出し階層のコストのごく一部で、48 時間以内にオブジェクトを復元します。

- 取り出し階層
    - 標準取り出し
        - 通常12H以内
    - 一括取り出し
        - 通常48H以内


> S3 Glacier Deep Archive ストレージクラスのオブジェクトの最小ストレージ期間は 180 日間です。

- 最小ストレージ期間は180日間

> S3 Glacier Deep Archive には、オブジェクトごとに 40 KB の追加メタデータが必要です。これには、データの特定と取得に必要な 32 KB のメタデータが含まれ、S3 Glacier Deep Archive のデフォルトレートで課金されます。アーカイブされたオブジェクトのユーザー定義の名前とメタデータを維持するには、追加の 8 KB データが必要で、S3 標準レートで課金されます。


- メタデータ40KBが追加で必要

## S3 標準ストレージクラスと S3 Glacier サービスの違い
> S3 Glacier ストレージクラスは Amazon S3 サービスの一部であり、データをオブジェクトとして S3 バケットに保存します。これらのストレージクラスのオブジェクトは、S3 コンソールを使用するか、S3 API または SDK を使用して、プログラムによって管理できます。S3 Glacier ストレージクラスにオブジェクトを保存すると、高度な暗号化、オブジェクトのタグ付け、S3 ライフサイクル設定などの S3 機能を使用して、データのアクセシビリティとコストを管理できます。

- 昔は Glacierサービスだったが、標準機能などあるので、今はS3 Glacierストレージクラスを使ったほうがよい

## S3 Glacier Flexible Retrieval および S3 Glacier Deep Archive 
> S3 Glacier Flexible Retrieval および S3 Glacier Deep Archive はアーカイブストレージクラスです。つまり、これらのストレージクラスにオブジェクトを保存すると、そのオブジェクトはアーカイブされ、直接アクセスできなくなります。アーカイブされたオブジェクトにアクセスするには、そのオブジェクトの復元リクエストを送信し、サービスによりオブジェクトが復元されるまで待ちます。復元リクエストによりオブジェクトの一時コピーが復元され、このリクエストで指定した期間が終了すると、そのコピーは削除されます。詳細については、「アーカイブされたオブジェクトの操作」を参照してください。

- アーカイブされ、直接アクセスはできない
- アクセスするには復元が必要


> S3 Glacier Deep Archive ストレージクラスへのオブジェクトの移行は一方向のみです。

> アーカイブされたオブジェクトのストレージクラスをその他のストレージクラスに変更する場合、まず復元オペレーションを使用してオブジェクトの一時コピーを作成する必要があります。その後、コピーオペレーションを使用して、ストレージクラスとして S3 Standard、S3 Intelligent-Tiering、S3 標準 – IA、S3 1 ゾーン – IA、 S3 Glacier Instant Retrieval、S3 Glacier Flexible Retrieval、または Reduced Redundancy Storage を指定しているオブジェクトを上書きします。


- アーカイブされたオブジェクトを他のストレージクラスに変更する場合は
    1. 一度、復元する
    1. 復元後、コピーしてストレージクラスを指定する

### コストに関する考慮事項
> アクセス頻度の高いデータを数か月あるいは数年間アーカイブする場合、S3 Glacier および S3 Glacier Deep Archive ストレージクラスを使用する事でストレージコストを削減できます。ただし、S3 Glacier Flexible Retrieval または S3 Glacier Deep Archive ストレージクラスが適切であることを確認するために、以下の点を考慮してください。

> - ストレージオーバーヘッド料金 – アーカイブされた各オブジェクトには 40 KB の追加メタデータが必要です。これには、データの特定と取得に必要な 32 KB のメタデータが含まれ、そのストレージクラスのデフォルトレートで課金されます。アーカイブされたオブジェクトのユーザー定義の名前とメタデータを維持するには、追加の 8 KB データが必要で、S3 標準レートで課金されます。
小さいオブジェクトをアーカイブする場合は、これらのストレージ料金を考慮する必要があります。オーバーヘッドコストを削減するには、多数の小さいオブジェクトを少数の大きいオブジェクトに集約する方法があります。

> - マルチパートアップロード料金 – S3-storage-class-glacier のオブジェクト、および S3 Glacier Deep Archive のオブジェクトは、マルチパートアップロードを使用してアップロードすると S3 Standard ストレージクラス料金で請求されます。詳細については、「マルチパートアップロードと料金」を参照してください。

> - 最低 30 日間のストレージ料 – S3 Glacier Flexible Retrieval および S3 Glacier Deep Archive は、長期アーカイブソリューションです。最小ストレージ期間は、S3 Glacier ストレージクラスの場合は 90 日、S3 Glacier Deep Archive の場合は 180 日です。これらのストレージクラスにアーカイブされたデータを削除しても、削除するオブジェクトが最小ストレージ期間より長い期間アーカイブされている場合は無料です。アーカイブされたオブジェクトを最小ストレージ期間以内に削除または上書きする場合は、Amazon S3 ではその期間の残りに対して料金が発生します。

> - データ取得料金 – アーカイブされたオブジェクトを S3 Glacier Flexible Retrieval および S3 Glacier Deep Archive に復元する場合、リクエストごとのデータ取得料金が発生します。これらの料金は、復元を開始するときに選択した取り出し階層によって異なります。料金については、[Amazon S3 の料金] を参照してください。

> - S3 ライフサイクル – アーカイブされたオブジェクトを S3 Glacier Flexible Retrieval および S3 Glacier Deep Archive に復元する場合、リクエストごとのデータ取得料金が発生します。これらの料金は、復元を開始するときに選択した取り出し階層によって異なります。料金については、[Amazon S3 の料金] を参照してください。

- ストレージオーバーヘッド料金。40KBの追加メタデータが必要
- マルチパートアップロード料金。マルチアップロードを行うとS3標準ストレージの料金がかかる
- 最低保存期間がある
- データ取得料金がかかる
- S3 ライフサイクルでリクエスト料金がかかる

### アーカイブされたオブジェクトの復元
> アーカイブされたオブジェクトにはリアルタイムでアクセスできません。まず復元リクエストを開始してから、リクエストで指定した期間中にオブジェクトの一時コピーが利用できるようになるまで待ちます。復元されたオブジェクトの一時コピーの取得後も、オブジェクトのストレージクラスは S3 Glacier または S3 Glacier Deep Archive が保持されます。(HeadObject または GetObject API オペレーションリクエストは、S3 Glacier Flexible Retrieval または S3 Glacier Deep Archive をストレージクラスとして返します)。

- 復元されたオブジェクトの一時コピーの取得後も、オブジェクトのストレージクラスは S3 Glacier または S3 Glacier Deep Archive が保持される


# 実践
アーカイブ系の下記の3つのストレージタイプについて挙動を確認します。

- Amazon S3 Glacier Instant Retrieval
- Amazon S3 Glacier Flexible Retrieval (旧 S3 Glacier)
- Amazon S3 Glacier Deep Archive


シナリオは、下記のとおりです。

1. S3バケットの作成
1. オブジェクトのアップロード（ストレージクラスを指定）
1. ストレージクラスの確認
1. ファイル内容の確認（GET・標準出力）
1. リストア（Glacier, Deep Archive）
1. リストア完了後のダウンロード

## 0. 事前準備
1. 事前にファイルを用意します
    ```bash
    G_INSTANT=glacier-instant-retrieval
    % echo $G_INSTANT | tee $G_INSTANT.txt
    glacier-instant-retrieval
    %
    
    % G_FLEXIBLE=glacier-flexible-retrieval   
    % echo $G_FLEXIBLE | tee $G_FLEXIBLE.txt
    glacier-flexible-retrieval
    % 
    
    % G_DEEP=glacier-deep-archive
    % echo $G_DEEP | tee $G_DEEP.txt
    glacier-deep-archive
    % 
    
    % ls -ltr glacier*
    -rw-r--r--  1 XXX  XXX  26  1 14 08:27 glacier-instant-retrieval.txt
    -rw-r--r--  1 XXX  XXX  27  1 14 08:29 glacier-flexible-retrieval.txt
    -rw-r--r--  1 XXX  XXX  21  1 14 08:30 glacier-deep-archive.txt
    % 
    ```

## 1. S3バケットの作成
事前準備でS3バケットを作成します。

1. AWSにサインインします
1. 普段通りS3バケットを作成します。（ライフサイクルなど設定しません）
    ```bash
    GLACIER_BUCKET=XXXXXX
    % aws s3 mb s3://$GLACIER_BUCKET 
    make_bucket: XXXXXX
    %
    % aws s3 ls
    2025-01-14 13:33:59 YYYYYY
    2025-01-14 08:19:38 XXXXXX

    %     
    ```

## 2. オブジェクトのアップロード（ストレージクラスを指定）
ストレージクラスを指定して、オブジェクトをアップロードします

1. 3種類のオブジェクトをアップロードします
    ```bash
    GLACIER_BUCKET=XXXXXX
    
    # Glacier Instant Retrieval
    % aws s3 cp $G_INSTANT.txt s3://$GLACIER_BUCKET/$G_INSTANT/$G_INSTANT.txt --storage-class GLACIER_IR
    upload: ./glacier-instant-retrieval.txt to s3://XXXXXX/glacier-instant-retrieval/glacier-instant-retrieval.txt
    % 
    
    # Glacier Flexible Retrieval
    % aws s3 cp $G_FLEXIBLE.txt s3://$GLACIER_BUCKET/$G_FLEXIBLE/$G_FLEXIBLE.txt --storage-class GLACIER
    upload: ./glacier-flexible-retrieval.txt to s3://XXXXXX/glacier-flexible-retrieval/glacier-flexible-retrieval.txt
    % 
    
    # Glacier Deep Archive
    % aws s3 cp $G_DEEP.txt s3://$GLACIER_BUCKET/$G_DEEP/$G_DEEP.txt --storage DEEP_ARCHIVE             
    upload: ./glacier-deep-archive.txt to s3://XXXXXX/glacier-deep-archive/glacier-deep-archive.txt
    % 
    ```

1. アップロードを確認します
    ```bash
    % aws s3 ls s3://$GLACIER_BUCKET --recursive
    2025-01-14 08:51:51         21 glacier-deep-archive/glacier-deep-archive.txt
    2025-01-14 08:49:41         27 glacier-flexible-retrieval/glacier-flexible-retrieval.txt
    2025-01-14 08:46:43         26 glacier-instant-retrieval/glacier-instant-retrieval.txt
    %     
    ```
## 3. ストレージクラスの確認
上記でアップロードしたファイルのストレージクラスを確認します。

### CLI
1. 下記のコマンドでストレージクラスを確認します。想定通りです
    ```bash
    # Glacier Instant Retrieval
    
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_INSTANT/$G_INSTANT.txt 
    {
        "AcceptRanges": "bytes",
        "LastModified": "2025-01-13T23:46:43+00:00",
        "ContentLength": 26,
        "ETag": "\"XXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "GLACIER_IR"
    }
    % 
    
    # Glacier Flexible Retrieval
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_FLEXIBLE/$G_FLEXIBLE.txt
    {
        "AcceptRanges": "bytes",
        "LastModified": "2025-01-13T23:49:41+00:00",
        "ContentLength": 27,
        "ETag": "\"XXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "GLACIER"
    }
    %
    
    # Glacier Deep Archive
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_DEEP/$G_DEEP.txt
    {
        "AcceptRanges": "bytes",
        "LastModified": "2025-01-13T23:51:51+00:00",
        "ContentLength": 21,
        "ETag": "\"XXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "DEEP_ARCHIVE"
    }
    % 
    ```

### AWS マネージメントコンソール
1. AWSにサインインし、マネコンでも確認します

1. Glacier Instant Retrive を確認します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3febcd68-a0ef-9cd9-447c-a79a811232a8.png)

1. Glacier Flexible Retrive を確認します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e31960b8-46f7-8a0b-f9b8-a6b1d6d4228b.png)

1. Glacier Deep Archive を確認します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0c5f9c01-2a16-d746-ad6d-8c7cde337627.png)

## 4. ファイル内容の確認（GET・標準出力）
アップされた状態で、GET・標準出力をします。想定では、Instant Retriveのみ確認可能と考えます。

1. Glacier Instant Retrive を確認します。**確認できました。想定通りです。**
    ```bash
    % aws s3 cp s3://$GLACIER_BUCKET/$G_INSTANT/$G_INSTANT.txt - | cat                                           
    glacier-instant-retrieval
    % 
    ```

1. Glacier Flexible Retrive を確認します。**失敗しました。想定通りです。**
    ```bash
    % aws s3 cp s3://$GLACIER_BUCKET/$G_FLEXIBLE/$G_FLEXIBLE.txt - | cat
    download failed: s3://XXXX/glacier-flexible-retrieval/glacier-flexible-retrieval.txt to - An error occurred (InvalidObjectState) when calling the GetObject operation: The operation is not valid for the object's storage class
    % 
    ```

1. Glacier Deep Archive を確認します。**失敗しました。想定通りです。**
    ```bash
    % aws s3 cp s3://$GLACIER_BUCKET/$G_DEEP/$G_DEEP.txt - | cat        
    download failed: s3://XXXX/glacier-deep-archive/glacier-deep-archive.txt to - An error occurred (InvalidObjectState) when calling the GetObject operation: The operation is not valid for the object's storage class
    % 
    ```

## 5. リストアのリクエスト
Glacier Flexible RetrievalおよびDeep Archiveのオブジェクトをリストアリクエストして、取得可能状態にします。

### Glacier Flexible Retrieval
1. 実行前の状態を確認します
    ```bash
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_FLEXIBLE/$G_FLEXIBLE.txt                                                                              
    {
        "AcceptRanges": "bytes",
        "LastModified": "2025-01-13T23:49:41+00:00",
        "ContentLength": 27,
        "ETag": "\"XXXXXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "GLACIER"
    }
    ```


1. リストアします
    ```bash
    % aws s3api restore-object --bucket $GLACIER_BUCKET --key $G_FLEXIBLE/$G_FLEXIBLE.txt --restore-request '{"Days":1 ,"GlacierJobParameters":{"Tier":"Standard"}}'
    % 
    ```
#### ステータスの確認（リストア直後）


1. リストア直後のステータスを確認します。**  `"Restore": "ongoing-request=\"true\"",`が追加されました。**
    ```bash
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_FLEXIBLE/$G_FLEXIBLE.txt
    {
        "AcceptRanges": "bytes",
        "Restore": "ongoing-request=\"true\"",
        "LastModified": "2025-01-13T23:49:41+00:00",
        "ContentLength": 27,
        "ETag": "\"XXXXXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "GLACIER"
    }
    % 
    ```

1. マネコンでも確認してみます。** 復元ステータスは「進行中」となっています。**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4dfdc5b8-f540-d328-fb72-af6f18739f6e.png)



#### ステータスの確認（リストア完了）
数時間後に確認した結果なります。

1. 復元されていました
    - ongoing-requestがfalse
    - expiry-dateが埋まっています
    
    ```bash
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_FLEXIBLE/$G_FLEXIBLE.txt
    {
        "AcceptRanges": "bytes",
        "Restore": "ongoing-request=\"false\", expiry-date=\"Thu, 16 Jan 2025 00:00:00 GMT\"",
        "LastModified": "2025-01-13T23:49:41+00:00",
        "ContentLength": 27,
        "ETag": "\"XXXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "GLACIER"
    }
    % 
    ```
1. マネコンでも確認してみます。** 復元ステータスは「完了済み」になりました。**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/128894f8-e68c-19b9-fb66-a8a0998f3a42.png)

### Glacier Deep Archive
1. 実行前の状態を確認します
    ```bash
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_DEEP/$G_DEEP.txt
    {
        "AcceptRanges": "bytes",
        "LastModified": "2025-01-13T23:51:51+00:00",
        "ContentLength": 21,
        "ETag": "\"XXXXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "DEEP_ARCHIVE"
    }
    % 
    ```

1. リストアします
    ```bash
    % aws s3api restore-object --bucket $GLACIER_BUCKET --key $G_DEEP/$G_DEEP.txt --restore-request '{"Days":1 ,"GlacierJobParameters":{"Tier":"Standard"}}'
    % 
    ```

#### ステータスの確認（リストア直後）

1. リストア直後のステータスを確認します。**  `"Restore": "ongoing-request=\"true\"",`が追加されました。**
    ```bash
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_DEEP/$G_DEEP.txt
    {
        "AcceptRanges": "bytes",
        "Restore": "ongoing-request=\"true\"",
        "LastModified": "2025-01-13T23:51:51+00:00",
        "ContentLength": 21,
        "ETag": "\"XXXXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "DEEP_ARCHIVE"
    }
    % 
    ```

1. マネコンでも確認してみます。** 復元ステータスは「進行中」となっています。**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e5209a4b-b1bf-5b09-d92b-c2c09209b0c9.png)


#### ステータスの確認（リストア完了）
1. 復元されていました
    - ongoing-requestがfalse
    - expiry-dateが埋まっています
    ```bash
    % aws s3api head-object --bucket $GLACIER_BUCKET --key $G_DEEP/$G_DEEP.txt
    {
        "AcceptRanges": "bytes",
        "Restore": "ongoing-request=\"false\", expiry-date=\"Thu, 16 Jan 2025 00:00:00 GMT\"",
        "LastModified": "2025-01-13T23:51:51+00:00",
        "ContentLength": 21,
        "ETag": "\"XXXXXX\"",
        "ContentType": "text/plain",
        "ServerSideEncryption": "AES256",
        "Metadata": {},
        "StorageClass": "DEEP_ARCHIVE"
    }
    % 
    ```


1. マネコンでも確認してみます。** 復元ステータスは「完了済み」になりました。**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fa375803-6850-fa41-a9a9-717bcd5bbcda.png)



### おまけ
興味本位で、Instant Retrivalでもリストアコマンドを実行してみます。

1. やはり、エラーになりました
    ```bash
    % aws s3api restore-object --bucket $GLACIER_BUCKET --key $G_INSTANT/$G_INSTANT.txt --restore-request '{"Days":1 ,"GlacierJobParameters":{"Tier":"Standard"}}'
    
    An error occurred (InvalidObjectState) when calling the RestoreObject operation: Restore is not allowed for the object's current storage class
    % 
    ```

## 6. リストア完了後のダウンロード
リストア後に参照できるか確認します。

1. Glacier Flexible Retrive を確認します。 **確認できました。（復元されました）**
    ```bash
    % aws s3 cp s3://$GLACIER_BUCKET/$G_FLEXIBLE/$G_FLEXIBLE.txt - | cat
    glacier-flexible-retrieval
    % 
    ```
1. Glacier Deep Archive を確認します。**確認できました。（復元されました）**
    ```bash
    % aws s3 cp s3://$GLACIER_BUCKET/$G_DEEP/$G_DEEP.txt - | cat              
    glacier-deep-archive
    % 
    ```


# 考察
今回、S3 Glacierストレージクラスの知識の整理と挙動を試しイメージが掴めました。


# 参考
https://qiita.com/zumax/items/882d2ccc9f6f9598ff08

https://qiita.com/zumax/items/16d6479c7cf37bbd05e3

https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html

https://docs.aws.amazon.com/cli/latest/reference/s3api/head-object.html

https://docs.aws.amazon.com/cli/latest/reference/s3api/restore-object.html

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/restoring-objects.html