カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

RDSデータをS3にParquet形式で出力する

タイトル通りです。
具体的には以下のドキュメントに書いてある手順を実際に行っていきます。
Amazon S3 への DB スナップショットデータのエクスポート - Amazon Relational Database Service


データは以下の記事で準備したものを利用します。
RDSにCloudShellからアクセスしてみる - カピバラ好きなエンジニアブログ

実施作業

スナップショット取得

既にRDS上にサンプルデータは登録されているので、以下の過去記事を元に手動スナップショットを取得します。
Amazon RDS(PostgreSQL)の手動スナップショットを取得する - カピバラ好きなエンジニアブログ


スナップショット名はtest-snapshot-2にしました。
f:id:live-your-life-dd18:20220121160439p:plain

出力先S3バケット作成

次に出力先のS3バケットを作成します。
名前はわかりやすくtest-tmp-rds-outputというものにしました。
f:id:live-your-life-dd18:20220121160601p:plain

データエクスポート実行

RDSのスナップショット画面から取得したスナップショット名を選択し、アクションからAmazon S3へのエクスポートを押下します。
f:id:live-your-life-dd18:20220121160715p:plain


エクスポート画面に遷移するため、入力規則に従って識別子を入力します。
f:id:live-your-life-dd18:20220121161041p:plain


次にエクスポートデータと出力先を定義します。
エクスポート対象は識別子を利用して絞ることが可能ですが、今回はそこまでデータ量もないので全データをエクスポートします。
S3には先ほど作成したバケット名を指定します。
f:id:live-your-life-dd18:20220121161201p:plain


エクスポートタスクを代理実行するIAMロールと暗号化に使用するKMSキーを指定します。
f:id:live-your-life-dd18:20220121161331p:plain


IAMロールには最低限必要な権限がありますので、それ等の権限を保有するロールを指定してください。
f:id:live-your-life-dd18:20220121161440p:plain
Amazon S3 への DB スナップショットデータのエクスポート - Amazon Relational Database Service


あとは以下のサービスをロールの信頼関係に追加しておく必要があるようです。

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



ここまで入力できたらエクスポートボタンを押下します。
料金はサイズによるようなので、サイズの大きいスナップショットからエクスポートする場合はご注意ください。
f:id:live-your-life-dd18:20220121161548p:plain


エクスポートタスクが実行できると以下のようにステータスが起動中になります。
f:id:live-your-life-dd18:20220121162038p:plain


何故起動中かというと、以下のドキュメントに書いてある通り、一度スナップショットから復元が行われ、そのあとにエクスポートするような処理になっているため、バックグラウンドでデータベースの起動が行われているものと思います。
ちなみにコンソール上からはそういったリソースは確認できませんでした。
f:id:live-your-life-dd18:20220121162222p:plain
Amazon S3 への DB スナップショットデータのエクスポート - Amazon Relational Database Service


しばらく待つとステータスが完了になりました。
f:id:live-your-life-dd18:20220121182607p:plain

エクスポート結果確認

出力先のS3バケットを確認してみます。

rds-[DB名]-exportという名前のフォルダが作成されており、その中にはjsonファイルが2つとDB名のフォルダが1つ作成されていました。
f:id:live-your-life-dd18:20220121182714p:plain


jsonファイルをS3 Selectで見てみると、1つのファイルにはエクスポートで設定した情報とエクスポート結果が記載されており、もう一つのファイルにはデータ型のマッピング情報が書いてありました。


export_info_rds-sampledata-export.json

{
  "exportTaskIdentifier": "rds-sampledata-export",
  "sourceArn": "arn:aws:rds:ap-northeast-1:123456789123:snapshot:test-snapshot-2",
  "exportOnly": [],
  "snapshotTime": "Jan 21, 2022, 6:54:55 AM",
  "taskStartTime": "Jan 21, 2022, 7:33:04 AM",
  "taskEndTime": "Jan 21, 2022, 7:35:49 AM",
  "s3Bucket": "test-tmp-rds-output",
  "s3Prefix": "",
  "exportedFilesPath": "rds-sampledata-export",
  "iamRoleArn": "arn:aws:iam::123456789123:role/xxxx",
  "kmsKeyId": "arn:aws:kms:ap-northeast-1:123456789123:key/[ランダム文字列]",
  "status": "COMPLETE",
  "percentProgress": 0,
  "totalExportedDataInGB": 0.012930341064929962
}



export_tables_info_rds-sampledata-export_from_1_to_17.json

{
  "perTableStatus": [
    {
      "tableStatistics": {
        "extractionStartTime": "Jan 21, 2022, 7:33:59 AM",
        "extractionEndTime": "Jan 21, 2022, 7:34:10 AM",
        "partitioningInfo": {
          "numberOfPartitions": 1,
          "numberOfCompletedPartitions": 1
        }
      },
      "schemaMetadata": {
        "originalTypeMappings": [
          {
            "columnName": "actor_id",
            "originalType": "integer",
            "expectedExportedType": "int32",
            "originalCharMaxLength": 0,
            "originalNumPrecision": 32,
            "originalDateTimePrecision": 0
          },
          {
            "columnName": "first_name",
            "originalType": "character varying",
            "expectedExportedType": "binary (UTF8)",
            "originalCharMaxLength": 45,
            "originalNumPrecision": 0,
            "originalDateTimePrecision": 0
          },
~省略~



DB名フォルダ配下には[スキーマ名].[テーブル名]のフォーマットでフォルダがあり、テーブル名フォルダ配下にはparquetファイルとエクスポート結果が書かれたオブジェクトが格納されていました。
f:id:live-your-life-dd18:20220121183349p:plain
f:id:live-your-life-dd18:20220121183444p:plain


ParquetファイルをS3 Selectで見るとデータが確認できるので、エクスポートは問題なく成功しているようです。
f:id:live-your-life-dd18:20220121183551p:plain

データエクスポート実行(2回目)

同じ出力先にもう一度エクスポートしたらどうなるか気になったので、再度エクスポートを実行してみます。
f:id:live-your-life-dd18:20220121183843p:plain


S3を確認するとエクスポートの識別子でフォルダが分かれるようなので、同じフォルダに上書きはできないようです。
f:id:live-your-life-dd18:20220121200442p:plain


同じエクスポート識別子で作成しようとするとエラーが出たので、やはり同じ出力先にエクスポートするのは無理そうです。
f:id:live-your-life-dd18:20220121200538p:plain

感想及び所感

一時的にRDSのデータをS3に出力させるのであれば、このエクスポート機能が使えそうです。
ただ、定期的な出力をしようと思うと識別子名に実行日付を含めて日付ごとにエクスポートするなどの工夫が必要なので、実務で利用する際は考慮が必要だと感じました。