AWSのAuroraのデータをテーブル単位でS3に保存する

どんどん便利になっていくんだが知識が追いつかない

この記事を三行にまとめると

IAMロールとポリシーが必要
KMSのカスタムキーも必要
S3で直接クエリを書いて検索できる
Aurora(MySQL)のデータのバックアップを取るためには主にスナップショットを作成するという方法がありますね。

でもこれだとDB丸ごとのバックアップしか取れない上、もしここから過去のデータを漁りたい場合にはスナップショットからDBを新規に作成して接続して調べるという手順を踏まないといけません。こいつが結構手間だったりする。DBが作成されるまで待ってなきゃいけないし、終わったら忘れずに削除しないと不要な費用が発生しちゃうし。

なのでMySQLでバックアップデータを取る際にはmysqldumpを使ってテーブル単位でSQLファイルを作成し、そいつをS3に保存しておく方が良いような気がするんですが、でもデータが少ないうちはこれでも良いんですけど、ある程度ボリュームが膨らんでくるとmysqldumpがいつまで経っても終わらないみたいな事態になったりして、それはそれで都合がよくない。

でも最近知ったんですけど、mysqldumpを使わなくてもRDSにはテーブル単位でS3にデータをエクスポートしてくれる機能があるんですね。以前はスナップショットのデータをS3にエクスポートする機能しかなかったようなんですが、今は稼働中のDBクラスターのデータをS3にエクスポートできるので、今回はこれを使ってAuroraのデータをS3に保存してみたいと思います。

今回はAuroraのDBと保存先のS3のバケットがすでにあるという前提で話しますので、AuroraやS3のバケットの作成方法についてはすみませんが別途ググったりジピったりしてください。

ジピる・・・ChatGPTさんに訊ねること。今適当に考えた。



IAMのロールとポリシーを作成

エクスポートを行うためにはIAMのロールとポリシーが必要になりますが、ロールを作成する際に許可するポリシーの設定が必要になるので、まずはポリシーから作成します。

IAMのポリシー

ポリシーの新規作成画面を開いたらビジュアルではなくJSONの入力画面に切り替えて以下のポリシーを記述します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject*",
        "s3:ListBucket",
        "s3:GetObject*",
        "s3:DeleteObject*",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::bucket-name",
        "arn:aws:s3:::bucket-name/*"
      ]
    }
  ]
}

「bucket-name」のところには保存先のS3のバケット名を書きます。

あとは適当にポリシー名を入力してポリシーを作成します。

ポリシーが作成できたら今度はロールの新規作成画面を開きます。

IAMのロール

カスタム信頼ポリシーを選択して以下のポリシーを記述します。

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

あとは許可ポリシーで先ほど作成したポリシーにチェックを入れて、適当にロール名を入力してロールの作成を完了します。



KMSでカスタムキーを作成する

エクスポートを行うにはIAMのロール以外にKey Management Serviceのカスタムキーも必要になります。

キー設定はデフォルトのままでOKです。エイリアス名も何でも良いです。

重要なのはキーユーザーのところで先ほど作成したロールを選択することです。

Key Management Servieのカスタムキー

上の画像ではaurora-exportとなっていますが、これは僕が適当に作った名前なので、各自自分で作成したロール名を探してチェックを入れてください。

これでエクスポートを行う準備が整いました。



実際にエクスポートしてみる

RDSのクラスターを選択するとアクションの中に「Amazon S3にエクスポート」という項目があるのでこれを選択します。

RDSのクラスター

選択するとエクスポートに必要な設定画面が出てくるのでそれぞれ入力します。

エクスポートの設定画面

識別子は一意であれば何でも良いです。エクスポートされたデータは一部を選択すれば特定のテーブルだけをエクスポートしたりできます。

あとは保存先のS3のバケットを選択して必要ならプレフィックスを入力し、上記で作成したIAMのロールとKMSキーを選択してエクスポートボタンを押せばエクスポートが始まります。

エクスポートにかかる時間はデータの量によっても変わってくるみたいなんですが、僕がやったときは15〜30分くらいで完了しました。内部的にはクラスターのクローンを作成してそこからデータがエクスポートされるらしいので、このエクスポートによって稼働中のDBに負荷がかかる心配はないようです。

ちなみにIAMロールはあらかじめ作っておかなくてもここで「新しいロールの作成」を選択すればエクスポート時にロールが作成されるみたいなんですが、僕がやったときはエラーになってエクスポートが上手くいかなかったので、あらかじめ作っておいた方が良いと思います。ロールは確かに自動で作成されたんですけど、そのロールに必要なポリシーが適切にくっつかなかったとかそんな感じっぽかったです。



S3のデータを見てみる

無事にエクスポートが終わるとS3のバケットに「xxx.parquet」という形式のファイルが保存されています。これはApache Parquetという形式のデータファイルで、このファイル自体はバイナリファイルなのでテキストエディタで開くにはいろいろ手間がかかるんですが、ファイルのオブジェクトアクションで「S3 Select を使用したクエリ」を選択すればS3の中で直接クエリを書いてデータを検索したりできます。

S3のクエリ

あまり複雑なクエリは書けないみたいですが、ここで直接検索できるのは便利ですね。僕がやってみた限りではORDER BYとかGROUP BYとかは使えませんでした。

より複雑なクエリを書きたい場合はAthenaを使う必要があるみたいですが、Athenaはまだ使ったことがないので今回はここまでとさせていただきます。






説明がざっくりな感じなのでちょっと分かりづらい部分があるかもしれませんが、やってみるとそんなに難しくないのでポリシーの書き間違えとかがなければわりとスムーズにいけると思います。

またデータはテーブル単位で保存されるだけでなく、データの量が多い場合は自動的に分割した状態で保存してくれるので、クエリの処理に時間がかかったりとかもなくてありがたい感じです。

今回は手動でエクスポートするやり方でしたが、Lambdaと組み合わせれば日時でエクスポートしたりとかもできそうですね。近いうちにそれも試してみたいと思います。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください