- はじめに
- 全体像
- 各ステップで何をしているかの解説
- github actions
- AWS CodePipeline
- 1. CodeBuild によるコンテナのビルド
- 2. CodeDeploy による Migration 用 server の更新
- 3. マニュアル承認
- 4. 本番サーバーへの Deploy
- さいごに
はじめに
DROBE では Laravel の実行環境に AWS ECS を利用しています
この記事では、ECS への Laravel の Deploy をどうやって行なっているかについて解説します
全体像
全体像としては以下の図のような形です
Deploy までにマニュアルで行う必要があるのは主に 2 つです
- 特定のブランチにコードを push する
- Deploy を承認する
1 は git の操作もしくは github での操作になりますが、2 は AWS のコンソールから行う運用です
各ステップで何をしているかの解説
ここから、各ステップで何をしているかを解説していきます
github actions
DROBE では CI/CD に github actions を利用しています (一部セキュリティ的な理由から自前のタスクランナーを建てて gitlab CI を使っています)
Deploy プロセスにおける一番最初の Step は特定の Branch への Push です
Github actions は master branch への push があると起動するように設定してあり、そこでは source code を zip に固めて S3 にアップロードしています
workflow の yaml は非常にシンプルです
name: Build prod
on:
push:
branches:
- master
jobs:
build-prod:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: true
token: ${{ secrets.TOKEN }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_DEFAULT_REGION }}
- name: Upload to s3
run : |
sh script/build/upload_to_s3.sh -p // 独自に書いたスクリプト。中身は zip にして s3 に upload するという処理が書いてある
AWS CodePipeline
CodePipeline は S3 を監視して、特定の object に更新があればそれをデータソースとして起動するように設定しています
監視対象はもちろん github action が upload する zip です
github actions が zip を更新すると CodePipeline が起動して Build と Deploy のプロセスが開始されます
1. CodeBuild によるコンテナのビルド
まず一番はじめに Codebuild を使って container の build を行います
zip を回答して、内部にある Dockerfile を使いコンテナを作り、さらにソースコードをコンテナに copy して composer install を行います
そうして出来たコンテナを ECR に push する所までをこのステップで行います
2. CodeDeploy による Migration 用 server の更新
ここは少し特殊な所かもしれませんが、laravel を運用していると本番サーバーの更新前に手動でコマンドを打つといった事をしたくなる事が往往にしてあります
代表的なものは php artisan migrate
コマンドだと思いますが、それ以外にもリリース前に自作のコマンドを打ちたいといった場合が少なからずあったりします
DROBE ではそういったニーズを満たすために、本番サーバーの更新を行う前に ssh 可能な migration サーバーのコンテナを更新して、そこで必要なコマンドなどを打つようにしています
このステップでは CodeDeploy を使って EC2 の上で実行されている ECS を更新します
3. マニュアル承認
migration サーバーでの作業が終わったら CodePipeline 上でマニュアル承認を行います
特に作業などが必要無い場合には、2 の migration サーバーの更新が終わったらそのままマニュアル承認をする事もあります
4. 本番サーバーへの Deploy
再度 CodeDeploy を使って本番サーバーへの Deploy を行います
さいごに
DROBE における ECS への Deploy を解説しました
Migration サーバーの部分はもっと他に良い方法が無いものかと頭を悩ませていますが、それ以外の部分に関しては今の所特に大きな問題も発生せずに安定して運用できています