📘

ECS(Fargate)で Laravel のリリース時のDBマイグレーションってどうすんの?

2023/03/02に公開

この記事では、Larevelを AWS ECS で運用しアプリのリリース時にDBマイグレーションをどのように DB に適用するかを紹介します。
自分が現在のチームに参画する以前からできあがっていた仕組みではありますが、あまりおなじことをしている例がない印象だったので本記事を作成する運びとなりました。

コンテナ以前であれば

アプリの動いてるサーバに SSH して migrate コマンドを実行する?のがスタンダード?だったと思います。
現在では多くのWEBアプリケーションで導入されているであろう ECS(Fargate) 環境では サーバにSSHログイン ということがまずできません。

じゃあ ECS(Fargate)ではどうするか

  • ECS Execログインを利用して migrate コマンドを実行する
  • ecspresso をつかう
  • 自前でマイグレーション用のコンテナを用意する
  • (他にもある?)

その中から、弊プロダクトでは マイグレーション用のコンテナを用意する 方法を採用しています。

こんなかんじ

実際の構成はこんなかんじ。

migrate.Dockerfile
FROM php:8.1.7-cli-bullseye

COPY --from=composer:2.2.6 /usr/bin/composer /usr/bin/composer

RUN apt-get update && \
    # NOTE: composer を使うための依存
    apt-get install -y libzip-dev && \
    docker-php-ext-install -j$(nproc) zip && \
    # NOTE: pdo_pgsql を使うための依存
    apt-get install -y libpq-dev && \
    docker-php-ext-install -j$(nproc) pdo_pgsql && \
    # キャッシュ削除
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY composer.lock composer.json ./
RUN composer install --no-dev --no-scripts --no-interaction --no-progress --prefer-dist

COPY . /app

# NOTE: 設定ファイルは環境毎に用意し、デフォルトの .env は使用しない
RUN php -r "! file_exists('.env') || exit(1);"

ENTRYPOINT ["php", "artisan"]
CMD ["migrate", "--force"]

コンテナの実行時にデフォルトで実行するコマンドと引数(ENTRYPOINTCMD)を利用してマイグレーションを実行しています。
あとはこれを GitHub Actions の docker/build-push-action でイメージをビルドして ECR にプッシュします。
同じく GitHub Actions のワークフロー内で aws ecs run-task コマンドを利用してタスクを実行します。
今回は紹介していませんがこれらの処理と並行してアプリ側もサービスのアップデートをしています。

参考

BABYJOB テックブログ

Discussion