こんにちは。 エキサイト株式会社の三浦です。
JavaのアプリケーションでDBを扱っている場合、DBのマイグレーションのためにFlywayを使っている方も多いのではないでしょうか。
今回は、マイグレーションに使用するSQLファイルについて、ローカルではなくS3上にあるものを使用する方法を紹介します。
Flywayとは
Flywayは、DBのマイグレーションに使用するツールです。
公式には以下のように説明されています。
Version control for your database
Robust schema evolution across all your environments. With ease, pleasure, and plain SQL.
Flywayを使用することで、例えば開発環境用のDBをローカルPCのコンテナに簡単に構築することができたりします。
マイグレーション用SQLファイルの場所
FlywayでDBのマイグレーションを行うには、マイグレーション先DBとマイグレーション用SQLファイルを指定する必要があります。
以下のような形です。
# DB指定 flyway.url=jdbc:mysql://localhost:3306/sampledb flyway.user=sample-user flyway.password=sample-password # SQLファイルのパス指定 flyway.locations=filesystem:path/to/sampledb/schema
このようにすれば、ローカルPCの指定パスに存在するファイルを使ってマイグレーションを行ってくれます。
これで十分な場合もあるかもしれませんが、例えばアプリケーションをGithubでバージョン管理しており、本来はマイグレーション用SQLファイルも同様に管理したいものの、DB内のテーブル数やその中のレコード数がかなり多かったり、あまり外部に公開したくないデータが含まれていたりして、バージョン管理が難しく、結果直接ファイルをローカルPCに持ってくるのが難しい場合もあるでしょう。
そういった場合は、Flywayから直接S3上のSQLファイルを指定することができます。
S3上のマイグレーション用ファイルを使用する方法
S3上のファイルを使用するには、まずAWS認証のための設定をする必要があります。
認証情報をローカルPCに入れる
まずは該当S3バケットが存在するAWSアカウントで、認証用のIAMユーザを作成します。
その後、 aws configure
コマンドでローカルPCにクレデンシャル情報を設定してください。
この時、設定したアカウントの profile
が default
であればそのままで構いませんが、もしそれ以外であれば、環境変数で以下のように設定します。
AWS_PROFILE={該当アカウントのprofile名}
これで、Flywayで使用したいAWSアカウントの認証情報の設定が完了しました。
FlywayでS3を使用できるようにする
続いて、FlywayがS3を使用できるようにします。
build.gradleに以下のように設定します。
buildscript { repositories { mavenCentral() } dependencies { // バージョンは必要に応じて変更 classpath platform('software.amazon.awssdk:bom:2.17.160') classpath 'software.amazon.awssdk:s3' } }
これで、FlywayでS3を使用できるようになります。
ロケーション指定
ここまでくれば、後はS3上のロケーションを指定するだけです。
# DB指定 flyway.url=jdbc:mysql://localhost:3306/sampledb flyway.user=sample-user flyway.password=sample-password # SQLファイルのパス指定 flyway.locations=s3:sample_bucket/path/to/sampledb/schema
以上のように設定することで、「sample_bucket」バケット上の「/path/to/sampledb/schema」に存在するSQLファイルを、マイグレーション用ファイルとして使用してくれます。
また、例えば「テーブルのスキーマ用のSQLファイルはGithubで管理してローカルPCに落とし、レコード情報だけはS3に持っておきたい」等の場合は、以下のようにカンマ区切りで複数指定することもできます。
# DB指定 flyway.url=jdbc:mysql://localhost:3306/sampledb flyway.user=sample-user flyway.password=sample-password # SQLファイルのパス指定 flyway.locations=filesystem:path/to/sampledb/schema,s3:sample_bucket/path/to/sampledb/schema
S3上のファイルをマイグレーションファイルとして使用する際の注意点
S3上のファイルを直接マイグレーションファイルとして指定するのは非常に便利に使えますが、いくつか注意点があります。
- AWSアカウントの認証が必須になる
- マイグレーションのたびにS3のファイルを見に行くため、S3上に存在するファイル数が多くなったり、ファイル容量が大きくなるほど時間がかかるようになる
- FlywayのCommunity版だと、S3上のファイルは100ファイルまでしかマイグレーションできない
上記の点が許容できない開発の場合は、例えば自分でS3からファイルをローカルPCにダウンロードした上で、ローカルファイルのみを指定してマイグレーションするなどの方法もあるので、そういった方法で回避するのもいいかもしれません。
最後に
DBが大きくなるのに比例して、DBマイグレーションの悩みは大きくなっていくと思います。
今回の方法で、そういった悩みが解決したら幸いです。