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

소개


github 에 소스를 푸시하기만 하면 응용 프로그램이 자동으로 ECS 환경에 배포되도록 CodePipeline 를 만듭니다.
또한 ECS 환경의 구축에 대해서는 아래 기사를 참조하십시오.
  • Laravel 애플리케이션을 로컬 또는 AWS에서 Docker로 이동

  • 파이프라인 만들기


    CodePipelineパイプラインの作成 버튼에서 마법사에 따라 파이프라인을 만듭니다.

    이름




    품목



    파이프라인 이름
    (선택 사항)


    출처




    품목



    소스 공급자
    github

    리포지토리
    imunew/laravel-ecs-demo

    브랜치
    마스터

    빌드 제공자
    AWS CodeBuild


    빌드




    품목



    프로젝트 이름
    (선택 사항)

    환경 이미지
    AWS CodeBuild 관리형 이미지 사용

    OS
    우분투

    런타임
    도커

    버전
    aws/codebuild/docker:17.09.0

    빌드 사양
    소스 코드의 루트 디렉토리 buildspec.yml 사용

    VPC ID
    비 VPC

    환경 변수
    AWS_ACCOUNT_ID PROJECT_NAMESPACE


    buildspec.yml



    아래 문서를 참고로 buildspec.yml 를 작성했습니다.
  • CodePipeline을 사용하여 ECS에 배포할 수 있어 Docker 환경의 지속적인 배포도 쉬워졌습니다 | Developers.IO
  • version: 0.2
    
    phases:
      pre_build:
        commands:
          - echo Logging in to Amazon ECR...
          - pip install awscli --upgrade
          - aws --version
          - $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
          - IMAGE_NAME_PHP_FPM=php-fpm
          - IMAGE_NAME_NGINX=nginx
          - REPOSITORY_URI_PHP_FPM=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${PROJECT_NAMESPACE}/${IMAGE_NAME_PHP_FPM}
          - REPOSITORY_URI_NGINX=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${PROJECT_NAMESPACE}/${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 docker/nginx
          - 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\":\"${IMAGE_NAME_PHP_FPM}\",\"imageUri\":\"${REPOSITORY_URI_PHP_FPM}:${IMAGE_TAG}\"}"
          - IMAGE_DIFINITION_NGINX="{\"name\":\"${IMAGE_NAME_NGINX}\",\"imageUri\":\"${REPOSITORY_URI_NGINX}:${IMAGE_TAG}\"}"
          - echo "[${IMAGE_DIFINITION_PHP_FPM},${IMAGE_DIFINITION_NGINX}]" > imagedefinitions.json
    artifacts:
        files: imagedefinitions.json
    

    배포




    품목



    배포 공급자
    Amazon ECS

    클러스터 이름
    laravel-ecs-demo-cluster 1

    서비스 이름
    laravel-ecs-demo 1

    이미지의 파일 이름
    (공란)


    서비스 역할


    CodePipeline 를 실행하는 데 필요한 서비스 역할을 지정합니다.

    주의) ECR(EC2 Container Registory)에 대한 액세스 권한



    ECR에 로그인, 푸시 등이 필요하므로 아래의 액션을 허용합니다.


    품목



    서비스
    EC2 Container Registory

    액션(로드)
    GetAuthorizationToken BatchCheckLayerAvailability

    액션(쓰기)
    CompleteLayerUpload UploadLayerPart InitiateLayerUpload PutImag


    파이프라인 이미지



    결국 master 브랜치에 푸시하면 자동으로 배포됩니다.



    결론


    docker 에서 프로덕션 환경을 만드는 것은 어려운 인상을 가졌지만 AWS의 서비스가 점점 충실해지고 있기 때문인지 비교적 간단하게 할 수 있었습니다.
    비용적으로는, ALB(Application Load Balancer)가, 가장 컸습니다만, 기동 확실히 하지 않으면 보다 싸게 할 수 있습니다.
    참고까지 품목의 일부를 노출해 둡니다.



    그럼.



    Laravel 애플리케이션을 로컬 또는 AWS에서 Docker로 이동에서 만든 클러스터 및 서비스를 지정합니다.

    좋은 웹페이지 즐겨찾기