본문 바로가기

CICD/EC2

EC2 CICD Automation - 5. CodeDeploy (Rolling)

CodeDeploy를 구성해 봅시다. Intro에서 어떠한 구성을 가지고 있는지 설명하였기 때문에 생략하고 넘어가겠습니다.

 

이전 포스트에서 appspec.yaml을 자세히 보셨다면 알 수 있겠지만, 모두 젠킨스 유저의 권한을 가지고

서비스를 배포하고 수행하게 됩니다. 따라서 배포되는 서버에서 젠킨스 유저가 있어야하며,

jar를 실행하기 위한 jdk, CodeDeploy 배포에 필요한 Agent, 그리고 Jenkins 서버에 적용한 IAM Role을 적용해주어야 합니다.

 

먼저 서버에 Jenkins 유저를 세팅해줍시다.

 

 


배포하고자 하는 서버에서 다음 쉘을 수행하여 라이브러리 및 코드디플로이 에이전트를 설치해 줍시다.

AWS Docs에서 CodeDeploy Agent는 EC2-USER에 세팅하기 때문에 ec2-user로 접속하여 아래 쉘을 수행하는 것을 권유드립니다.

 

sudo yum -y update

sudo yum install -y java-1.8.0-openjdk-devel.x86_64
rpm -qa java*jdk-devel
javac -version

sudo yum install -y python3
sudo python3 -m pip install --upgrade pip
sudo python3 -m pip install awscli

sudo yum -y install ruby
sudo yum -y install wget
cd /home/ec2-user
sudo wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

sudo chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent start
sudo service codedeploy-agent status

 

 

쉘 수행 결과가 마지막에 아래와 같이 되었다면 정상설치된 것입니다.

 


이제 예제 소스 파일 포트가 9000번 이므로, 타겟그룹을 9000으로 만들고 연결시켜 주도록 합시다.

 


이제 CodeDeploy를 통해 배포를 해보도록 하겠습니다.

코드 디플로이에서 어플리케이션을 만든 후

 

 

이제 배포 그룹을 만들어보도록 하겠습니다.

Intro에서 말한 것 처럼, 어떤 배포 세팅을 어떤 서버에 할 것인지 정의해주는 부분입니다.

현재 위치 (Rolling)에서 배포를 선택해 줍니다. (Role은 CodeDeployRole Pollicy로 만들면 됩니다.)

 

 

이제 어떤 서버에 배포할 지 정해주게 되는데 아래 태그를 가지고 있는 모든 서버에 배포되기 때문에

꼭 필요한 태그 값만 넣어주시기 바랍니다.

 

 

한번에 모든 서버에 배포하는 형태를 고르겠습니다.

여기서 배포된 후 LoadBalancer에 연결시키는 부분은 꼭 AutoScaling을 바라 볼 경우에만 선택해 주시기 바랍니다.

 

 

트래픽을 차단하고 다시 연결시키는 부분이기 때문에 이미 연결되어있는 지금과 같은 경우에는

LB에서 해당 TG를 Detach한 후 배포 후에 다시 Attach 하기 때문에 많은 배포시간을 소요하게 됩니다. (에러도 잘남)


이제 Create Deployment를 수행하여 배포를 만들어 보겠습니다.

 

 

경로 복사를 해서 아래와 같이 배포를 만들어 주시면 됩니다.

 

 

배포가 되는 모습을 지켜보도록 하겠습니다.

 

만약 에러가 나는데 콘솔에서 뚜렷한 에러를 알려주지 않을 경우,

해당 서버에서 다음 명령어로 로그를 확인하시면 됩니다.

 

cat /var/log/aws/codedeploy-agent/codedeploy-agent.log

 

만약 CodeDeploy Agent PID가 0으로 재설치 및 작동이 안될 때는

아래의 명령어를 실행한 후 다시 실행하면 됩니다.

 

sudo rm -rf /opt/codedeploy-agent/state/.pid

 

별 이상이 없었다면, 아래와 같이 배포가 정상적으로 수행됐음을 볼 수 있습니다.

 


이제 젠킨스에서 CLI를 수행해서 자동화 배포를 완성시켜보도록 하겠습니다.

 

기존 스크립트에서 아래 부분을 추가해주세요

 

DEPLOYMENT_ID=`aws deploy create-deployment \
--application-name CB-TEST-API \
--deployment-group-name TEST-Rolling \
--region ap-northeast-2 \
--s3-location bucket=cb-test-deploy,bundleType=zip,key=${JOB_NAME}/${BUILD_NUMBER}/${JOB_NAME}.zip \
--file-exists-behavior OVERWRITE \
--query "deploymentId" \
--output text`

echo $DEPLOYMENT_ID

DEPLOYMENT_RESULT=""

while [ "$DEPLOYMENT_RESULT" != "Succeeded" ]
do
        DEPLOYMENT_RESULT=`aws deploy get-deployment \
        --query "deploymentInfo.status" \
        --region ap-northeast-2 \
        --deployment-id $DEPLOYMENT_ID --output text`
        echo $DEPLOYMENT_RESULT
        
        if [ "$DEPLOYMENT_RESULT" == "Failed" ]; then
          echo "CodeDeploy Failed..."
          exit 1
        fi

        sleep 5s
done

 

똑같이 수동으로 클릭하던 부분의 세팅을 자동화 시킨것이고,

이에 대한 배포가 성공했는지 CodeDeploy 배포가 끝날때 까지 지켜보는 쉘입니다.

 

이제 완성 된 자동화 배포를 수행해보도록 하겠습니다.

 

젠킨스에서 위와 같은 로그를 볼 수 있으며,

 

배포한 Build Number로 수정된 것을 볼 수 있습니다.

가~장 기본적인 CICD 자동화 구성을 해봤습니다.

 

이제 지금 상태의 API Server를 AMI를 생성하시고,

다음 포스트 부터는 이를 바탕으로 AutoScaling Group을 생성 한 후 BlueGreen 형태의 배포를 구성해 보도록 하겠습니다.