17
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-24

以下の記事で発表があったとおり、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 で試してみました。

準備

IAM Role の設定

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

  1. ロールの作成ボタンをクリック
  2. このロールを使用するサービスを選択」で EC2 を選択
    image.png

  3. Attach アクセス権限ポリシーで AmazonS3FullAccess を選択(環境に応じてポリシーを作成・変更してください。例えば 認められたバケットのみにする・・・など)
    image.png

  4. タグの追加は任意で実施

  5. ロール名は任意(例:exportRole)の名称で指定

  6. ロールの作成 ボタンをクリック

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

  1. 作成した IAM Role の詳細画面を開く
  2. 信頼関係のタブを開く
  3. 信頼関係の編集ボタンをクリック image.png
  4. ec2.amazonaws.com と書いてある場所を export.rds.amazonaws.com に変更する image.png 5.信頼ポリシーの更新ボタンをクリック。以下のようになっていればOK image.png

AWS CLI で IAM Role を設定するなら・・・

以下を参考に実行するとよいです。

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

ポリシーの作成
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"
        }
    ]
}

マネージメントコンソールではこのような出力がされています。
image.png

出力結果(進行中)
{
    "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 のバケットにエクスポートされたデータを確認してみます。
image.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/)によると、現在はマネージメントコンソールの言語を英語にすると、ブラウザからでもエクスポートできるようです!

17
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
7