AWS CodePipeline을 사용하여 ECR에 Docker 이미지를 배포해 보기

AWS CodePipeline을 사용하여 ECR에 Docker 이미지를 배포해 보는 과정을 정리해 봤습니다.
2022.12.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 AWS CodePipeline을 사용하여 ECR에 Docker 이미지를 배포해 보는 과정을 정리해 봤습니다.

사전 준비

먼저 ECR에 배포할 리포지토리가 생성되어 있어야 합니다.

ECR에 리포지토리를 생성하고, 이미지를 푸쉬하는 방법에 대해서는 아래 블로그를 참고해 주세요.

ECR에 리포지토리를 생성하고, 이미지 배포까지 끝났다면, GitHub에 리포지토리를 생성해서 dockerfile, buildspec.yml을 업로드 할 필요가 있습니다.

version: 0.2

env:
  variables:
    AWS_DEFAULT_REGION: ap-northeast-1
    AWS_ACCOUNT_ID: xxxxxxxxxx
    IMAGE_REPO_NAME: nginx-fargate
    IMAGE_TAG: latest

phases:
  build:
    commands:
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
      - docker build --platform=linux/amd64 -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

buildspec.yml 내용물은 다음과 같습니다.

  • AWS_DEFAULT_REGION : 현재 리전
  • AWS_ACCOUNT_ID: 현재 AWS 계정 아이디(숫자)
  • IMAGE_REPO_NAME: ECR의 리포지토리 명
  • IMAGE_TAG: 이미지 태그 명

buildspec에 대해서는 아래 링크를 참고해 주세요.

MAC M1 환경일 경우, dockerfile을 build 할 때 에러가 발생할 수 있습니다.

그럴 경우 아래 블로그를 참고해 주세요.

이어서 ECR에 이미지를 업로드 해야하기 때문에, CodeBuild에 ECR 권한을 부여합니다.

ECR 권한을 부여하기에 앞서, 정책을 생성합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:CompleteLayerUpload",
                "ecr:GetAuthorizationToken",
                "ecr:InitiateLayerUpload",
                "ecr:PutImage",
                "ecr:UploadLayerPart"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

해당 코드로 정책 생성이 끝났다면 사전 준비는 완료입니다.

전체적으로 정리하면 다음과 같습니다.

  • ECR에 리포지토리를 생성하고, 이미지 푸쉬
  • GitHub에 리포지토리를 생성해서 dockerfile과 buildspec.yml을 푸쉬
  • CodeBuild에 ECR 권한을 부여하기 위해 정책 생성

CodePipeline을 생성

CodePipeline으로 들어와서「파이프라인 생성」을 클릭합니다.

  • 파이프라인 이름을 입력합니다.
  • 기존에 만들어 둔 IAM Role이 있다면「기존 서비스 역할」을 선택하고, 없다면「새 서비스 역할」을 선택합니다.
  • 새로 생성할 IAM Role 이름을 입력합니다.
  • 다음 스텝으로 넘어갑니다.

  • 소스 공급자는 GitHub를 선택합니다.
  • 현재 AWS와 연결되어 있는 GitHub가 없다면「GitHub에 연결」을 클릭해서 연동을 실시합니다.
  • dockerfile이 있는 리포지토리를 선택합니다.
  • 브랜치 이름을 선택합니다.

「변경 감지 옵션」을 체크하면, 코드를 변경하고 GitHub에 Push 작업을 실시하면 자동으로 파이프라인이 시작됩니다.

  • 빌드 공급자는「AWS CodeBuild」를 선택합니다.
  • CodeBuild의 프로젝트를 생성하기 위해「프로젝트 생성」을 클릭합니다.

  • 프로젝트 이름을 입력합니다.
  • Name 태그를 입력합니다.

  • 관리형 이미지를 선택합니다.
  • 운영 체제는 리눅스를 선택합니다.
  • 이미지는 amazonlinux2-x86_64-standard:3.0을 선택합니다.

  • 새 서비스 역할을 선택합니다.
  • 역할 이름을 입력합니다.
  • 마지막으로 Buildspec에는 GitHub에 푸쉬한「buildspec.yml」을 입력하고 프로젝트 생성을 끝마칩니다.

이제 프로젝트 생성이 끝났다면, 생성된 CodeBuild 역할에 사전 준비에서 만들어 둔 정책을 연결합니다.

생성된 CodeBuild 역할에서「정책 연결」을 클릭합니다.

사전에 만들어 둔 정책을 선택하고 정책 연결을 클릭하고, CodeBuild 설정을 끝마칩니다.

이어서 배포 스테이지의 경우「배포 스테이지 건너뛰기」를 클릭합니다.

이번 블로그에서는 배포 작업까지는 진행하지 않기 때문에 건너뛰기를 클릭하고 CodePipeline 생성을 끝마칩니다.

CodePipeline 생성이 끝나면, 소스 스테이지 부터 시작해서, 빌드 스테이지 까지 작업 진행 되는 것을 확인할 수 있습니다.

조금 기다려보면, 빌드 스테이지 까지 성공한 것을 확인할 수 있습니다.

ECR에서 확인해 보면, 정상적으로 이미지가 업로드 된 것을 확인할 수 있습니다.

이제 소스 코드를 변경하고 GitHub에 Push 작업을 시행하면 자동으로 CodePipeline이 실행되어 ECR에 이미지가 업로드 됩니다.

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !