ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CodeBuild로 ECR 갱신하기
    인프라/aws 2024. 3. 18. 13:38

     

    프로젝트를 진행하면서 게시글 서비스를 github action과 docker hub를 사용해서 ci/cd를 구축해서 사용하고 있었습니다.

    이번에 유저 서비스를 새로 만들면서 인프라 툴을 여러 곳에 분산해서 사용하는 것보다 한 곳으로 모으는 것에 이점이 있을 것 같아서 

    이미지 관리와 CI/CD 방법을 변경하면서 작성하는 글입니다.

     

    여러 차례 막히는 구간이 생겨서 하루 종일 고생하다가 정리해두는 것이 좋을 것 같아 오랜만에 글로 남깁니다.

     

    [관련 포스팅]

    1. Elastic Container Registry (ECR) 로 도커 이미지 관리하기

    2. CodeBuild로 ECR 갱신하기

    3. CodeDeploy로 EC2에 배포하기

    4. CodePipeline으로 CI/CD 구축하기

     


     

    글은 크게 5가지 항목으로 진행됩니다.

     

    1. 내가 이해한 CodeBuild

    2. Build project 생성하기

    3. Code Build에서 ECR 접근 권한 부여 

    4. 소스코드에 buildspec.yml 추가

    5. 정상 작동 확인하기

     

     

     

     

     

    도커 레포지토리를 갱신하기 위한 툴로써 Code Build를 사용하고 있습니다. 업데이트를 해줄 도커 레포지토리를 미리 준비해야합니다.

    저는 "1. Elastic Container Registry (ECR) 로 도커 이미지 관리하기 " 글에서 ECR을 사용해서 레포지토리를 생성해두었습니다.

     

     

    1.  내가 이해한 CodeBuild

    Code Build는 사용자가 지정한 특정 시점에 buildspec.yml에 선언해둔 동작을 실행시켜주는 서비스입니다.

    주로 빌드에 관련된 동작을 실행시키는 것에 목적을 두고 있습니다. 보통 Code pipeline의 한 stage로 사용이 됩니다.

    소스 코드에 buildspec.yml 을 작성하거나 웹에디터에서 buildspec.yml을 작성해주어야합니다.

     

     

    2. Build project 생성하기

    2-1. 소스 코드 연결

    github의 소스 코드 업데이트에 반응하여 Code Build를 작동시킬 계획이기 때문에, Source에는 github을 설정해주었습니다.

     

     

    2-2. 권한 설정

    다른 서비스들과 마찬가지로 Code Build도 적절한 권한이 필요합니다. New service role을 설정해주면 필요한 권한을 자동으로 생성해줍니다. 그리고 도커 이미지를 생성하기 위해서는 optional에서 Privileged를 체크해주어야합니다.

     

     

    2-3. 환경변수 설정 (optional)

    이후에 사용할 스크립트에서 사용될 환경변수들도 이 곳에서 등록해줍니다.

    환경변수는 본인이 사용할 스크립트에 따라서 설정해주면 됩니다.

     

    2-4. 빌드 스크립트 작성

    그리고 어떤 방식으로 Build를 수행할지 스크립트를 작성해주어야합니다. 웹에서 에디터로 작성하거나 코드에 buildspec.yml을 추가해주어야합니다. 우선 웹 에디터에서 작성해서 잘 실행되는지를 검증하겠습니다.

    version: 0.2
    phases:
      pre_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
      build:
        commands:
          - docker build -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
      post_build:
        commands:
          - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

     

    여기까지 하면 우선 Project는 생성이 완료되지만 build는 실패하는 상태가 됩니다.

    아직 Code Deploy가 ECR에 접근할 수 있는 권한이 추가로 필요한 생태입니다.

     

     

    3. Code Build에서 ECR 접근 권한 부여

    우선 IAM 서비스를 찾아가서 role 혹은 권한 탭에 들어갑니다.

    위의 2-2에서 New service role에서 사용한 이름을 IAM의 role에서 찾을 수 있습니다.

     

    해당 롤에 AmazonEC@ContainerRegistryFullAccess 권한을 추가해줍니다.

     

     

    4. 소스코드에 buildspec.yml 추가

    지금까지는 웹 에디터에 buildspec의 내용을 작성해둔 상태로 진행하며 동작을 확인하였습니다. buildspec이 aws console에 등록되어있으면 해당 계정에 빌드 내용이 종속되기 때문에 독립성을 위해서 소스코드에 yml 파일로 포함시키도록하겠습니다.

     

    루트 경로에 buildspec.yml을 작성해줍니다.

    version: 0.2
    phases:
      pre_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
      build:
        commands:
          - docker build -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
      post_build:
        commands:
          - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

     

     

    그리고 프로젝트 수정 페이지에서 Buildspec 항목을 'Use a buildspec file' 사용으로 변경합니다.

     

     

     

    5. 정상 동작 확인하기

    위에서 생성한 빌드 프로젝트를 선택 후 Start Build를 진행하면 아래와 같이 성공한 화면을 볼 수 있습니다.

    이후에는 직접 트리거 하는 것이 아닌 Code pipeline 서비스에 연결해서 자동으로 실행되도록 사용할 예정입니다.

     

     

     

     

    감사합니다.

     

     

Designed by Tistory.