본문 바로가기
공부/프로그래밍

[aws] CodeDeploy 를 이용해 로드밸런서 환경에서 배포하기

by demonic_ 2020. 7. 23.
반응형

이전글을 참고하시면 본 내용을 이해는데 도움이 됩니다.

https://lemontia.tistory.com/945

 

[aws] Jenkins + S3 + CodeDeploy 를 이용해 배포하기

이번에는 Jenkins를 이용해 Build & Test를 진행하고 완성된 파일을 S3에 올린 후 CodeDeploy를 이용해 배포하는 방법을 알아보겠다. 이번 설정은 S3에 올리는 것을 jenkins에 설정했고, CodeDeploy는 AWS 콘솔을

lemontia.tistory.com

 

이번 포스팅은 이전 포스팅의 연결되며, 사전설정이 다음과 같이 되어있음을 가정한다.

 

1) AMI 역할 생성 및 권한 부여

2) EC2 2대 이상 가동

3) 가동중인 애플리케이션이 healthcheck가 가능한 상태(로드밸런서 설정 시 필수사항)

4) CodeDeploy Agent 설치

 

1번, 4번 내용은 위 포스팅에 있으니 참조하면 된다.

 

그럼 로드밸런서를 설정하는 것부터 알아보자

 

 

# 로드밸런스 대상그룹 설정

EC2 => 로드 밸런싱 => 대상그룹 메뉴로 들어간다.

대상그룹 생성을 클릭하여 생성창을 띄운다.

대상그룹은 임의로 입력하고 프로토콜과 포트, VPC는 상황에 맞게 설정한다

상태 검사 설정도 healthcheck가 되는 API를 입력한다.

 

고급 상태 검사 설정을 열어 각 값을 다음과 같이 설정한다.

기본값으로 설정할 경우 자동배포 시 검사하는 시간이 길어 배포가 늦게 된다.

계산식을 보면 '정상 임계값'과 '간격'이 곱셈값으로 걸려 체크가 완료되어야 하기 때문에 기본값으로 할 경우 5*30 = 150 가 되어 2분 30초가 걸린다. 상황에 따라 달리 설정하겠지만 여기서는 테스트를 위해 설정을 조절했다.

 

 

생성된 그룹에 EC2를 연결해야 한다.

생성된 '대상 그룹'을 클릭한 후, 아래 탭중 대상탭을 눌러 편집버튼을 누른다.

 

검색하여 등록할 인스턴스를 체크, '등록된 항목에 추가'를 클릭해 위 목록에 추가하여 저장한다.

 

생성해도 로드밸런서가 연결되있지 않아 다음과 같이 표기되어 있다.

 

그럼 이제 로드밸런서를 만들자

 

 

 

# 로드밸런스 대상그룹 설정

EC2 => 로드 밸런싱 => 로드 밸런스 메뉴로 들어간다.

'로드밸런서 생성' 버튼을 클릭한다. 3종류가 있는데 여기서는 application 방식을 사용한다.

만약 Network Load Balancer 를 만들경우 위에서 만든 대상그룹 설정에서도 TCP로 생성해야 한다.

 

항목들을 채워넣고 다음을 클릭한다.

 

가용영역은 ap-northeast-2a, ap-northeast-2c 둘다 등록했다.

 

https 프로토콜을 구성하지 않았다는 경고문이 뜨지만 테스트니 무시하고 다음으로 넘어간다.

 

보안그룹은 서버 상황에 맞춰 선택하고 다음을 클릭한다

대상그룹은 이전에 생성한 것을 선택한다.

 

다음을 눌러 검토 => 생성한다.

 

생성하면 로드 밸런서 목록에 다음과 같이 보인다.

 

DNS 이름에 등록된 도메인을 복사하여 브라우저에 띄워보자. 화면이 제대로 나온다면 제대로 설정된 것이다.

 

하나 더 확인해야 할 것이 있는데 healthcheck가 제대로 되고있는지 확인해야 한다.

EC2 => 로드밸런싱 => 대상 그룹 에 들어간 후 생성한 deploy-targets에 연결된 EC2의 healthy 상태를 확인할 수 있는데, deploy-targets 를 선택한 후 대상탭을 클릭하면 다음과 같이 확인이 가능하다.

 

 

 

# CodeDeploy 생성하기

