継続は力なり

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

Aurora MySQL の特定テーブルデータを SELECT INTO OUTFILE S3 を使って S3 にエクスポートする

タダです.

業務でデータ分析系に関わり始めたのですが,その技術調査として Aurora MySQL 互換から S3 へデータをエクスポートした時の検証を記事にまとめていきます.なお,Aurora のバージョンは 5.6.mysql_aurora.1.22.2 で検証してます.

準備

準備として Aurora 以外の設定箇所で次の作業が必要です.

  1. Aurora にアタッチする IAM ロールの作成
  2. Aurora から S3 へデータを出力するための VPC エンドポイントの作成とルートテーブルの設定

1. Aurora にアタッチする IAM ロールの作成

まず,IAM ロールの作成ですが Aurora から S3 へのアクセス権限を付与します.下記のドキュメントの SELECT INTO OUTFILE S3 を実行したいので,ドキュメント記載の通りに IAM ポリシーを設定しています.

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

IAM ロール作成画面にて RDS – Add Role to Database を選択して RDS サービスで IAM ロールを使用できるように信頼関係は下記の通りにしています.

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

関連ドキュメント

docs.aws.amazon.com

2. Aurora から S3 へデータを出力するための VPC エンドポイントの作成とルートテーブルの設定

Aurora が配置されているネットワークから S3 への経路を確保するために VPC エンドポイント作成とルートテーブル設定を行いました.

Aurora DB クラスターがパブリックアクセス可能ではなく、VPC パブリックサブネットにある場合は、プライベートです。プライベートの DB クラスターがあり、このネットワーク設定を必要とする機能の 1 つを使用する場合があります。その場合、ネットワークアドレス変換 (NAT) を介してインターネットアドレスに接続できるよう、クラスターを設定します。Amazon S3 の代わりに、DB クラスターのルートテーブルに、Amazon S3VPC エンドポイントが関連付けられるように、VPC を設定することもできます。VPC での NAT の設定の詳細については、「NAT ゲートウェイ」を参照してください。VPC エンドポイントの設定の詳細については、「VPC エンドポイント」を参照してください。

関連ドキュメント

docs.aws.amazon.com

Aurora から S3 へのデータエクスポート

準備が終わったら Aurora 側の作業に移ります.

  1. Aurora に IAM ロール付与するために DB クラスターグループの設定変更
  2. Aurora に準備で作成した IAM ロール付与
  3. データをエクスポート用のデータベースユーザーへの権限付与

docs.aws.amazon.com

1. Aurora に IAM ロール付与するために DB クラスターグループの設定変更

DB クラスターグループのパラメーターに aurora_select_into_s3_roleaws_default_s3_role で準備していた IAM ロールの ARN を設定します.

2. Aurora に準備で作成した IAM ロール付与

Aurora クラスターの接続とセキュリティの画面から IAM ロールを指定して追加します.追加できると下記のように設定した IAM ロール

f:id:sadayoshi_tada:20200908214939p:plain

3. データをエクスポート用のデータベースユーザーへの権限付与

Aurora で作成されるデフォルトの管理者ユーザーで実行しないと思われるので,S3 へのエクスポートを実行するユーザーへの権限付与を次のクエリで行います.

GRANT SELECT INTO S3 ON *.* TO 'user'@'domain-or-ip-address'

検証では以下のリポジトリにあるテストデータを投入して,employees DB の departments テーブルをエクスポートしてみました.

github.com

S3 へ出力する SQL を発行します.構文はドキュメントに記載があるのですがその定義に沿って書きました.

SELECT * FROM departments INTO OUTFILE S3 's3://***/[日付]/employees/departments'
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    MANIFEST ON

指定した S3 バケットをみに行くとマニフェストファイルとデータのファイルが作成されていました.

f:id:sadayoshi_tada:20200908184118p:plain

注意点 Aurora から S3 へのデータエクスポートはできたのですが,検証していて個人的に気になったところを列挙していきます.

  • 検証で試したバージョンにおいては Aurora から S3 へのデータ出力はテキストファイルのみの対応で,CSVJSON でエクスポートしたファイルを扱いたい場合は別途処理が必要でした
    • ドキュメントに記載のようにFORMAT {CSV|TEXT} [HEADER] は Aurora MySQL バージョン 2.07.0 以降で対応しています
  • 検証ではそこまでデータがデカくなったため気にしなかったのですが,ファイルサイズの閾値があるためデータサイズが大きい時,複数ファイルが作られる場合もあることもあります

デフォルトのファイルサイズのしきい値は 6 GB です。ステートメントで選択したデータがファイルサイズのしきい値より少ない場合は、1 つのファイルが作成されます。それ以外の場合は、複数のファイルが作成されます。

  • また,データが25 GB を超える場合は S3 のファイルプレフィクスを変更しつつ複数回のクエリ発行が推奨されてます.

選択するデータが 25 GB を超える場合は、複数回の SELECT INTO OUTFILE S3 ステートメントを使用してデータを Amazon S3 に保存することをお勧めします。実行するステートメントごとに、保存するデータ部分を選択し、保存先として s3-uri パラメータに異なる file_prefix を指定します。選択するデータを複数のステートメントパーティション化すると、1 つのステートメントでエラーから回復しやすくなります。1 つのステートメントでエラーが発生した場合は、データの一部だけを再選択して Amazon S3 にアップロードする必要があります。複数のステートメントを使用すると、1 回のトランザクションの実行時間が短くなり、パフォーマンスも向上します。

まとめ

Aurora MySQL のデータを S3 にエクスポートする方法と注意点を整理しました.この記事では,S3 にデータを吐き出して終わりですが,ここからデータ分析として AWS や他のクラウドサービスと組み合わせていい感じに料理していけます.S3 を中心にデータ活用の幅を広げていきたいです.

参照記事

kakakakakku.hatenablog.com