
이전 글에서 main 브랜치로 push시 Github actions가 작동하여 jar 파일을 S3에 올리는 작업까지 진행했다.
이번에는 CodeDeploy에게 S3의 jar 파일을 가져가서 담당한 배포그룹의 ec2에 배포하는 과정을 진행한다.
CodeDeploy는 SourceCode를 운영환경에 자동 배포하는 역할을 수행하는 AWS Service이다. 즉, CD 지속적 배포 서비스이다.
또한 현재위치 배포나 블루/그린 배포와 같은 무중단 배포를 지원한다.
CodeDeploy의 배포과정은 아래와 같다.
개발한 애플리케이션 최상단 경로에 AppSpec.yml 파일을 추가한다.
CodeDeploy에 프로젝트 특정 버전을 배포해달라고 요청하면, CodeDeploy는 배포를 진행할 EC2 인스턴스에 설치돼 있는 CodeDeploy Agent들과 통신하며 Agent들에게 요청받은 버전을 배포해 달라고 요청한다.
요청 받은 Agent들은 코드 저장소에서 프로젝트 전체를 서버에 내려받고, AppSpec.yml 파일을 읽어 해당 파일에 적힌 절차대로 배포를 진행한다.
Agent는 배포를 진행한 후 CodeDeploy에게 성공/실패 등의 결과를 알려준다.
따라서 EC2에는 실제 배포를 진행하는 CodeDeploy Agent가 설치되어야 한다.

java 11설치
yum install java-11-amazon-corretto.x86_64
# java 버전 확인
java -version
# 패키지 매니저 업데이트, ruby 설치
sudo yum update
sudo yum install ruby
sudo yum install wget
# 서울 리전에 있는 CodeDeploy 리소스 키트 파일 다운로드
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
# 설치 파일에 실행 권한 부여
chmod +x ./install
# 설치 진행 및 Agent 상태 확인
sudo ./install auto
sudo service codedeploy-agent status

EC2 에 S3, CodeDeploy 권한 정책을 부여하겠다.
EC2로 사용사례를 선택한다.

AmazonsS3FullAccess, AWSCodeDeployFullAccess 두가지 권한을 부여한다.
역할이름을 적고 생성한다.
아래와 같이 인스턴스에 들어가서 IAM 역할 수정을 한다.

위에서 만든 역할을 부여해준다.


CodeDeploy에 접속하여 애플리케이션 탭에 들어가서 애플리케이션 생성을 한다.

생성후 배포그룹을 생성한다. 역할은 이전에 생성한 CodeDeploy Role을 부여하고, 배포유형은 현재위치 배포를 선택한다.

(배포 방식에 대해서는 다른 글로 대체하겠다. - https://gist.github.com/ninanung/9d63304cb0d070642e89f9b94b6fe24b)
환경 구성을 설정한다. EC2를 선택하고, 태그 그룹에 생성한 EC2 인스턴스를 입력한다.

에이전트 구성은 하지 않고, 배포 설정은 여러대의 서버를 어떤 단계레 따라 순차적으로 배포할것인지를 선택하는 설정인데, EC2하나만 배포하기 때문에 한번에 배포하고 끝내는 CodeDeployDefault.AllAtOnce를 선택한다.
또한, 로드밸런서는 없으므로 사용하지 않는다.

배포그룹을 생성한다.
appspec은 CodeDeploy Agent가 읽고 배포를 진행하는 명세서와 같다.
해당 파일은 프로젝트 최상단에 생성한다.
# appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/cicd_hwan/ # 프로젝트 이름
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
CodeDeploy에 대한 설정을 추가해준다.
push:
branches: [ main ]
env:
S3_BUCKET_NAME: cicd-hwan
PROJECT_NAME: cicd-hwan
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Java JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Grant execute permission for gradlew
run: chmod +x gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make zip file
run: zip -r ./$GITHUB_SHA.zip .
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
### 새로 추가한 부분 ###
- name: Code Deploy
run: aws deploy create-deployment --application-name cicd_hwan --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name develop --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
이제 작성한 것을 push하고 actions를 살펴보면 되는데, 그 전에 EC2 상에서 실행한 CodeDeploy Agent는 IAM Role을 부여하기 전에 실행했으므로 해달 Role이 적용되지 않았을 것이다. 따라서 restart를 해주고, push 하겠다.
sudo service codedeploy-agent restart
그러면 아래와 같이 배포가 된것을 확인할 수 있다.!!

이제 EC2에서 현재 디렉터리를 확인해보면,

ec2-user home 디렉터리에 프로젝트가 있는것을 확인할 수 있다.
이제는 Nginx를 통해 무중단 배포를 다음글에서 적어보겠다.