RDS(postgres)からS3にファイルを出力
こんにちは!
今回はRDS(postgres)からs3にファイルを出力する方法について解説しようと思います。
背景
あるシステムのUXの改善に向けた解析をしようと考えており、そのためにデータベース内のデータを解析できる形で出力したかったから。
普段はpgAdmin4というアプリで出力していたのだが、なぜか今回はその方法で失敗したため、別の方法で試してみようとなりました!!
参考(公式見るのが一番!)
アプリの簡単なアーキテクチャ
VPCのpublic-subnetにEC2、private-subnetにRDSを配置
やったこと
RDSにIAMを付与
EC2のインスタンスに入り、postgresqlに接続
s3にファイルを出力
1. RDSにIAMを付与
なんだかんだここで詰まる人が多いと思います。私も以前は全然わかっていませんでした(今でもよく詰まるけど笑)。
今回はただ一回だけファイルをs3に出力できたらいいと思ってるので結構ポリシーあたりはゆるゆるで解説します。
ロールの作成できる場所に移動
「信頼されたエンティティタイプ」で「AWSのサービス」を選び「ユースケース」でRDSを選択、さらにRDS Add Role to Databaseを選択。
許可ポリシーに「AmazonS3FullAccess」を選択(ベストプラクティス的にはもっと厳密に設定する必要がある)
ロール名などを決めて、作成
これでIAMの出来上がり。参考においてあるAWSのガイドにはもっと厳密なポリシーなどが書かれているのでそちらも参考にしてみてください!
次にRDSに移動して、DBを選択。すると、一番したにIAMロールの管理というセクションがあるので、そこでIAMを付与してください。
機能のところはs3Exportです。
これでおしまい!!
2. EC2のインスタンスに入り、RDSに接続
ということでEC2のインスタンスへの入り方はお任せしますが、私はAWSのコンソールから接続します。
, #_
~\_ ####_ Amazon Linux 2
~~ \_#####\
~~ \###| AL2 End of Life is 2025-06-30.
~~ \#/ ___
~~ V~' '->
~~~ / A newer version of Amazon Linux is available!
~~._. _/
_/ _/ Amazon Linux 2023, GA and supported until 2028-03-15.
_/m/' https://aws.amazon.com/linux/amazon-linux-2023/
3. s3にファイルを出力
rdsに接続
psql -h ***********.rds.amazonaws.com -U user名 -d db名
=> CREATE EXTENSION aws_s3 CASCADE;
NOTICE: installing required extension "aws_commons"
CREATE EXTENSION
SELECT aws_commons.create_s3_uri(
's3のバケット名',
'フォルダ名/保存したいファイル名',
'ap-northeast-1'
) AS s3_uri_1 \gset
SELECT * FROM aws_s3.query_export_to_s3('SELECT * FROM exportしたいtable名', :'s3_uri_1');
rows_uploaded | files_uploaded | bytes_uploaded
---------------+----------------+----------------
3958 | 1 | 151505664
(1 row)
これで完了しました!!
最後に
もう使わないな、今回限りだなって思ったら後片付けとしてRDSからIAMを外しておきましょう!
private-subnetにRDSを置けるのは安全でいいんだけどいちいちデータを取り出すのが面倒なんだよな、、笑
もっと簡単な方法探します。。。
おまけ(遭遇したエラー)
ERROR: relation "出力したいテーブル名" does not exist
LINE 1: SELECT aws_s3.query_export_to_s3(
^
QUERY: SELECT aws_s3.query_export_to_s3(
$1,
$2.bucket,
$2.file_path,
$2.region,
$3,
$4)
psqlには入ってるけどdatabaseを選んでなかった
おまけ2
これを書きながら「ずっしりデニッシュ(りんご)パン」を食べた、美味しかった