AWS CodePipeline에서 go 앱의 Docker 이미지를 ECR에 저장

실현하고 싶은 것


  • CodeCommit 리포지토리 (hoge-repo) master 브랜치 업데이트 트리거
    마스터 분기 리소스에서 Docker 이미지를 만들고 ECR 대상 리포지토리에 저장하고 싶습니다
  • hoge-repo는 golang의 앱을 가지고 있으므로 이미지를 만들 때 앱을 빌드합니다

  • 환경


  • Golang 1.13.5
  • Docker 18
  • AWS 도쿄 리전

  • 했던 일



    CodeBuild 구축


  • 프로젝트 이름은 임의의 이름
  • 소스
    소스는 CodeCommit 대상 리포지토리 선택



  • 이번에는 master 병합을 트리거하기 때문에 참조 유형은 분기
    대상 브랜치는 master를 지정
  • 환경
    Build 환경은 특별히 제한이 없었기 때문에 aws/codebuild/amazonlinux2-x86_64-standard:2.0
    를 선택
    나머지 환경 설정은 기본값
  • Buildspec
    Buildspec 파일 사용을 선택
    buildspec.yaml은 나중에
  • 아티팩트
    이번에는 Docker 이미지의 push까지, 실제로 EKS로 컨테이너의 시작까지 실시하지 않기 때문에
    아티팩트 없음 선택
  • 로그
    로그 모니터링도 이번에는 수행하지 않음

  • CodeBuild 권한 추가



    이번에는 CodeCommit에서 소스를 다운로드하고 ECR로 이미지 푸시하기 위해
    CodeBuild 서비스 역할에 다음 정책 부여AWSCodeCommitReadOnlyAccess
    AmazonEC2ContainerRegistryFullAccess

    buildspec.yml 작성



    codebuild에서 기본 설정으로 했으므로 hoge-repo의 루트 디렉토리에 buildspec.yml을 넣습니다.
    hoge-repo
    |
    |-- buildspec.yml
    |-- Makefile
    |-- Dockerfile
    |-- main.go
    ...
    

    buildspec.yaml
    
    version: 0.2
    
    phases:
      install:
        runtime-versions:
          docker: 18
        commands:
        # ECRにイメージプッシュするためにログインする
        - $(aws ecr get-login --no-include-email --region ap-northeast-1)
    
      pre_build:
        commands:
        # go test -v -cover ./...
        - make test
    
      build:
        commands:
        # go build -v .
        - make build
    
      post_build:
        commands:
        # docker tag \code-commit-repo-name\:latest \erc-repo-name\:latest
        # docker push \erc-repo-name\:latest
        - make push-image
    

    CodePipeline 구축



    CodePipeline 새로 만들기
  • 파이프 라인 설정
    파이프라인 이름은 임의의 값을 입력하고 나머지는 기본값
  • 소스 스테이지
    소스 공급자에게 AWS CodeCommit의 hoge-repo master 브랜치 선택
    검색은 Amazon CloudWatch Events 선택
  • 빌드 스테이지
    AWS CodeBuild에서 방금 만든 프로젝트 선택
    이번 환경 변수는 사용하지 않으므로 나머지는 그대로
  • 배포 단계
    실제로 컨테이너를 시작하지 않기 때문에 배포 단계는 건너 뜁니다

  • 완성



    지금까지의 설정으로 CodeCommit의 master 브랜치 업데이트를 트리거로
    Go 앱이 빌드 된 Docker 이미지를 만들고 ECR로 푸시하도록 구성 할 수있었습니다.

    이 후



    Pipeline을 실행할 때마다 go 모듈 (외부 라이브러리)을 다운로드하는 것은 좋지 않습니다 (5 분 정도 걸립니다)
    한번 다운로드 한 모듈은 캐시 해 두고 싶다 (이후 성대하게 빠진다)
    빠진 기사

    좋은 웹페이지 즐겨찾기