Flywayで、S3にあるSQLファイルを使ってマイグレーションする方法

こんにちは。 エキサイト株式会社の三浦です。

JavaのアプリケーションでDBを扱っている場合、DBのマイグレーションのためにFlywayを使っている方も多いのではないでしょうか。

今回は、マイグレーションに使用するSQLファイルについて、ローカルではなくS3上にあるものを使用する方法を紹介します。

Flywayとは

Flywayは、DBのマイグレーションに使用するツールです。

公式には以下のように説明されています。

flywaydb.org

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にクレデンシャル情報を設定してください。

この時、設定したアカウントの profiledefault であればそのままで構いませんが、もしそれ以外であれば、環境変数で以下のように設定します。

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マイグレーションの悩みは大きくなっていくと思います。

今回の方法で、そういった悩みが解決したら幸いです。