프로젝트를 진행할 때 변경한 코드가 올려져 있는 Github Repository로 부터 서버에서 pull해서 build하고 deploy하는 과정이 너무 번거로웠다. 나는 이러한 문제를 해결하기 위해서 Github Actions를 사용하여 Repository에 특정한 이벤트(나와 같은 경우 pull request)가 발생하면 자동으로 빌드하고 빌드된 프로젝트 파일을 AWS S3에 올리도록 하였다(CI 과정). 그 후는 Github Actions가 CodeDeploy에게 배포 명령을 내리고 AWS Code Deploy Agent가 appspec.yml의 절차를 따라 배포 서버(EC2)에 배포하는 과정을 거친다(CD 과정). 이번 포스팅은 GithubActions로 S3에 저장된 빌드 파일은 EC2 인스턴스로 전달하기 위해 AWS의 CodeDeploy를 사용하는 과정을 담았다. 이전에 생성한 EC2에서 진행하였다.
요약
1. IAM 권한 설정
2. EC2 인스턴스 내 환경 설정
3. AWS CodeDeploy 배포 설정
4. CodeDeploy appspec.yml 파일 설정
5. Github Actions workflow gradle.yml 파일 설정
1. IAM 권한 설정
1. Github Actions에서 Code Deploy에게 배포 명령을 하는 사용자 권한 추가
이전 글에서 Github Actions 에서 빌드된 파일을 S3에 저장하기 위해 AmazonS3FullAccess 권한이 주어진 사용자(IAM-GithubActions)를 생성했었다. 이 사용자에게 CodeDeploy에게 배포 명령을 하는 권한을 추가해준다.
IAM > 사용자 > IAM-GithubActions > 권한 추가 > 직접 정책 연결
2. EC2에서 CodeDeploy, S3에 대한 권한 추가
IAM > 역할 > 역할 생성
S3, CodeDeploy에 대한 권한을 추가해준다.
- AmazonS3FullAccess
- AWSCodeDeployFullAccess
이름 지정, 검토 및 생성
- 역할 이름 : IAM-ROLE-ec2
EC2에 생성한 역할을 설정해줘야 한다. 해당 인스턴스 > 보안 > IAM 역할 수정
생성한 역할 (IAM-ROLE-ec2) 선택하여 IAM 역할을 업데이트 한다.
3. CodeDeploy에서 EC2에 S3 빌드 파일 전달 권한 추가
IAM > 역할 > 역할 생성에 들어가서 사용 사례에 CodeDeploy를 선택한다.
권한을 추가해준다.
- AWSCodeDeployRole
이름 지정, 검토 및 생성
- 역할 이름 : IAM-ROLE-CodeDeploy
2. EC2 인스턴스 환경 설정
1. Java 설치
Spring Boot 프로젝트를 배포할 것이기 때문에 Java를 인스턴스에 설치한다. 나는 Java11을 설치하였다.
$ sudo apt update
$ sudo apt install openjdk-11-jre-headless -y
명령어를 통해 정상적으로 설치했는지 확인한다.
$ java --version
2. AWS CLI 설치
AWS CLI(Command Line Interface)란?
명령줄 셸의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구 CLI를 사용하여 EC2에 배포할 것이기 때문에 설치한다.
$ cd ~
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ sudo apt install unzip
$ unzip awscliv2.zip
$ sudo ./aws/install
명령어를 통해 정상적으로 설치했는지 확인한다.
$ aws --version
3. AWS CodeDeploy Agent 설치
CodeDeploy Agent란?
배포를 진행할 EC2 인스턴스에 설치되어 CodeDeploy의 명령어를 기다리는 프로그램으로 appspec.yml 파일에 있는 절차에 맞추어 배포를 진행한다.
$ cd ~
$ sudo apt update
$ sudo apt install ruby-full -y
$ sudo apt install wget
$ cd /home/ubuntu
$ sudo wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ sudo chmod +x ./install
$ sudo ./install auto > /tmp/logfile
명령어를 통해 정상적으로 설치했는지 확인 active(running) 상태이면 정상적으로 설치된 것이다.
$ sudo service codedeploy-agent status
3. AWS CodeDeploy 배포 설정
1. AWS CodeDeploy 애플리케이션을 생성한다.
애플리케이션 이름 : codedeploy-app
2. 애플리케이션 내 배포 그룹 생성
생성한 애플리케이션 > 배포 그룹 > 배포 그룹 생성
서비스 역할 선택 시 이전에 만들었던 CodeDeploy에 대한 역할인 IAM-ROLE-codedeploy를 선택해준다.
배포 그룹 이름 : codedeploy-group
배포하려는 EC2를 선택해준다.
인스턴스 태그를 확인 혹은 변경하고 싶다면 해당 인스턴스 > 작업 > 인스턴스 설정 > 태그 관리에서 확인하면 된다.
최하단 로드 밸린싱 활성화를 체크 해제하고, 다른 기본 구성 대로 배포 그룹을 생성한다.
4. CodeDeploy appspec.yml 파일 설정
1. 최상위 디렉토리 구조에 appspec.yml 파일을 생성한다.
본인의 EC2 인스턴스에 따라 코드를 변경해야 한다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/action
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: scripts/deploy.sh
timeout: 60
runas: ubuntu
2. scripts 디렉토리에 deploy.sh 파일을 생성한다.
해당 쉘 스크립트는 EC2 배포 진행 상활 별 로그는 deploy.log에 기록하고 새로 배포된 빌드 파일을 실행한다.
#!/bin/bash
BUILD_JAR=$(ls /home/ubuntu/action/build/libs/{본인 프로젝트 빌드파일 이름}.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> 현재 시간: $(date)" >> /home/ubuntu/action/deploy.log
echo "> build 파일명: $JAR_NAME" >> /home/ubuntu/action/deploy.log
echo "> build 파일 복사" >> /home/ubuntu/action/deploy.log
DEPLOY_PATH=/home/ubuntu/action/
cp $BUILD_JAR $DEPLOY_PATH
echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ubuntu/action/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)
if [ -z $CURRENT_PID ]
then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ubuntu/action/deploy.log
else
echo "> kill -9 $CURRENT_PID" >> /home/ubuntu/action/deploy.log
sudo kill -9 $CURRENT_PID
sleep 5
fi
DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포" >> /home/ubuntu/action/deploy.log
sudo nohup java -jar $DEPLOY_JAR >> /home/ubuntu/action/deploy.log 2>/home/ubuntu/action/deploy_err.log &
5. Github Actions workflow gradle.yml 파일 설정
1. 이전 글에서 작성한 gradle.yml 에서 워크플로우 하단에 Code Deploy 배포 명령을 추가한다.
# CodeDeploy에게 배포 명령을 내립니다.
- name: Code Deploy
run: >
aws deploy create-deployment --application-name {CodeDeploy 애플리케이션 이름 : codedeploy-app}
--deployment-config-name CodeDeployDefault.AllAtOnce
--deployment-group-name {CodeDeploy 배포 그룹 이름 : codedeploy-group}
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=dodom-deploy.zip
2. 수정을 마치고 레포지토리에 push 하면 Github Actions가 실행된다.
나는 이 과정에서 IAM 권한을 제대로 추가해주지 않아 에러를 많이 겪었다! 에러를 해결하기 위해서 체크 사항을 하나씩 리스트로 작성하고 확인하니 쉽게는 아니지만 해결되어서 아주 뿌듯했다.
'Infra > AWS' 카테고리의 다른 글
[AWS] SQS 전송 지연 설정 (6) | 2024.08.22 |
---|---|
[AWS] Spring 2.7 버전에서 profile에 따른 파라미터 AWS Parameter Store에 등록하기 (0) | 2023.07.31 |
[AWS] EC2 - 인스턴스 생성 및 접속 (0) | 2023.07.19 |
[AWS] EC2 인스턴스에 HTTPS 적용 - ACM, Route53, ALB (0) | 2023.07.17 |
[AWS] S3에 배포한 웹에 HTTPS 적용 - ACM, Route53, Cloud Front (0) | 2023.06.29 |