Edited at

AWS RDSをマイグレーションするLambda関数を作りました

More than 1 year has passed since last update.

AWS RDS データベースを、DBマイグレーションツール Flyway を使って自動的にマイグレーションする AWS Lambda関数 「flyway-awslambda」 を作りました。

ソースコード、モジュールはGitHubで公開しています。

https://github.com/crossroad0201/flyway-awslambda


モチベーション

インターネットからのパブリックアクセスを許可していないRDSデータベースに対してDBマイグレーション(テーブルの作成や変更など)を行う場合、わざわざ同じVPC内にEC2インスタンスを立てて、EC2にSSHして、EC2上でマイグレーションを実行して...と言う手順を踏むことが多いと思います。

単純に面倒なだけではなく、今注目されているマイクロサービス化で必要となる継続的デリバリーを実現する上での問題にもなるので、RDSのマイグレーションを自動化したいと考えました。


flyway-awslambdaとは

flyway-awslambda は、RDSのマイグレーションを実行してくれるAWS Lambda関数です。

任意のS3バケットのオブジェクト作成イベントに flyway-awslambda を関連付けておくことで、

S3バケットにSQLファイルをアップロードすると、自動的に起動してRDSに対してSQLを実行します。

SQLファイルをS3バケットにアップロードするだけでDBマイグレーションができるので、

EC2を立てたり、手動でマイグレーションコマンドを実行したりする必要がなくなります。


セットアップ

GitHubのREADME を参照してください。

手作業でセットアップすることも、CloudFormationを使って自動的にセットアップすることも可能です。

大まかには


  1. SQLファイルを置くS3バケットを作り、Flywayの設定ファイルを置く。


  2. flyway-awslambda のLambda関数を作り、S3バケットに紐付ける。

だけです。


注意点


  • Lambda関数からRDSにアクセスするために、Lambda関数にVPCを関連付ける必要があります。


  • Lambda関数にVPCを関連付けると、こんどはLambda関数からS3バケットにアクセスできなくなります。VPCエンドポイント を設定することで、S3バケットにアクセスできるようにします。


  • Lambda関数をVPCをに関連付けることで、VPC Lambda用のENIが自動的に作成されます。(AWS Lambda VPC ENI: **** と言う説明が付きます)

    このENIはLambda関数を削除しても同時に削除されずに残ってしまうので、紐付いたVPCが削除できなくなる問題があります。

    Lambdaが最後に実行されてから一定時間経過すると自動的に削除されるらしいのですが、VPCを削除する前にこのENIを確認して必要であれば手動でデタッチ→削除してください。



実行

作成したS3バケットにFlywayのルールにそって作成したSQLファイルをアップロードすると、自動的にマイグレーションが実行されます。

実行結果はS3バケットに作成される migration-result.json で確認できます。


2016/12/28追記:手動でマイグレーションを実行できるようになりました

Ver.0.2.0 で、上記の「S3にSQLファイルをアップすると自動的にマイグレーション」に加えて、「あらかじめS3にSQLファイルをアップしておいて、任意のタイミングでマイグレーションを起動する」こともできるようになりました。

実は従来の実行方法では、S3イベントの発生単位・タイミングの都合上、実質的にSQLファイルをひとつずつアップロードしてはマイグレーションが実行されるのを待つ、を繰り返すしかなく、ちょっと使いづらいところがありました。

今回追加した実行方法では、複数のSQLファイルをS3にアップしてからまとめてマイグレーションができます。

こちらの方法で起動する場合は、Lambda関数で指定するハンドラクラスが違うのと、S3イベントのトリガー設定は不要になります。

詳細は README を参照してください。