継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Aurora MySQL のスナップショットから特定テーブルデータを S3 にエクスポートする

タダです.

前回の記事で Aurora MySQL 互換のデータを SELECT INTO OUTFILE S3 を発行して S3 にエクスポートする情報を整理しました.今回は下記のドキュメントに沿って Aurora のスナップショットから特定テーブルデータをApache Parquet 形式で圧縮して S3 にエクスポートする検証した結果をまとめます.

関連ドキュメント docs.aws.amazon.com

機能の概要

本機能の特徴として Apache Parquet 形式で S3 に出力することで Athena や Redshift などのサービスで直接分析を行うことができることに加え,エクスポートは DB への影響を与えないことがあります.エクスポート処理がバックグラウンドで行われるので稼働している DB インスタンスへの影響を与えないので,業務システムで使っている DB からデータを抜きたいけど,本番のワークロードに影響を与えないでってことになるとこの手法が活きます.

エクスポートプロセスはバックグラウンドで実行されるため、アクティブな DB インスタンスのパフォーマンスには影響しません。

また,CLIAPI もあるので定期的に分析データが閲覧したい場合自動スナップショット取得と組み合わせた自動化の検討もしていけると思います.

準備

さて,エクスポートの準備としてS3 バケットへの書き込みを Aurora サービスに許可するための IAM ロールを作成しておきます.IAM ポリシーとロール,エクスポートのサービス信頼関係を下記のように作っていきます.

IAM ポリシー

{
     "Version": "2012-10-17",
     "Statement": [
         {
             "Effect": "Allow",
             "Action": [
                 "s3:ListBucket",
                 "s3:GetBucketLocation"
             ],
             "Resource": [
                 "arn:aws:s3:::*"
             ]
         },
         {
             "Effect": "Allow",
             "Action": [
                 "s3:PutObject*",
                 "s3:GetObject*",
                 "s3:DeleteObject*"
             ],
             "Resource": [
                 "arn:aws:s3:::[バケット名]",
                 "arn:aws:s3:::[バケット名]/*"
             ]
         }
     ]
}

信頼関係ポリシー

{
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
            "Service": "export.rds.amazonaws.com"
          },
         "Action": "sts:AssumeRole"
       }
     ] 
   }

スナップショットデータのエクスポート

スナップショットは手動または自動で取得しているものをベースにしてデータエクスポートを行います.エクスポートするデータはスナップショットにある全てのデータか,特定のスキーマまたはテーブル単位でエクスポートできます.今回は特定のテーブルデータを出力するパターンを検証していきます.

まず,エクスポートする対象スナップショットを選択して,Amazon S3 へのエクスポートを選択します.

f:id:sadayoshi_tada:20200910080903p:plain

エクスポートに関する設定をしていきます.エクスポートの一意識別子,エクスポートするテーブルの指定を行います.テーブルの指定はスキーマ名.テーブル名で複数指定する場合はカンマ区切りで記載します.今回は前回の記事同様にテストデータをエクスポートします.

f:id:sadayoshi_tada:20200910081126p:plain f:id:sadayoshi_tada:20200910081140p:plain

続いて,エクスポート先の S3 バケットプレフィックス,準備で作った IAM ロールの指定,暗号化で使用する カスタマー管理型の KMS キーを指定します.エクスポートのパスは指定のプレフィックス/エクスポート識別子/スキーマ名/スキーマ名.テーブル名といった構成で作成されます.ここまでの設定が整えば Amazon S3 へのエクスポートを開始します.

f:id:sadayoshi_tada:20200910081755p:plain f:id:sadayoshi_tada:20200910081816p:plain f:id:sadayoshi_tada:20200910081830p:plain

エクスポートはデータサイズによって完了までの時間が異なります.自分の検証では 1GB に満たないデータでしたが,エクスポートが完了したのが約40分ほどでした.そのため,大量のデータをエクスポートする場合は時間に余裕を見ておくと良いと思います.完了すると下記の画像のような状態になります.

f:id:sadayoshi_tada:20200910082436p:plain

パスを辿っていくと,Parquet 形式のファイルが GZIP で圧縮された出力されていることを確認できました.以上でスナップショットからの特定データテーブルエクスポートは完了です. f:id:sadayoshi_tada:20200910082516p:plain

SELECT INTO OUTFILE S3 との使い分けの検討

スナップショットのエクスポートとSELECT INTO OUTFILE S3をそれぞれ使ってみて個人的な使い分けを考えてみました.状況に応じて使い分けをしていければと思います.

  • スナップショットのエクスポートの使い時
    • DB への負荷を気にせずにエクスポートしたい場合
    • 分析するソースファイルが Apache Parquet 形式で事足りる場合
  • SELECT INTO OUTFILE S3の使い時
    • エクスポートするデータサイズからクエリ発行したとしても DB への負荷が低い想定の場合
    • 分析するソースファイルがテキストファイルでも事足りるし,適宜ファイル形式の変換処理も組み込める場合

まとめ

Aurora MySQL のスナップショットから特定テーブルデータを S3 にエクスポートする検証をおこなったのでその整理を行いました.本番ワークロードの DB からデータをエクスポートしたくて,かつスナップショットも存在する場合はこの手法を検討余地があるかと思います.

関連記事

sadayoshi-tada.hatenablog.com