以下の記事で発表があったとおり、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 をサクッと作るため、以下の流れで実施します。
-
ロールの作成ボタンをクリック
-
Attach アクセス権限ポリシーで AmazonS3FullAccess を選択(環境に応じてポリシーを作成・変更してください。例えば 認められたバケットのみにする・・・など)
-
タグの追加は任意で実施
-
ロール名は任意(例:exportRole)の名称で指定
-
ロールの作成 ボタンをクリック
Amazon RDS のスナップショットをエクスポートする際に、このロールを使えるようにするために以下の設定変更を行います。
- 作成した IAM Role の詳細画面を開く
- 信頼関係のタブを開く
-
信頼関係の編集ボタンをクリック
-
ec2.amazonaws.com と書いてある場所を export.rds.amazonaws.com に変更する
5.信頼ポリシーの更新ボタンをクリック。以下のようになっていればOK
AWS CLI で IAM Role を設定するなら・・・
以下を参考に実行するとよいです。
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/*",
]
}
]
}'
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"
}
]
}'
aws iam attach-role-policy \
--policy-arn your-policy-arn \
--role-name rds-s3-export-role
AWS CLI でスナップショットのエクスポートを実行
ユーザーズガイド記載の構文に従ってコマンド実行します。
環境に応じて適宜指定してください。
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 です。
正常に実行できると以下のレスポンスが返ってきます。
{
"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"
}
状況を確認する
以下のコマンドでエクスポートの状況が確認できます。
aws rds describe-export-tasks
{
"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"
}
]
}
{
"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 の値が増加していました。
{
"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 のバケットにエクスポートされたデータを確認してみます。
これらフォルダ・ファイルは以下のようになっています。
- 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/)によると、現在はマネージメントコンソールの言語を英語にすると、ブラウザからでもエクスポートできるようです!