合同会社FoodIT

(1)RDSのトリガーを使って、jsonデータをS3へエクスポート

post-cover

RDS(postgres)のトリガー機能を使ってS3へjsonエクスポート

やりたいこと: RDSからフロント側のSPA用のjsonを出力し、S3(by cloud front)活用できるようにする。目指せ、jamstack構成化

Aurora PostgreSQL DB クラスターから Amazon S3 へのデータのエクスポート

今回は長いので、2つに分けます><

DB(MySQL/Postgres)に標準装備されている、トリガー機能はご存じでしょうか?

あるテーブルに(INSERT/UPDATE/DELETE)などの変更が生じた際に、DBの関数を実行するというものです。

例えば以下のusersテーブルの

ID user_name user_group
1 bar1 1
2 bar2 1
3 bar3 1
4 foo1 1
5 foo2 1
6 foo3 1

このテーブルに対して以下のSQLを実行すると以下のようなデータが取得できます。

SELECT 
 user_group, array_to_json(array_agg(user_name))
FROM users 
WHERE user_group = 1 
Group By user_group

pgsql > 1\t["foo2","foo1","bar3","bar2","bar1"]

では早速jsonデータを

RDSのpostgresに対してはS3に対してのアクセスするためのプラグインを導入いたします。

参考:https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/postgresql-s3-export.html

下記のSQLを実行し、aws_s3プラグインを導入

CREATE EXTENSION IF NOT EXISTS aws_s3 CASCADE;

続いてS3にデータがPUTできるか試してみましょう!

SELECT * from aws_s3.query_export_to_s3(
\'SELECT 
 user_group, array_to_json(array_agg(user_name))
FROM users 
WHERE user_group = 1 
Group By user_group\', 
aws_commons.create_s3_uri(
\''.getenv('S3_BUCKET').'\', 
\'/username.json\', 
\''.getenv('REGION').'\'), 
 options :=\'format text\'
);

上記を実行すると、S3にデータがうまくPUTできるようになると思います。

ただしこのままでは、RDSからS3に転送した時に自動的に暗号化が実施されます。

引用:Amazon S3 へのアップロードでは、デフォルトでサーバー側の暗号化が使用されます。暗号化を使用する場合は、Amazon S3 バケットをAWS マネージドキーで暗号化する必要があります。現在、カスタマーマネージドキーを使用して暗号化されたバケットにデータをエクスポートすることはできません。

また、jsonフォーマットになっていないため、次回 ・lambdaを使用して暗号化を解除、jsonフォーマットの正規化 ・postgresqlへのtriggerと関数の作成 を行います!

© 2022 xshsaku foodit.co.jp