Tweet
Logo
    Laravel の ECS への Deploy
    Laravel の ECS への Deploy

    Laravel の ECS への Deploy

    • はじめに
    • 全体像
    • 各ステップで何をしているかの解説
    • github actions
    • AWS CodePipeline
    • 1. CodeBuild によるコンテナのビルド
    • 2. CodeDeploy による Migration 用 server の更新
    • 3. マニュアル承認
    • 4. 本番サーバーへの 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 は非常にシンプルです

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

    © 2025 DROBE All rights reserved.
    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 するという処理が書いてある