先日より、Flywayを使ってRDSのデータベースマイグレーションをLambda関数を使って実装できないかやってみています。前回までの記事は以下を参照。
接続先のRDSに関するJDBC URLやユーザー名、パスワードはとりあえずLambda関数の入力としました。パスワードなどが暗号化もされずに受け渡されるのでよろしくはないのですが、とりあえず動作確認のため。
実装はPOJO形式で実装。デフォルトコンストラクタのほか、各フィールドに対してsetter/getterの用意が必要となります。
こんな感じ。
public class Input { private String jdbcURL; private String userName; private String password; public Input() { } public Input(String jdbcURL, String userName, String password) { this.jdbcURL = jdbcURL; this.userName = userName; this.password = password; } public void setJdbcURL(String jdbcURL) { this.jdbcURL = jdbcURL; } public void setUserName(String userName) { this.userName = userName; } public void setPassword(String password) { this.password = password; } public String getJdbcURL() { return jdbcURL; } public String getUserName() { return userName; } public String getPassword() { return password; } }
Flywayで実行するSQL文はとりあえずアプリケーションのsrc/resources/db/migration/
以下にV1__CreatePeopleTable.sql
として格納しました。中身は以下の通り。
CREATE TABLE people ( id INTEGER NOT NULL , name VARCHAR(50) NOT NULL );
本当はS3とかに格納したものを参照するとよいのですが、これも後回しで。
あとはFlywayのAPIを使ってmigrateを実行します。
Flyway flyway = Flyway.configure() .dataSource(input.getJdbcURL(), input.getUserName(), input.getPassword()).load();
LambdaからVPC内にあるRDSへの接続については、以下のAWSが公開しているチュートリアルを参考に。
IAMロールとしてAWSLambdaVPCAccessExecutionRole
が必要なことと、VPCの設定がポイントでしょうか。
あとは実行してみると、あっけなく成功。RDSの中身を見てみます。
postgres=> \dt List of relations Schema | Name | Type | Owner --------+-----------------------+-------+---------- public | flyway_schema_history | table | postgres public | people | table | postgres (2 rows) postgres=> select * from flyway_schema_history; installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success ----------------+---------+-------------------+------+---------------------------+------------+--------------+---------------------------+----------------+--------- 1 | 1 | CreatePeopleTable | SQL | V1__CreatePeopleTable.sql | 1069709808 | postgres | 2023-10-08 04:43:51.513347 | 26 | t (1 row) postgres=> select * from people; id | name ----+------ (0 rows) postgres=> exit;
Flywayの管理用テーブルflyway_schema_history
が作られ無事people
テーブルも作られていることが確認できました。