S3 GlacierのデータをAthenaでクエリしてみた

# 背景・目的
先日、[Amazon Athena now supports querying restored data in S3 Glacier](https://aws.amazon.com/jp/about-aws/whats-new/2023/06/amazon-athena-querying-restored-data-s3-glacier/)が発表されました。

今までは、Glacierのデータは、一度ストレージクラスを変更してからでないとAthenaで取り扱うことができませんでしたが、今回の発表により直接クエリを実行することが出来るようになったので、試してみました。

# まとめ
- Standardクラスにコピーしていたが、復元すればクエリできるようになりました。
- 下記が前提になります。
    - Athena エンジンバージョン3
    - Apache Hiveテーブル


# 概要
>ログ分析や長期傾向分析などのユースケースで、データを Standard ストレージ クラスにコピーすることなく、S3 Glacier Flexible Retrieval およまとめ
び Deep Archive ストレージ クラスで復元されたデータをクエリできるようになります。たとえば、S3 Standard に保存されている最近のログと S3 Glacier Flexible Retrieval で復元された古いログを組み合わせることにより、単一のクエリでストレージ クラス全体のログ分析を実行できます。Athena SQL ワークグループのクエリに対して S3 Glacier アクセスを有効にすることができます。

以前は、Standardクラスにコピーしていたが、復元すればクエリできるようになりました。


## 前提
下記でサポートされています。
- Athena エンジンバージョン3
- Apache Hiveテーブル
- データをクエリする前にオブジェクトを復元する必要がある。Athena はオブジェクトを復元しない。

# 実践
## 事前準備
1. 下記のJSONデータを事前に用意します。
    ```
    {“id”:1,”value”:”abcdefgh”}
    ```
1. ファイルをアップロードします。ストレージクラスは、スタンダードです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0f597bdd-efb2-ecac-3b74-de2847f03d1b.png)

1. Athenaのテーブルを作成
    ```
    create external table qlaciertest_query(
    id int
    ,value string
    )
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
    LOCATION 's3://XXXX/';
    ```

1. クエリできるか確認します。見えました。
    ```
    SELECT * FROM "default"."qlaciertest_query" limit 10;
    ===
    id value
    1  abcdefgh
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/cc704c2e-4f02-fd3d-07d6-66519e745c13.png)


1. ストレージクラスを編集するをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/26287686-fd9c-064a-6adf-cd6109b21b10.png)

1. Glacier Flexible Retrieval を選択し、変更を保存をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/af34dec9-0f69-a54f-b94b-91a32e6a9732.png)

1. 変更されました。（ストレージクラスがGlacier Flexible Retrievalに変わりました。）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9bb56107-9185-ca17-39af-d70f9b7fb75c.png)


## Glacier Flexible Retrievalに対してクエリ
1. プロパティを変更します。
    ```
    ALTER TABLE qlaciertest_query SET TBLPROPERTIES ('read_restored_glacier_objects' = 'true')
    ```
1. 上記で確認したクエリを実行します。想定通り見えなくなりました。
    ```
    SELECT * FROM "default"."qlaciertest_query" limit 10;
    ===
    結果なし
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ecbbdd91-b3da-6c99-98b9-da15b741bbf3.png)

## オブジェクトの復元
1. 復元を開始をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/76d0b727-7979-a654-68aa-64730353cde4.png)

1. 復元します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d1de3b59-51ce-3bc5-2246-a2639b8877c7.png)

1. 復元開始しました。標準取り出しのため、3H〜5H程度待ちます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/689838e5-0566-994e-15ba-45ba0342ef2f.png)

1. 復元できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d3534e88-74aa-b7f0-e29c-a255cf931357.png)

## Athenaでクエリ
1. クエリできました。想定通り復元されたデータが確認できました。
    ```
    SELECT * FROM "default"."qlaciertest_query" limit 10;
    ===
    id value
    1  abcdefgh
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/61456e92-618b-a090-31dc-0e0c6dba26ad.png)

# 考察
Glacier でもコピーすることもなく復元することでAthenaでクエリすることが出来ました。
欲を言うと、復元のオペレーションを挟むことなく確認できるようになると嬉しいですね。

# 参考
https://aws.amazon.com/jp/about-aws/whats-new/2023/06/amazon-athena-querying-restored-data-s3-glacier/?nc1=h_ls

https://docs.aws.amazon.com/athena/latest/ug/querying-glacier.html