AWS 콘솔에서 CodeDeploy 메뉴로 이동한다.

애플리케이션을 생성한다.

 

배포그룹을 생성한다.

 

이름은 test-elb-deploy-group 로 짓고, 서비스 역할은 이전에 AMI에서 만든 test-codedeploy를 할당한다.

 

환경구성은 태그검색을 이용해 등록한다. 여기서는 같은 태그명을 갖는 2개를 등록했다.

각각 이름이 되어있다면 추가하여 등록해주자.

 

에이전트 구성은 기본값으로 설정한다.

이전 포스팅에서 언급해 두었는데, 각 EC2에는 CodeDeploy Agent가 설치되어 있어야 한다.

관련내용을 여기에 복사해둔다.(이전 포스팅 내용이 길어서...)

 


## EC2 에 CodeDeploy agent 설치하기

CodeDeploy로 배포할 EC2 에 접속.

다음 명령어 수행

sudo yum install -y ruby

wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

제대로 설치 & 서비스가 작동하고 있는지 확인

sudo service codedeploy-agent status

The AWS CodeDeploy agent is running as PID 1160

CodeDeploy agent 설치 완료.


 

배포 설정은 CodeDeployDefault.OneAtATime 으로 한다.

이 설정은 1번에 1개만 배포한다는 의미다. 로드밸런서에선 하나를 먼저 배포하고 정상이 되었을때 다음것을 배포해야하는게 맞으므로 이렇게 설정하는게 좋다.

 

마지막으로 로드밸런서 대상그룹을 설정한다.

배포 그룹 생성을 마무리한다.

 

 

 

# 등록취소 지연 시간 조절

로드밸런서가 설정된 deploy를 사용할 경우 하나의 통신을 안전하게 차단하고 나서 배포가 시작된다. 그때 등록취소 지연시간이 너무 길면 배포에 오랜시간이 걸린다. 기본값은 300초 인데 60초로 설정을 변경한다.

변경위치는 EC2 => 로드 밸런싱 => 대상 그룹 에 들어가 생성해둔 deploy-targets를 클릭하면 아래 설명 탭 아래에 표시되어 있다.

 

속성 편집을 클릭해 시간조절한다.

 

 

# 배포 실행하기

AWS 콘솔에서 CodeDeploy => 애플리케이션에 들어간다.

애플리케이션을 선택한 후 애플리케이션 배포를 클릭한다.

 

각 항목을 채우고 배포 생성을 클릭한다.

개정유형을 S3로 선택시, S3 경로를 입력해야 하는데 S3에 저장되어있는 배포 zip파일 경로를 적어주면 된다.

(이전 포스팅 참조)

https://lemontia.tistory.com/945

 

 

수행하면 설정대로 1개를 우선 진행한다

 

View events 를 클릭하면 현재 어떤 단계인지 보여준다.

 

성공하면 다음과 같이 완료된다.

사실상 설정은 여기가 끝이다. 아래는 배포하는 과정동안 대상 그룹에 통신이 어떻게 교체되는지를 보여주기 위해 내용을 추가했다.

 

 

 

# 배포과정

대상 그룹에서 보면 다음과 같이 Target deregistration is in progress 상태가 되고 트래픽을 차단시킨다.

 

그러다 앱이 배포되는 동안 해당 인스턴스가 빠진다.

 

배포가 완료되면 다시 인스턴스가 포함되고 Target deregistration is in progress 가 되다 healthcheck도 완료되면 정상으로 표기된다.

 

이후 다음 인스턴스를 위의 순서대로 실행하여 배포한다.

 

배포가 완료되면 이전처럼 모든 인스턴스에 대해 healthy 상태가 된다.

 

 

## 만약 배포도중 에러가 나는 경우

기본적으로 롤백 정책을 할 수 있는데 아무것도 하지 않으면 배포도중 에러가 날 경우 아무런 조치를 취하지 않는다.

아무런 조치를 취하지 않는다는 것은 위에 대상그룹을 빼서 진행하다가 에러가 났을때 대상을 다시 등록시키지 않고 종료한다.즉 2개의 서버로 돌던 것이 1개로 바뀌어 돌고있다는 의미다. 그래서 반드시 에러 원인을 찾고 대상을 다시 등록해주어야 한다.

 

 

끝.

 

반응형

댓글