RDS(postgres)からS3にファイルを出力

こんにちは!
今回はRDS(postgres)からs3にファイルを出力する方法について解説しようと思います。

背景

あるシステムのUXの改善に向けた解析をしようと考えており、そのためにデータベース内のデータを解析できる形で出力したかったから。

普段はpgAdmin4というアプリで出力していたのだが、なぜか今回はその方法で失敗したため、別の方法で試してみようとなりました!!


参考(公式見るのが一番!)


アプリの簡単なアーキテクチャ

VPCのpublic-subnetにEC2、private-subnetにRDSを配置


やったこと

  1. RDSにIAMを付与

  2. EC2のインスタンスに入り、postgresqlに接続

  3. s3にファイルを出力


1. RDSにIAMを付与

なんだかんだここで詰まる人が多いと思います。私も以前は全然わかっていませんでした(今でもよく詰まるけど笑)。
今回はただ一回だけファイルをs3に出力できたらいいと思ってるので結構ポリシーあたりはゆるゆるで解説します。

  1. ロールの作成できる場所に移動

  2. 「信頼されたエンティティタイプ」で「AWSのサービス」を選び「ユースケース」でRDSを選択、さらにRDS Add Role to Databaseを選択。

  3. 許可ポリシーに「AmazonS3FullAccess」を選択(ベストプラクティス的にはもっと厳密に設定する必要がある)

  4. ロール名などを決めて、作成

これで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

これを書きながら「ずっしりデニッシュ(りんご)パン」を食べた、美味しかった

いいなと思ったら応援しよう!