【AWS Athena】RDSスナップショットにSQLでクエリを実行する方法



## はじめに
今回は、Amazon RDSのスナップショットをAmazon S3にエクスポートし、AWS Athenaを使用してデータベースの内容を閲覧する方法を紹介します。このプロセスには、Amazon RDS、Amazon S3、AWS Glue、およびAWS Athenaが含まれます。
Glue、Athenaのサービス内容に関しては今回は詳しく説明しません。

## 必要なサービス
- **Amazon RDS**: リレーショナルデータベースサービス。
- **Amazon S3**: オブジェクトストレージサービス。
- **AWS Glue**: ETLサービス。
- **AWS Athena**: サーバーレスクエリサービス。

## Athenaとは？
AWS公式を確認してみると以下のように記述されています。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/what-is.html

>Amazon Athena は、標準的な SQL を使用して Amazon Simple Storage Service (Amazon S3) 内のデータを直接分析することを容易にするインタラクティブなクエリサービスです。AWS Management Console でいくつかのアクションを実行するだけで、Athena にデータの保存先の Amazon S3 を設定し、標準 SQL を使用してアドホッククエリの実行を開始できます。結果は数秒で返されます。

簡単にいうと
Amazon Athenaは、Amazon S3に保存されたデータに対して、標準SQLを使って簡単かつ迅速にクエリを実行できるサービスです。

## Glueとは？
AWS公式を確認してみると以下のように記述されています。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/what-is-glue.html

>AWS Glue は、分析を行うユーザーが複数のソースからのデータを簡単に検出、準備、移動、統合できるようにするサーバーレスのデータ統合サービスです。

AWS Glueは、特に、データの抽出（Extract）、変換（Transform）、ロード（Load）のプロセス、通称ETLを自動化するのに役立ちます。Glueの主な特徴は以下の通りです。

- **ETLプロセスの自動化**: Glueは、様々なデータソースからデータを抽出し、必要に応じてデータを変換（例えば、フォーマットを変更したり、データを統合したりする）し、それを別のデータストレージ（例えば、Amazon S3）に保存するプロセスを自動化します。

- **データカタログ**: Glueには「データカタログ」という機能があります。これはデータの中心的なリポジトリで、データの場所、フォーマット、および利用可能なメタデータ（データに関するデータ）を管理します。データカタログを使用することで、データの探索、整理、およびアクセスが容易になります。



## RDSスナップショットからAthenaでクエリを実行するまで
1. **S3バケットの準備**
    - RDSインスタンスのスナップショットをエクスポートする用のS3を作成します。

2. **スナップショットのS3へのエクスポート**
    - スナップショットを作成したS3バケットにエクスポートします。

3. **Glue クローラーの作成**
    - parquet形式で出力されたS3上のデータ読み込むためのクローラーの作成を行います。

4.  **Glueでデータカタログを作成**
    - エクスポートされたデータをGlue クローラーを利用して自動で読み込み、Data Catalogとして保存します。

5. **Athenaでクエリを実行**
    - Athenaを使用して、エクスポートされたデータに対してSQLクエリを実行します。

### 1. S3バケットの準備
まず、RDSスナップショットをエクスポートするためのS3バケットを準備します。AWS Key Management Service (KMS) キーを使用したサーバー側の暗号化を行います。

- Key Management Service (KMS)のページに移動し、【キーの作成】を選択し、以下の設定でキーを作成します。
    - キーのタイプ→対称
    - キーの使用法→暗号化および複合化
    - エイリアス　→ 独自のキーの名前
    - キーの管理アクセス許可を定義→権限を渡したいユーザーにチェックを入れる。

![スクリーンショット 2024-01-31 13.35.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/c98700b0-04a8-0147-5429-45a4eb4c073a.png)

![スクリーンショット 2024-01-31 13.35.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/c034598c-bb0e-c1f5-8e1f-daff9f98d966.png)



