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と関数の作成 を行います!