CodeBuild+CodeDeploy+CodePipeline에서 EC2에 자동 배포해 보았습니다.

시도한 내용 개요




  • github 리포지토리가 업데이트되면 파이프 라인 소스가 실행됨
  • 배포할 소스: vue-chat
  • Source 아티팩트는 S3의 "codepipeline-ap-northeast-1-…"바게트vue-chat/SourceArti로 출력

  • vue-chat/SourceArti로 출력된 소스를 CodeBuild가 빌드
  • 동일한 바게트 vue-chat/BuildArtif에 미리 빌드된 소스 출력

  • vue-chat/BuildArtif의 미리 빌드 된 소스를 CodeDeploy가 수신 EC2에 배치
  • 배포 된 소스의 appspec.yml 내용이 실행되어 배포 완료

  • CodeBuild



    AWS Management Console에서 CodeBuild를 선택하여 빌드 프로젝트 생성

    github의 vue-chat 리포지토리를 빌드하는 설정
    Buildspec Buildspec은 "빌드 명령 삽입"을 선택하고 다음 명령을 작성합니다. 버전: 0.2 phases: install: runtime-versions: nodejs: 10 pre_build: commands: - npm update -g npm - npm install build: commands: - npm run build artifacts: files: - '**/*' phases 빌드 프로세스를 설명하는 선언 install 빌드 환경 선언 pre_build node.js를 CodeBuild 빌드 환경에 설치 build npm 빌드 실행 artifacts 빌드된 소스를 출력하는 선언 files 출력하는 소스 CodeBuild 및 아티팩트 설정은 관리 콘솔에서도 가능합니다. "Semanstic Versioning 활성화"를 체크하면 위의 Buildspec 내용이 우선합니다.

    IAM 역할(CodeBuild)



    CodeBuild의 서비스 역할에 AmazonS3OutpostsReadOnlyAccess를 추가하여
    미리 빌드된 소스를 S3에 업로드할 수 있도록 허용


    서비스 역할은 CodeBuild-빌드 프로젝트-환경에 설명되어 있습니다.


    로그(CodeBuild)



    CodeBuild의 빌드 실행 로그는 S3에 출력하도록 했다


    CodeBuild에서 빌드 실행하면 S3에는 압축된 로그 파일이 출력된다


    배포할 EC2 만들기



    AmazonLinux2에서 EC2 인스턴스 생성


    IAM 롤(EC2)



    CodeBuild가 S3에 출력한 빌드된 소스를 EC2에 배치하기 위해 AmazonS3ReadOnlyAccess를 설정


    CodeDeploy Agent 설치



    CodeDeploy에서 EC2로 배포할 수 있도록 EC2에 에이전트 라이브러리 설치
    아래 명령은 EC2 배포를 위한 CodeDeploy 배포에서 인용되었습니다.
    # ec2-userで実行
    $ sudo yum update
    $ sudo yum install ruby
    $ sudo yum install aws-cli
    $ cd /home/ec2-user
    $ aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1
    $ chmod +x ./install
    $ sudo ./install auto
    $ sudo service codedeploy-agent status
    

    애플리케이션 시작에 필요한 라이브러리 설치



    이번에는 Vue.js 프로젝트를 시작하기 때문에 vue-cli를 EC2에 설치
    $ npm install -g @vue/cli
    

    CodeDeploy



    배포 프로젝트 만들기


    IAM 역할(CodeDeploy)



    CodeDeploy의 서비스 역할은
    CodeBuild에서 출력한 미리 빌드된 소스를 받기 위해 "AmazonS3ReadOnlyAccess"와
    EC2에 소스를 배치하기 위해 "AmazonEC2FullAccess"설정
    (AmazonEC2RoleforAWSCodeDeploy라면 PermissionError가 되어 버렸다)



    github 프로젝트에 배포 설정



    CodeDeploy에서 배포하기 위해 프로젝트에 배포 프로세스를 설명하는 파일 만들기


    appspec.yml



    배포할 프로젝트의 루트 디렉터리에 appspec.yml 만들기

    appspec.yml
    
    version: 0.0
    os: linux
    files:
      - source: /
        destination: /var/www/html
    hooks:
      ApplicationStart:
        - location: /scripts/codedeploy_start.sh
          timeout: 180
    
  • files.destination
  • S3 소스를 배치 할 위치

  • ApplicationStart.location
  • 응용 프로그램 배포 후 처리를 설명하는 sh 파일 지정


  • 응용 프로그램 시작 sh 파일



    appspec.yml에 지정된 "codedeploy_start.sh"만들기
    npm 명령으로 Vue.js 응용 프로그램을 실행하기 만하면됩니다.

    codedeploy_start.sh
    #!/bin/bash
    
    npm run serve
    

    CodePipeline



    위에서 작성 및 설정한 내용으로 파이프라인을 작성


    파이프라인 실행



    이제 저장소로 변경 사항을 푸시하는 것만으로 배포 할 수 있습니까?

    그러나 현실은



    CodeDeploy가 실패했습니다. . .


    오류를 보면 npm run serve 때 package.json을 찾을 수 없었습니다.


    appspec.yml에서 codedeploy_start.sh를 실행할 때 현재 디렉토리는 /이므로
    codedeploy_start.sh에서 cd 配置したソースのディレクトリ를 작성해야합니다.

    배치한 소스의 디렉토리에는 파이프라인 실행마다 흔들리는 랜덤인 ID가 포함되어 있으므로 어떻게 기술하면 되는지 조사중
    (배치 디렉토리 예: /opt/codedeploy-agent/deployment-root/3ee0a546-27db-4534-a055-098b9173f625/d-4ARZ3L0Q6/deployment-archive/vue-chat )

    좋은 웹페이지 즐겨찾기