1. はじめに
こんにちは!Sakitsuです。
「RDS から S3 へデータをアップロードしたい」 と考えたとき、最初は RDS → EC2 → S3 のような流れを想像していました。
ですが実際には、RDS から直接 S3 へエクスポートする機能が用意されています!
今回は、この RDS 直接 S3 エクスポート機能を実際に試してみたので、手順や注意点をまとめました。
2. 参考資料
下記 AWS 公式ドキュメントを参考にしました。
RDS から PostgreSQL の DB インスタンスをクエリし、Amazon S3 バケットに保存されたファイルへ直接エクスポートできます。
公式ドキュメント:
https://docs.amazonaws.cn/en_us/AmazonRDS/latest/UserGuide/postgresql-s3-export.html
3. アーキテクト図
4. 手順
4.1 拡張機能のインストールと確認
4.1.1 拡張機能のインストール
拡張機能をインストールするには、以下のコマンドを実行します。
postgres=> CREATE EXTENSION aws_s3 CASCADE;
下記図のように、エラー等は特にないです。
次に、以下のコマンドで、拡張機能がインストールされているか確認します。
postgres=> \dx
下記図のように、「aws_s3」が表示されればインストール完了です。

4.1.2 PostgreSQLがエクスポートをサポートしているかの確認
下記コマンドをAWSマネジメントコンソールのCloudShellで実行します。
aws rds describe-db-engine-versions --region ap-northeast-1 --engine postgres --engine-version 17.4 | grep s3Export
"s3Export" が表示されればサポートされています。
4.2 S3バケットの作成
出力結果を保存用のバケットがない場合は作成する必要があります。
テスト用であれば特にバケットポリシーは不要です。
ただし、暗号化方式は KMS を使用する必要があります。
(デフォルトの S3 SSE でも保存はできますが、AWS にサポートされていないみたいです)
4.3 IAMロールの作成・付与
4.3.1 IAMロールの作成
RDSからS3へエクスポートするために、新しいIAMロールを作成する必要あります。
IAM ロールの信頼ポリシーは 「AWS のサービス → RDS」 を選択します。
今回の例ではS3 と KMS の権限を広めに付与したが、実際の業務では権限を絞ることを推奨します。
4.3.2 IAMロールをRDSへ付与
Amazon S3バケットへのアクセス許可をRDSに与えます。
Aurora / RDS → データベース → 対象インスタンス → 接続とセキュリティ → 最下部に、
「IAMロールの管理」にて付与ができます。
4.4 ネットワークについて
S3 にアクセスするため、以下のネットワーク要件が必要です。
RDS が所属するサブネットのルートテーブルに S3 へのルート を追加します。
RDS のセキュリティグループで S3への443 (HTTPS) のアウトバウンドを許可します。
4.5 動作確認
まず、aws_commons.create_s3_uri 関数で、
エクスポート先の S3 URI を作成します。
psql=> SELECT aws_commons.create_s3_uri(
'amzn-s3-demo-bucket',
'sample-filepath',
'us-west-2'
) AS s3_uri_1 \gset
私の場合は下記のように設定しました。
次に、実際にエクスポート処理を実行します。
psql=> SELECT aws_s3.query_export_to_s3(
'SELECT 1 AS col1, ''abcOK!'' AS col2',
:'s3_uri',
options := 'format csv, header true'
);
S3バケットも確認してみましょう!
下記のように、S3にファイルがエクスポートされています。
ファイルを開くと、エクスポートされたデータを確認できました!!












