본문으로 바로가기
반응형

1. 개요

CI/CD에는 많은 방법들이 존재한다. 깃허브등의 소스코드 레포지터리 master브랜치에 변경이 생기는 순간을 감지하여 자동으로 소스코드를 말아서 S3에 업로드하고, 배포를 트리거하는 등 한번에 모든 배포 과정을 자동화할수도 있고 특정 부분만을 잘라서 자동화시킬 수도 있다. 이는 배포 전략을 짜기 나름인데, 이번 포스팅에서는 ECR로 이미지가 푸시되면 CodePipeline에서 이를 감지하고, ECS에 배포할 수 있도록 자동화하는 방법에 대해 기술한다.

참고로, ECS에 관한 자세한 설명은 다루지 않으므로 ECS Fargate형태로 서비스가 실행중이라는 가정하게 진행한다.


2. Flow

먼저 간단하게 흐름을 살펴보자면 다음과 같다.


ECR푸시 감지 -> 특정 명령어를 통해 빌드 -> ECS에 배포


3. 설정 방법

먼저 AWS에서 CodePipeline 콘솔로 들어간 후 파이프라인 생성 버튼을 누른다.


파이프라인 이름부분에 원하는 이름을 적어주면 아래쪽 역할 이름이 자동으로 생성된다. 고급 설정부분은 위 사진과 동일하게 설정한 이후 다음 버튼을 누른다.


다음으로 소스 스테이지를 추가하는 부분이다. 우리는 ECR의 변경을 감지할것이므로 Amazon ECR을 선택한다. 또한 리포지토리 이름과 원하는 태그를 설정해준다. 가장 최신 이미지를 배포하고싶다면 latest를 적어주면 된다. 


다음으로 빌드 스테이지를 추가해줘야하는데, 공급자에 AWS CodeBuild를 선택해주고 프로젝트 이름쪽에서 프로젝트 생성 버튼을 누른다.


원하는 프로젝트 이름을 적어준다.


운영체제, 런타임, 이미지등을 선택해준다.


역할도 새로 생성해줘야하므로 새 서비스 역할을 선택한다.


여기에서는 buildspec.yml파일을 사용하지 않고 직접 빌드 명령 삽입을 통해 넣어줄것이다. 일단 빌드 명령 삽입으로 선택하고,

post_build:
commands:
- printf '[{"name":"컨테이너이름","imageUri":"%s"}]' [여기에 ECR주소:latest] > imagedefinitions.json

artifacts:
files: imagedefinitions.json

위 내용을 넣어준다. [여기에 ECR주소] 부분을 자신의 ECR주소로 넣어주어야한다. 이렇게 빌드단계에서 artifact를 만들어주지 않으면 추후 배포 과정에서 참고할 artifact 없기 때문에 오류가 발생한다. (imagedefinitions관련 자세한 내용은 https://docs.aws.amazon.com/codepipeline/latest/userguide/ecs-cd-pipeline.html 를 참고)


CloudWatch에 대한 사용여부를 마지막으로 확인하고 아래쪽 CodePipeline으로 계속 버튼을 누른다.


CodeBuild가 정상적으로 생성됐다면 위와 같은 화면을 볼 수 있다. 이제 다음 버튼을 누른다.


어디에 배포할 지 선택하는 부분이다. 아마 Blue/Green 배포를 사용하고 있다면 CodeDeploy를 트리거하겠지만 나같은 경우 개발 서버이기 때문에 바로 ECS에 배포해줄 것이다. 클러스터 이름, 서비스를 선택하고 이미지 정의 파일은 비워둔다. 마지막으로 배포 제한 시간을 설정하고 다음 버튼을 누른다. 그리고 다음 페이지에서 파이프라인 생성 버튼을 누르면 최종적으로 파이프라인이 생성된다.


최초 파이프라인을 생성하고 나면 자동으로 한번 파이프라인이 실행된다. 위 화면은 Build까지 성공하고 Deploy가 진행되고 있는 모습이다.


실제로 ECS로 들어가서 배포 탭을 확인해보면 정상적으로 배포가 진행중임을 확인할 수 있다. 이제 도커 이미지를 ECR에 푸시하면, 자동으로 ECR의 변화를 감지하고 해당 이미지를 통해 ECS에 배포가 진행될 것이다.


반응형