Amazon S3 へ Amazon RDS のスナップショットをエクスポートできるようになったので、 AWS CLI で実行してみました。

以下の記事で発表があったとおり、Amazon S3 へ Amazon RDS のスナップショットをエクスポートできるようになりました。

★Announcing Amazon Relational Database Service (RDS) Snapshot Export to S3
https://aws.amazon.com/jp/about-aws/whats-new/2020/01/announcing-amazon-relational-database-service-snapshot-export-to-s3/

>You can analyze the exported data with other AWS services such as Amazon Athena, Amazon EMR, and Amazon SageMaker.
>
>エクスポートされたデータは、Amazon Athena、Amazon EMR、Amazon SageMakerなどの他のAWSサービスで分析できます。

ということは、例えば、分析用に ReadReplica を別途起動するといった運用をしなくてもよくなりそうです！

早速、AWS CLI で試してみました。

## 準備
- 手順や注意点などをユーザーズガイドで確認する。
 - https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html
- Amazon RDS のスナップショット
 - 対象のエンジンバージョンに注意
- 最新の AWS CLI (バージョン1.17.8で確認しました)
- IAM Role
 - エクスポートする際に必要。 

## IAM Role の設定
IAM Role をサクッと作るため、以下の流れで実施します。

1. ロールの作成ボタンをクリック
2. このロールを使用するサービスを選択」で EC2 を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/1128671a-752b-03df-60a6-b6c149365a5e.png)

3. Attach アクセス権限ポリシーで **AmazonS3FullAccess** を選択(環境に応じてポリシーを作成・変更してください。例えば 認められたバケットのみにする・・・など）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/3a97face-462d-fe2b-3660-c0015d6fb512.png)

4. タグの追加は任意で実施
5. ロール名は任意(例：exportRole)の名称で指定
6. **ロールの作成** ボタンをクリック

Amazon RDS のスナップショットをエクスポートする際に、このロールを使えるようにするために以下の設定変更を行います。

1. 作成した IAM Role の詳細画面を開く
2. 信頼関係のタブを開く
3. **信頼関係の編集**ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/e098c597-dc92-98ba-b4c0-e738d27491de.png)
4. **ec2.amazonaws.com** と書いてある場所を **export.rds.amazonaws.com** に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/d04f78d6-c346-b1a8-934b-5bb1c845b3a4.png)
5.**信頼ポリシーの更新**ボタンをクリック。以下のようになっていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/2fd1ace8-200e-e7c4-e61b-dccf27513c27.png)

### AWS CLI で IAM Role を設定するなら・・・
以下を参考に実行するとよいです。

引用元：https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html#USER_ExportSnapshot.Setup

```sh:ポリシーの作成
aws iam create-policy \
   --policy-name ExportPolicy \
   --policy-document '{
     "Version": "2012-10-17",
     "Statement": [
        {
            "Sid": ""ExportPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject*",
                "s3:ListBucket",
                "s3:GetObject*",
                "s3:DeleteObject*",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::your-s3-bucket",
                "arn:aws:s3:::your-s3-bucket/*",
            ]
        }
    ]
}' 
```

```sh:ロールの作成
aws iam create-role \
   --role-name rds-s3-export-role \
   --assume-role-policy-document '{
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
            "Service": "export.rds.amazonaws.com"
          },
         "Action": "sts:AssumeRole"
       }
     ] 
   }'                       
```

```sh:ポリシーとロールを関連付ける
aws iam attach-role-policy \
   --policy-arn your-policy-arn \
   --role-name rds-s3-export-role                    
```

## AWS CLI でスナップショットのエクスポートを実行
ユーザーズガイド記載の構文に従ってコマンド実行します。
環境に応じて適宜指定してください。

```sh
aws rds start-export-task \
    --export-task-identifier my_snapshot_export \
    --source-arn arn:aws:rds:ap-northeast-1:*********:snapshot:snapshot_name \
    --s3-bucket-name my_export_bucket \
    --iam-role-arn arn:aws:iam::*********:role/exportRole \
    --kms-key-id master_key
```

注意点：
--kms-key-id に指定するIDは、**カスタマー管理型のキー** の ARN です。

正常に実行できると以下のレスポンスが返ってきます。

```json
{
    "Status": "STARTING", 
    "IamRoleArn": "arn:aws:iam::*********:role/exportRole", 
    "ExportTime": "2020-01-24T03:40:42.823Z", 
    "S3Bucket": "my_export_bucket", 
    "PercentProgress": 0, 
    "KmsKeyId": "master_key", 
    "ExportTaskIdentifier": "my_snapshot_export", 
    "TotalExtractedDataInGB": 0, 
    "TaskStartTime": "2020-01-24T03:35:00.173Z", 
    "SourceArn": "arn:aws:rds:AWS_Region:*********:snapshot:test-snapshot"
}
```

