Laravel + Nuxt + Fargate에 CodePipeline으로 지속적인 배포

전제



Laradock + Nuxt(SSR 모드)를 AWS Fargate에서 실행

여기에서 Fargate로 시작할 수있는 것

하고 싶은 일



github 소스 코드가 master 브랜치로 푸시 될 때 CodeBuild로 Docker 이미지를 빌드합니다.
Fargate에 배포 자동화
가능하면 테스트도 실시

참고



Laravel 애플리케이션을 로컬 또는 AWS에서 Docker로 이동

Laravel 애플리케이션을 CodePipeline/CodeBuild로 ECS에 자동 배포

Laravel의 세션 관리에 Redis를 지정하고 AWS의 ElastiCache 사용

절차


  • buildspec.yml 추가
  • github 저장소 만들기
  • AmazonAurora를 빌드하고 테이블 생성까지 수행 할 수 있도록합니다.
  • CodePipeline 만들기
  • CodePipeline으로 배포 할 수 있는지 확인합니다.

    buildspec.yml 추가



    소스 코드 프로젝트의 디렉토리 바로 아래에
    build시의 실행 내용을 기재한다
    touch buildspec.yml
    

    buildspec.yml


    version: 0.2
    
    phases:
      pre_build:
        commands:
          - echo Logging in to Amazon ECR...
          - aws --version
          ## awsにログインする
          - $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
          ## s3からenvファイルを取得する
          - aws s3 cp s3://${BUCKET_NAME}/staging/env .env
          - echo ls -l -a 
          ## nginxとphp-fpmコンテナイメージのECRリポジトリURIを生成する
          - REPOSITORY_URI_PHP_FPM=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME_PHP_FPM}
          - REPOSITORY_URI_NGINX=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME_NGINX}
          ## ここは何をしてる?
          - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
          - IMAGE_TAG=${COMMIT_HASH:=latest}
      build:
        commands:
          - echo Build started on `date`
          - echo Building the Docker image...
          - docker build -t ${REPOSITORY_URI_PHP_FPM}:latest -f docker/php-fpm/Dockerfile .
          - docker build -t ${REPOSITORY_URI_NGINX}:latest -f docker/nginx/Dockerfile .
          - docker tag ${REPOSITORY_URI_PHP_FPM}:latest ${REPOSITORY_URI_PHP_FPM}:$IMAGE_TAG
          - docker tag ${REPOSITORY_URI_NGINX}:latest ${REPOSITORY_URI_NGINX}:$IMAGE_TAG
      post_build:
        commands:
          - echo Build completed on `date`
          - echo Pushing the Docker images...
          - docker push ${REPOSITORY_URI_PHP_FPM}:latest
          - docker push ${REPOSITORY_URI_PHP_FPM}:$IMAGE_TAG
          - docker push ${REPOSITORY_URI_NGINX}:latest
          - docker push ${REPOSITORY_URI_NGINX}:$IMAGE_TAG
          - echo Writing image definitions file...
          ## コンテナ定義の更新するためのファイルを作成する
          - IMAGE_DIFINITION_PHP_FPM="{\"name\":\"${PHP_FPM_CONTAINER_NAME}\",\"imageUri\":\"${REPOSITORY_URI_PHP_FPM}:${IMAGE_TAG}\"}"
          - IMAGE_DIFINITION_NGINX="{\"name\":\"${NGINX_CONTAINER_NAME}\",\"imageUri\":\"${REPOSITORY_URI_NGINX}:${IMAGE_TAG}\"}"
          - echo "[${IMAGE_DIFINITION_PHP_FPM},${IMAGE_DIFINITION_NGINX}]" > imagedefinitions.json
    artifacts:
        files: imagedefinitions.json
    

    컨테이너 시작시 php artisan migrate를 실행하도록 설정



    마이그레이션을 위해 명령을 시작할 때 실행하는 명령 추가

    /docker/php-fpm/startup.sh
    #!/bin/bash
    
    + # migrate lunch
    + php artisan cache:clear
    + php artisan migrate
    
    # php-fpm sever lunch
    php-fpm
    

    github 리포지토리 만들기



    push 대상 github 리포지토리를 만들고 로컬 프로젝트로 이동
    소스 코드 push
    cd ./{プロジェクト名}/
    echo "# guild-app" >> README.md
    git init
    git add .
    git commit -m "first commit"
    git remote add origin https://github.com/hajime1103/guild-app.git
    git push -u origin master
    

    AmazonAurora를 구축하고 테이블을 만들 때까지 가능


  • DB 배포를위한 프라이빗 서브넷 만들기
  • 개인용 라우팅 테이블 만들기
  • RDS 서비스에서 서브넷 그룹 만들기
  • RDS 서비스에서 매개 변수 그룹 만들기
  • AuroraDB 만들기
  • laravel의 database.php를 변경합니다

  • DB 배포용 프라이빗 서브넷 만들기





    프라이빗 서브넷용 라우팅 테이블 만들기






    RDS에서 서브넷 그룹 만들기








    RDS에서 Aurora 매개 변수 그룹 만들기



    파라미터 그룹과 DB 클러스터 파라미터 그룹 모두 생성





    AuroraDB 만들기










    ※보안 그룹을 새롭게 작성하는 경우는, 허가하는 인바운드 설정을 Fargate로부터에서도 액세스 할 수 있도록 해 둔다













    laravel의 database.php 변경



    Aurora는 기본적으로 읽기 및 쓰기 전용을 생성하기 때문에
    엔드포인트를 전환해야 함

    참고 사이트
    Laravel의 DB 마스터 / 슬레이브로 마스터로 SELECT하거나 슬레이브로 트랜잭션

    /config/database.php
    - 'host' => env('DB_HOST', '127.0.0.1'),
    - 'port' => env('DB_PORT', '3306'),
    + 'read' => [
    +     'host' => env('DB_SLAVE_HOST', '127.0.0.1'),
    +     'port' => env('DB_SLAVE_PORT', '3306'),
    + ],
    + 'write' => [
    +     'host' => env('DB_MASTER_HOST', '127.0.0.1'),
    +     'port' => env('DB_MASTER_PORT', '3306'),
    + ],
    

    프로덕션/스테이징 환경용 env 파일을 함께 수정하여 S3 버킷에 업로드
    DB_CONNECTION=mysql
    DB_MASTER_HOST={書き込み専用エンドポイント}
    DB_MASTER_PORT={ポート番号}
    DB_SLAVE_HOST={読み込み専用エンドポイント}
    DB_SLAVE_PORT={ポート番号}
    DB_DATABASE=XXXX
    DB_USERNAME=XXXX
    DB_PASSWORD=XXXX
    

    CodePipeline 만들기



    CodePipeline 새로 만들기


    리포지토리는 github를 선택합니다.


    AWS CodeBuild를 생성하고 새 프로젝트 생성






    환경 변수 정의


    환경 변수 이름
    개요


    AWS_ACCOUNT_ID
    ECR의 저장소 ID

    BUCKET_NAME
    .env 파일이 있는 S3 버킷

    IMAGE_NAME_PHP_FPM
    php-fpm 컨테이너 ECR의 리포지토리 이름

    IMAGE_NAME_NGINX
    nginx 컨테이너 ECR의 리포지토리 이름

    PHP_FPM_CONTAINER_NAME
    ECS 작업의 php-fpm 컨테이너 이름

    NGINX_CONTAINER_NAME
    ECS 태스크의 nginx 컨테이너 이름




    배포 대상인 AmazonECS를 선택합니다.



    배포 설정



    빌드 실행



    빌드를 실행하면 다음 오류가 발생합니다.
    An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::636990608596:assumed-role/codebuild-GuildApp-CodeBuild-service-role/AWSCodeBuild-c714c40b-8e5e-466d-9d97-fda2158797d4 is not authorized to perform: ecr:GetAuthorizationToken on resource: *
     [Container] 2019/03/26 16:04:29 Command did not exit successfully $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION}) exit status 255
    [Container] 2019/03/26 16:04:29 Phase complete: PRE_BUILD Success: false
    [Container] 2019/03/26 16:04:29 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION}). Reason: exit status 255
    

    롤이 부족한 것 같아

    【비망록】CodeBuild에서 aws ecr get-login 명령 실행시에 에러가 발생한다

    .env 파일을 S3에서 가져오고 ECR에 액세스하기 위해
    아래 롤을 부착했습니다.
    AmazonEC2ContainerRegistryPowerUser
    AmazonS3ReadOnlyAccess

    CodePipeline에서 배포할 수 있는지 확인




    좋은 웹페이지 즐겨찾기