はじめに
こんにちは、サメ映画をこよなく愛する梅木です。某家具店のサメのぬいぐるみを購入し毎日のように癒されています。
今回のブログでは、Aurora に格納されているデータをSQL文を利用して S3バケットに出力する機能である aws_s3 拡張 S3Export 機能を紹介します。
本記事では、基本編として デフォルト暗号化(SSE-S3)のS3バケットへのエクスポート の動作検証をゴールとして、必要なAWSリソースと構築手順を記載します。
実践編では、SSE-KMS暗号化されたS3バケットへのエクスポートという実際の本番ワークロードに近い構成での構築手順を解説します。
aws_s3 拡張機能とは
Aurora PostgreSQL に用意されている拡張機能で、SQL の SELECT 文の結果を S3 バケットへ直接エクスポートしたり、逆に S3 上のファイルを Aurora へインポートしたりできる機能です。 出力形式は CSV や TSV などのテキスト形式に対応しており、ヘッダ行の有無なども options パラメータで指定できます。 Aurora から S3 へデータを連携しようとすると、アプリケーション側でデータを取得して S3 に書き込む処理を実装する必要があります。 本機能を利用することにより、SQL を実行するだけで S3 への書き出しが完結するためとても便利です。
構成図
今回は、以下のような構成で aws_s3 拡張機能によるデータエクスポートを試します。

今回の検証で使用するAWSリソースは以下のとおりです。
| リソース | 内容 |
|---|---|
| Aurora PostgreSQL | データのエクスポート元。今回は検証用途のため db.t3.medium、シングル構成 としました。s3拡張が利用可能なバージョンについては Amazon RDS for PostgreSQL の拡張機能バージョン - Amazon Relational Database Service をご確認ください |
| S3バケット | デフォルト暗号化(SSE-S3) |
| IAMロール | Aurora (aws_s3 拡張でのエクスポート処理) に付与するS3エクスポート用ロール |
| S3 のゲートウェイエンドポイント | Aurora から S3 への接続経路 |
| CloudShell | DBへの接続用ターミナルとして利用 |
その他、VPC、サブネット、Security Group など作成しています。
なお、リージョンは aws_s3 拡張はAuroraクラスターと同一リージョンのS3バケットのみ のアクセスに対応しています。AuroraクラスターとS3バケットを構築するリージョンは統一する必要がありますのでご注意ください。
検証
下記の流れで実施していきます。

- Aurora用のIAMポリシー&IAMロールを作成
- IAMロールをAuroraクラスターに付与
- aws_s3拡張のインストール
- エクスポート実行
- S3バケットを確認
手順
事前準備
事前準備として、VPC、データエクスポート元のAurora、エクスポート先のS3バケット(SSE-S3暗号化)を作成しておきます。
1. Aurora用のIAMポリシー&IAMロールを作成
IAMコンソールに移動し、以下のIAMポリシーを作成します
- IAMポリシー(S3書き込み権限)
※ <BUCKET> は実際のバケット名に置き換える必要があります
{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3exportBucket", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::<BUCKET>" ] }, { "Sid": "s3exportObject", "Action": [ "s3:PutObject*", "s3:ListBucket", "s3:GetObject*", "s3:DeleteObject*", "s3:GetBucketLocation", "s3:AbortMultipartUpload" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::<BUCKET>/*" ] } ] }
- IAMロール
上記のS3バケットへの読み書き権限を設定したIAMポリシーをアタッチしたIAMロールを作成します。
指定するパラメーターは下記の通りです。
| パラメータ | 設定値 |
|---|---|
| 信頼されたエンティティタイプ | AWS のサービス |
| ユースケース | サービスまたはユースケース:RDS ユースケース:RDS - Add Role to Database |
| 許可ポリシー | 前段の手順で作成したIAMポリシー |
| ロール名、説明 | 任意 |
下記の通りに設定されていれば問題ありません。
「許可」タブ

許可ポリシー 「信頼関係」タブ

信頼されたエンティティ
2. IAMロールをAuroraクラスターに付与
AWSマネジメントコンソールからRDS コンソールを表示し、対象 Aurora クラスターをクリックします(ステータスが利用可能でないと設定できませんのでご注意ください)
「接続とセキュリティ」タブ→「IAMロールの管理」を表示します。
手順1で作成したIAMロールを選択し、機能(Feature)に
s3Exportを指定して [追加] をクリックします

- ステータスが「アクティブ(available)」になるまで待ちます
ここまでで、s3Export 機能に対して、S3バケットへの書き込み権限設定の付与が行えました。
3. aws_s3拡張のインストール
ここからは、psql コマンドでデータベースに接続して作業を行います。 今回は検証用途のため CloudShell を利用して接続を行いました(psqlはすでにインストールされています)
CloudShell を利用する場合は、Auroraクラスターを選択し「接続とセキュリティ」タブ→「クラウドシェル」→「クラウドシェルを起動」をクリックすることで簡単に起動できます。

データベースに接続し、下記のコマンドを実行します。
postgres=> CREATE EXTENSION aws_s3 CASCADE;
CREATE EXTENSION と表示されていればOKです。
下記のコマンドを実行します。
postgres=> \dx
下記のように、aws_s3 と記載された行が表示されていれば拡張機能がインストール出来ています。
Name | Version | Schema | Description -------------+---------+------------+--------------------------------------------- aws_commons | 1.2 | public | Common data types across AWS services aws_s3 | 1.2 | public | AWS S3 extension for importing data from S3 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows)
4. エクスポート
検証用のテーブルを作成します。
postgres=> CREATE TABLE handson_t (id int, name text);
CREATE TABLE と表示されていればOKです。
続いて、テストデータを登録します。
postgres=> INSERT INTO handson_t VALUES (1,'alice'),(2,'bob');
INSERT 0 2 と表示されていればOKです。
エクスポートを実行します。
下記のように aws_s3.query_export_to_s3 拡張機能を利用しSQL文を実行します。
postgres=> SELECT * FROM aws_s3.query_export_to_s3(
'SELECT * FROM handson_t',
aws_commons.create_s3_uri('<BUCKET>', '<Filepath>', 'ap-northeast-1'),
options := 'format csv, header true'
);
rows_uploaded | files_uploaded | bytes_uploaded
---------------+----------------+----------------
2 | 1 | 22
(1 row)
※ <BUCKET> は実際のバケット名に置き換える必要があります。
※ <Filepath> は出力先のS3パスを記載します。例えば、exports/handson を指定する場合 s3://
5. S3バケットを確認
データがエクスポートされているか確認しましょう。
- S3バケット:手順4
<BUCKET>で指定したS3バケット - ファイルパス:手順4
<Filepath>指定したファイルパス
S3バケットを確認すると、対象のデータが以下のように出力されていました!
id,name 1,alice 2,bob
まとめ
IAMポリシー、IAMロールを利用し権限設定を行うことで、S3バケットに簡単・安全にデータをエクスポートできました。 今回は、基礎編ということでデフォルト暗号化(SSE-S3)されたS3バケットに対して S3Export を実行してみました。 次回は応用編として、KMSにより暗号化されたS3バケットへの S3Export を実行してみたいと思います。