📘
ECS(Fargate)で Laravel のリリース時のDBマイグレーションってどうすんの?
この記事では、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"]
コンテナの実行時にデフォルトで実行するコマンドと引数(ENTRYPOINT と CMD)を利用してマイグレーションを実行しています。
あとはこれを GitHub Actions の docker/build-push-action でイメージをビルドして ECR にプッシュします。
同じく GitHub Actions のワークフロー内で aws ecs run-task コマンドを利用してタスクを実行します。
今回は紹介していませんがこれらの処理と並行してアプリ側もサービスのアップデートをしています。
参考
私たち BABY JOB は、子育てを取り巻く社会のあり方を変え、「すべての人が子育てを楽しいと思える社会」の実現を目指すスタートアップ企業です。圧倒的なぬくもりと当事者意識をもって、子どもと向き合う時間、そして心のゆとりが生まれるサービスを創出します。baby-job.co.jp/
Discussion