## 状況を確認する

以下のコマンドでエクスポートの状況が確認できます。

```sh:状況確認
aws rds describe-export-tasks
```

```sh:出力結果(実行中)
{
    "ExportTasks": [
        {
            "Status": "STARTING",
            "SnapshotTime": "2020-01-24T03:34:49.027Z",
            "S3Prefix": "",
            "S3Bucket": "export-rds-snapshot-test",
            "PercentProgress": 0,
            "KmsKeyId": "arn:aws:kms:ap-northeast-1:******:key/************",
            "ExportTaskIdentifier": "test-snapshot-export",
            "IamRoleArn": "arn:aws:iam::******:role/exportRole",
            "TotalExtractedDataInGB": 0,
            "TaskStartTime": "2020-01-24T03:35:00.173Z",
            "SourceArn": "arn:aws:rds:ap-northeast-1:************:snapshot:test-snap-shot-20200124"
        }
    ]
}
```

マネージメントコンソールではこのような出力がされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/5a05d2d8-1c5a-9414-48d5-164fc7564125.png)


```json:出力結果(進行中)
{
    "ExportTasks": [
        {
            "Status": "IN_PROGRESS",
            "SnapshotTime": "2020-01-24T03:34:49.027Z",
            "S3Prefix": "",
            "S3Bucket": "export-rds-snapshot-test",
            "PercentProgress": 100,
            "KmsKeyId": "arn:aws:kms:ap-northeast-1:******:key/************",
            "ExportTaskIdentifier": "test-snapshot-export",
            "IamRoleArn": "arn:aws:iam::******:role/exportRole",
            "TotalExtractedDataInGB": 0,
            "TaskStartTime": "2020-01-24T03:35:00.173Z",
            "SourceArn": "arn:aws:rds:ap-northeast-1:************:snapshot:test-snap-shot-20200124"
        }
    ]
}
```

・・・PercentProgress が 100 になっていますが、TotalExtractedDataInGB が 0 なのはなぜ......
・・・その後、改めて実施したところ、TotalExtractedDataInGB の値が増加していました。


```json:出力結果(出力完了)
{
    "ExportTasks": [
        {
            "Status": "COMPLETE",
            "TaskEndTime": "2020-01-24T04:03:47.428Z",
            "SnapshotTime": "2020-01-24T03:34:49.027Z",
            "S3Prefix": "",
            "S3Bucket": "export-rds-snapshot-test",
            "PercentProgress": 100,
            "KmsKeyId": "arn:aws:kms:ap-northeast-1:******:key/************",
            "ExportTaskIdentifier": "test-snapshot-export",
            "IamRoleArn": "arn:aws:iam::******:role/exportRole",
            "TotalExtractedDataInGB": 2,
            "TaskStartTime": "2020-01-24T03:35:00.173Z",
            "SourceArn": "arn:aws:rds:ap-northeast-1:************:snapshot:test-snap-shot-20200124"
        }
    ]
}
```

この環境は 20GiB のストレージで約 3GiB 程度使用している状態でのスナップショットでした。
所用時間は、およそ 30 分でした。

## 出力されたファイルを確認する
Amazon S3 のバケットにエクスポートされたデータを確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/6fa908d9-0f22-70a2-473f-fccff7ad40f1.png)

これらフォルダ・ファイルは以下のようになっています。

- testdatabase(実際には RDS 内のデータベース名のフォルダ)
 - この中に Apache Parquet 形式のファイルが格納される
- export_info_**test-snapshot-export**.json(実際には太字の箇所がエクスポートタスク名になる)
 - aws rds describe-export-tasksの結果と同等の内容が書き込まれている
- export_tables_info_**test-snapshot-export**_from_1_to_1.json(実際には太字の箇所がエクスポートタスク名になる) 
 - データベース内のスキーマ情報などが記録されている 


## まとめ
今回はマネジメントコンソールで実行できなかったため AWS CLI での試行としました。
2 GiB で 30 分近くかかっており、思いの外時間かかる印象でしたが、テーブル内の行数(今回は100万行くらいありました)などによっても変わってくるのではと考えています。

### 2020/01/26 追記
クラスメソッドさんの記事(https://dev.classmethod.jp/cloud/aws/rds-snapshot-s3-export/)によると、現在はマネージメントコンソールの言語を英語にすると、ブラウザからでもエクスポートできるようです！