Bitbucket과 AWS를 사용한 배포 자동화

Junghyo Cho
Pagecall Engineering
7 min readFeb 25, 2019

이 글에서는 Bitbucket Pipeline과 AWS CodeDeploy를 사용해 배포를 자동화해보려고 한다. 테스트 서버에 배포하려는 개발자나 복잡하지 않게 구성된 운영 서버에 배포하려는 개발자 및 운영자에게 도움이 될 것이다.

AWS CodeDeploy란?

CodeDeploy는 애플리케이션 배포를 자동화하는 배포 서비스이다. EC2 인스턴스, 온프레미스 인스턴스, Lambda 함수 또는 ECS 서비스에 애플리케이션을 배포할 수 있다.

(출처 : https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/welcome.html)

Bitbucket Pipeline이란?

Bitbucket Pipeline은 통합된 CI/CD 서비스로 저장소(repository)에 있는 설정파일을 기준으로 자동으로 빌드, 테스트, 코드 배포를 수행한다. 이를 위해 Bitbucket이 내부적으로 클라우드에 컨테이너를 만들고 명령을 수행한다.

(출처 : https://ko.atlassian.com/software/bitbucket/features/pipelines)

배포 동작

1. Bitbucket 저장소에 코드를 커밋한다.

소스를 변경하고 Bitbucket 저장소에 코드를 커밋한다. 이 글에서 master 브랜치를 기준으로 한다.

2. Bitbucket Pipeline이 컨테이너를 생성한다.

코드가 커밋되면 자동으로 Bitbucket Pipeline이 실행된다. Pipeline은 컨테이너를 만들어 명령을 수행할 수 있는 환경을 제공한다.

3. 배포할 이미지를 S3에 복사한다.

Pipeline이 생성한 컨테이너에서 배포할 소스 코드를 압축한 이미지를 생성한다. 이 이미지를 AWS CLI를 사용해 AWS S3로 복사한다.

4. AWS CodeDeploy에 배포를 생성한다.

Pipeline이 생성한 컨테이너에서 AWS CLI를 사용해 AWS CodeDeploy에 배포를 생성한다.

5. AWS CodeDeploy가 배포를 진행한다.

배포가 생성되면 AWS CodeDeploy는 AWS S3에서 배포 이미지를 가져온다. 이미지를 압축 해제한 다음 이미지에 포함된 스크립트에 따라 배포를 진행한다.

간단한 배포 예제 만들어 보기

Git을 사용한 개발 경험이 있다면, 이 글의 설명을 따라 쉽게 배포 환경을 만들어 볼 수 있다.

먼저 AWS CodeDeploy를 생성한다.

CloudFormation 콘솔에서 아래 템플릿을 사용해 CloudFormation 스택을 생성한다. 스택은 다음과 같은 배포에 필요한 환경을 생성한다.

  • CodeDeployApplication : 배포를 수행하는 배포 그룹(Deployment Group)를 포함하는 CodeDeploy 애플리케이션
  • Deployment Group : 배포 옵션을 설정하는 배포 그룹
  • Instance : 코드를 배포할 EC2 인스턴스
  • 기타 : EC2 인스턴스에 권한을 부여하기 위한 IAM 역할과 EC2 인스턴스의 보안 그룹

다음으로 Bitbucket Pipeline을 설정해본다.

1. 새로운 저장소(Repository)를 만든다. Repository name에 deploy-test를 입력한다.

2. 화면에 나오는 안내에 따라 저장소에 애플리케이션 소스를 업로드한다.

3. Settings를 선택하고 PIPELINGS > Settings에서 Repository variables를 선택하고 다음 환경 변수를 설정한다.

  • AWS_ACCESS_KEY_ID : AWS IAM 사용자의 액세스 키 아이디
  • AWS_SECRET_ACCESS_KEY : AWS IAM 사용자의 시크릿 액세스 키
  • AWS_DEFAULT_REGION : 애플리케이션을 배포할 리전
  • APPLICATION_NAME : AWS CodeDeploy 애플리케이션 이름(CloudFormation 스택의 이름으로 설정됨)
  • DEPLOYMENT_GROUP_NAME : AWS CodeDeploy 애플리케이션의 배포 그룹 이름(CloudFormation 스택의 이름으로 설정됨)
  • S3_BUCKET : 배포할 파일을 업로드할 S3 버킷
  • S3_KEY : 배포할 파일 이름

4. Settings를 선택하고 PIPELINGS > Settings에서 Enable Pipelines를 선택한다.

5. Configure bitbucket-pipelines.yml 버튼이 나타나면 선택한다.

6. Pipelines 페이지가 나타나면 템플릿 선택에서 드롭다운 박스를 선택한다.

7. Example tasks 목록에서 Amazon CodeDeploy를 선택하면 배포를 생성하는 AWS CLI 명령을 볼 수 있다.

8. 왼쪽 에디트 가능한 영역에 다음 코드를 붙여 넣는다.

9. Commit file을 선택한다.

배포 실행하기

배포를 실행하려면 Bitbucket 저장소의 master 브랜치에 코드를 커밋한다. 코드가 커밋되면 Bitbucket 저장소의 Pipelines 페이지에서 진행 상태를 확인할 수 있다. Bitbucket Pipeline에서 AWS CodeDeploy 배포를 생성한다.

배포가 생성된 후에는 AWS CodeDeploy 콘솔에서 배포 진행 상황을 볼 수 있다. Deployments 메뉴를 선택하면 최근에 생성한 배포 순으로 보여진다.

배포 중단

배포를 실행한 후 코드에 오류가 있거나 서버의 설정 문제 등으로 배포가 지연되는 경우가 발생할 수 있다. 이런 경우 배포를 중단하고 최근에 성공한 배포로 돌아가려고 한다. 하지만 위에서 설정한 배포에서는 문제가 발생한다. 이전 배포를 찾기 위해 AWS S3에 배포 이미지를 요청하지만 이미 이전 배포는 현재 배포로 덮어써진 상태이다. 이를 해결 하기 위해서는 배포할 때마다 이미지 이름을 다르게 설정하면 된다.

bitbucket-pipelines.yml 파일을 다음과 같이 수정한다.

수정된 Pipeline 설정은 배포 이미지 파일 이름에 현재 날짜와 시간을 추가해 이미지 파일이 중복되는 것을 방지한다.

배포 시 서비스 중단 최소화

위에서 설정한 배포를 사용할 때 발생하는 다른 문제는 배포가 진행되는 동안 서비스가 중단된다는 것이다. CloudFormation으로 EC2 인스턴스로 배포하는 배포 그룹을 설정할 경우 배포 타입을 In-place로 설정할 수 밖에 없다. 배포 타입을 수동으로 Blue/green으로 변경하면 서비스 중단 시간을 최소화할 수 있다.

배포 타입을 변경하기 전에 대체 그룹이 자동으로 생성되도록 CloudFormation 템플릿을 수정해야 한다. Blue/green 배포에서는 대체 그룹(Green 그룹)을 생성하여 배포한 후 원래 그룹(Blue 그룹) 대신 대체 그룹을 사용하도록 설정하기 때문이다. 만약 대체 그룹을 생성할 수 없으면 CodeDeploy는 배포에 실패한다.

다음 템플릿으로 CloudFormation 스택을 업데이트 한다.

CloudFormation 에서는 배포 그룹의 타입을 Blue/green으로 설정할 수 없다. 따라서 CloudFormation 스택을 업데이트 했으면 배포 타입을 수동으로 변경한다.

배포 타입을 변경하려면

  1. AWS CodeDeploy 콘솔에서 Deploy > Applications 메뉴를 선택한다.
  2. 목록에서 위에서 생성한 CodeDeploy 애플리케이션을 선택한다.
  3. Deployment Groups 탭에서 배포 그룹을 선택한다.
  4. Edit를 선택하고 Deployment type에서 Blue/green을 선택한다.
  5. Save changes를 선택한다.

참고

Bitbucket Pipeline

AWS CodeDeploy

--

--