- KMSの作成を行った後、Amazon S3のページに移動し【バケット】 -> 【バケットを作成】を選択し、以下の設定でバケットを作成します。
    - バケット名 → 独自のドメインを入力
    - AWSリージョン → アジアパシフィック（東京）ap-northeast1を選択
    - ブロックパブリックアクセス設定→パブリックアクセスをすべてブロックを選択
    - 暗号化タイプ→AWS Key Management Service キーを使用したサーバー側の暗号化 (SSE-KMS)
    - AWS KMS キー→AWS KMS キーから選択する
    - 使用可能なAWS KMSキー　→ 先ほど作成したKMSキーを選択

![スクリーンショット 2024-01-31 14.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/42107e85-0211-718f-655a-bc8f91c006c6.png)



上記の設定を行った後、バケットの作成を選択します。


### 2. スナップショットのS3へのエクスポート
S3バケットの作成が完了したら、次はRDSのスナップショットのS3へのエクスポートを行います。
parquet形式でエクスポートされます。
Amazon RDSのスナップショットのページから該当のスナップショットを選択し、【アクション】 -> 【Amazon S3にエクスポート】を選択します。
 - エクスポート識別子　→ 独自の名前
    - s3送信先　→ 先ほど作成したS3のバケット
    - IAM ロール　→ 新しいロールの作成
    - AWS KMS キー　→ 先ほど作成したKMSキー


![スクリーンショット 2024-01-31 15.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/fc06620a-ad24-f68c-ca1c-f5e5c39386f8.png)



上記の設定を行った後、【Amazon S3にエクスポート】を選択します。

### 3. Glue クローラーの作成
次にエクスポートした内容を読み取るためのクローラーを作成します。

- AWS Glueのページから【Data Catalog】 -> 【Crawlers】を選択し、【Create crawler】を選択します。
    - Name　→　独自の名前
    - Is your data already mapped to Glue tables?　→ Not yet
    - Add data source ボタンを選択



Add data sourceでは以下の設定を行います。
 - Data source　→ S3
 - BrowseS3 ボタンを選択し、先ほど作成したS3の中に、Database名のディレクトリがあるため選択し、chooseボタンを選択
 - IAM role → Create new IAM roleで任意の名前を入力します。

![スクリーンショット 2024-01-31 15.57.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/491d5ee4-0a9a-9252-328e-8a53d450339e.png)


 - Target database　→　データベースを選択
 - Create crawlerボタンを選択。

Crawlerが作成されます。

### 4. Glueでデータカタログを作成
次にエクスポートされたデータをAWSGlueを使用してClawlingします。
Clawlingする際にエクスポートされたデータは、KMSによって暗号化されているためCrawlerに設定したIAMにDecrypt権限を渡す必要があります。

- AWS IAMのページから【ロール】 を選択し、Crawler作成時に作成したIAMロールを検索。
- 許可を追加　→ インラインポリシーを作成。
- Jsonで生成し、Jsonの中身を以下に書き換えます。（ResorceのARNはKMSに変更する）

```
{  
   "Version":"2012-10-17",
   "Statement":[  
      {  
         "Effect":"Allow",
         "Action":[  
            "kms:Decrypt"
         ],
         "Resource":[  
            "arn:aws:kms:*:account-id-without-hyphens:key/key-id"
         ]
      }
   ]
}
```

- AWS Glueのページから【Data Catalog】 -> 【Crawlers】を選択。
- 作成したcrawlerを選択しRunボタンを選択しCrawlingを行います。

![スクリーンショット 2024-01-31 16.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/85e005c9-960f-6fca-389f-11ed53e9e59f.png)

clawlingが終了し、AWS Glueのページから【Databases】　→　【Tables】に遷移するとテーブルが作成されているのが確認できます。

### 5. Athenaでクエリを実行
最後にAthenaを使用して、エクスポートされたデータに対してSQLクエリを実行していきます。

AWS Athenaのページから【クエリエディタ】へ遷移
クエリの欄にクエリをSQLを記述することによってデータの抽出ができます。

![スクリーンショット 2024-01-31 18.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730382/8cca13d9-2c2e-fd1e-ac60-4cdf7b81bfbe.png)





## まとめ
この記事では、Amazon RDSのスナップショットをS3にエクスポートし、AWS Athenaを使用してデータベースの内容を閲覧する方法について説明しました。AWS Glueを使用してデータカタログを構築し、Athenaで柔軟なデータ分析を行うことができます。