Laravel の ECS への Deploy
Laravel の ECS への Deploy

Laravel の ECS への Deploy

はじめに

DROBE では Laravel の実行環境に AWS ECS を利用しています

この記事では、ECS への Laravel の Deploy をどうやって行なっているかについて解説します

全体像

全体像としては以下の図のような形です

image

Deploy までにマニュアルで行う必要があるのは主に 2 つです

  1. 特定のブランチにコードを push する
  2. 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 サーバーの部分はもっと他に良い方法が無いものかと頭を悩ませていますが、それ以外の部分に関しては今の所特に大きな問題も発生せずに安定して運用できています