본문 바로가기
개발/AWS

AWS CodePipeLine ECS 배포 구성

by 궁즉변 변즉통 통즉구 2022. 8. 26.
반응형

AWS  Code PipeLine을 사용하여 ECS에 배포하는 구성을 정리해본다. 어플리케이션은 nginx 이미지를 사용한다.

 

1. 소스 준비(CodeCommit)

배포 테스트를 위해 nginx용 테스트 컨테이너 소스를 작성한다.

index.html 파일은 기본 index.hml 파일을 대체하기 위한 테스트용도이다.

<html>
  <head>
    <title>Docker Container Nginx</title>
  </head>
  <body>
    <div>
      <h1>Docker Container Nginx</h1>
    </div>
  </body>
</html>

Dockerfile은 다음과 같이 작성한다.

FROM nginx:1.21.1
COPY ./index.html /usr/share/nginx/html/index.html
EXPOSE 80

CodeBuild 사용을 위해 buildspec.yml 파일을 작성한다. env 항목의 AWS_ACCOUNT_ID는 각자의 ID로 등록한다.

version: 0.2

env:
  variables:
    IMAGE_REPO_NAME: nginx-simple # ECR Repository명
    AWS_ACCOUNT_ID: xxxxxxxxx # AWS AccountID
    CONTAINER_NAME: nginx-simple-container # ECS에서 사용할 컨테이너명
phases:
  pre_build:
    commands:
      # ECR 로그인
      - 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:
      - echo Build started on `date`
      # Image 빌드
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=$CODEBUILD_BUILD_NUMBER.${COMMIT_HASH:=latest}
      - 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:
      - echo Build completed on `date`
      # Push Image
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      # ECS 배포용 imagedefinitions.json Write
      - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json
artifacts:
  files: imagedefinitions.json

작성한 파일을 CodeCommit에 push 한다

 

2. CodeBuild 구성

다음으로 CodeBuild를 구성해본다. 먼저 이미지가 Push 될 ECR을 생성한다. 이름은 위의 buildspec.yml에서 선언한 'nginx-simple'로 생성한다.

CodeBuild는 다음과 같이 작성한다. 

소스는 CodeCommit을 선택하고 나머지 브랜치 등의 정보를 선택한다.

환경은 기본 관리형 이미지에 최신버전을 선택한다. 거의 하단에 권한이 있음 부분은 반드시 체크하여 활성화 시킨다.

buildspec은 소스의 buildspec 파일을 사용한다.

나머지는 디폴트로 두고 생성한다.

다음으로 IAM으로 가서 CodeBuild 역할(Role) 'codebuild-build-nginx-simple-service-role'에 AmazonEC2ContainerRegistryPowerUser 권한을 추가한다.

이제 '빌드시작'으로 빌드해서 ECR에 이미지가 push되는지 확인한다.

CodeBuild 관련 좀더 자세한 내용은 다음을 참조한다.

https://happy-jjang-a.tistory.com/92

 

3. ECS Cluster 생성

3-1. ECS Cluster

배포 할 ECS Cluster를 생성한다. 템플릿은 fargate를 사용할 예정이라 '네트워킹 전용'을 선택한다.

3-2. Task Definition(작업 정의) 생성

시작유형은 Fargate를 선택한다.

작업 및 컨테이너 구성은 아래와 같이 작성 및 선택한다.

다음으로 컨테이너 정보를 ECR에 Push된 이미지 URL로 설정하고, Port는 80으로 작성한다.

 

3-3. 서비스 구성

서비스도 Fargate를 선택하고, 아래와 같이 작업정의 및 클러스터 등을 선택한다.

네트워크 구성은 기존에 테스트로 생성해둔 VPC 및 public 서브넷을 선택했다. 테스트 환경 구성은 다음을 참조한다.
https://happy-jjang-a.tistory.com/69 

로드밸런싱 설정은 ALB를 선택하고 기존 LB를 선택했다. 

컨테이너 포트 80을 설정하고 경로패턴, 상태확인경로는 '/'로 변경 후 서비스를 생성한다. 

서비스 생성 후 조금 기다리면 아래와 같이 서비스가 실행된다

그리고 ALB로 접속을 해보면 서비스가 뜬다

ECS 구성 관련 좀 더 자세한 내용은 다음을 참조한다.

https://happy-jjang-a.tistory.com/158

 

4. CodePipeLine 구성

CodePipeline 생성을 아래와 같이 시작한다.

소스 스테이지는 위에서 설정한 CodeCommit 정보를 선택하고 나머지는 권장, 기본값으로 둔다.

빌드 스테이지도 동일한게 위에서 설정한 CodeBuild 정보를 선택한다.

배포 스테이지에서는 배포 공급자를 'Amazon ECS'를 선택하고, ECS Cluster와 서비스를 선택한다.

마지막으로 PipeLine 생성을 하면 PipeLine이 실행되면서 각 스테이지가 동작한다. 

 

각 스페이지 별 Noti를 받을 수도 있고, Approval 스페이지도 PipeLine에 추가가 가능한데 다음에 테스트하면서 정리할 예정이다.

 

 

반응형

댓글