🤗 AWS 구축하기 5
사실 이 시리즈의 메인 파트이다.
이번 프로젝트에서는 Github Action과 CodeDeploy로 CI/CD를 구축했다. 도커는 다음에..
실행 과정은 다음과 같다.
- task 1 : Github Action에서 작업들을 마치고 코드를 빌드한다.
- task 2 : Github Action이 CodeDeploy를 동작시키고, S3에 빌드 결과물을 저장한다.
- task 3 : CodeDeploy가 EC2에 S3에 저장된 결과물을 가져와 배포한다.
설정하는 데 있어서 중요한 것은 IAM 권한 설정하는 것이다! 차근차근 기록해 보자.
🏭 CodeDeploy
🖥️ EC2 설정 추가하기
EC2에서 배포를 진행하려면 다음과 같은 추가적인 설정이 필요하다!
- Tag 추가하기
- IAM 추가하기
- 인스턴스에 CodeDeploy Agent 설치하기
1️⃣ Tag 추가
어떤 인스턴스에 배포를 할 것인지 CodeDeploy에게 알려줘야 하는데 여기서 Tag를 통해서 알려준다.
메뉴에 들어갔다면 대충 적어준다! 물론 여러 개의 인스턴스의 경우 명확한 구분을 지어줘야 한다.
2️⃣ IAM 추가
IAM을 만드는데 2가지 선택지가 존재한다. 바로 사용자와 역할이다.
역할을 만들 것이고 이 역할은 특정 인스턴스가 어떤 권한을 가지고 행동할지 정해주는 것이다!
우리의 인스턴스가 S3에서 결과물을 가져와 열어볼 수 있어야 하므로 S3 관련 권한을 선택한다.
그다음 이름을 만들고 생성해 주면 된다.
다음 EC2 콘솔로 돌아와서 생성한 IAM 역할을 적용해 주자.
3️⃣ CodeDeploy Agent 설치
설치는 크게 어려운 부분은 없다. 분명히 저번에는 나를 괴롭혔는데...
AWS 가이드를 보면서 따라 하면 되지만 혹시 이 글을 읽는 분을 위해서 코드를 남겨두겠다.
$ sudo apt update
$ sudo apt install ruby-full
$ sudo apt install wget
$ cd /home/ubuntu
$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto > /tmp/logfile
$ sudo ./install auto -v releases/codedeploy-agent_1.6.0-49_all.deb > /tmp/logfile
설치가 모두 완료되었다면 다음 명령어를 치고 다음과 같은 화면이 뜨는지 확인해 보자!
$ sudo service codedeploy-agent status
🪄 CodeDeploy 설정
1️⃣ IAM 설정
CodeDeploy 애플리케이션이 사용할 역할이 필요하다! 이전처럼 진행해 주면 된다.
내부적으로 사용하는 것이니 "역할"을 만들어주면 될 것 같다.
생성 전에는 꼭 원하는 정책이 반영되어 있는지 확인하자!
2️⃣ 애플리케이션 만들기
애플리케이션 만드는 것 자체는 쉽기 때문에 사진 그대로 진행하면 된다.
3️⃣ 배포 그룹 생성
누구에게 어떻게 배포를 할 건지 설정해 주는 부분이라고 생각하면 된다!
이전에 작업한 보안 그룹과 비슷하다고 생각하면 된다.
이름을 입력하고 서비스 역할에 방금 만들어준 IAM 역할을 넣어준다.
EC2 인스턴스를 선택하고 처음에 설정해 줬던 태그를 선택해 준다.
나머지는 적당히 설정하고 넘어갔다.
🔑 IAM 설정하기
여러 번 만드는 것 같은데 이번에는 "사용자"를 만들어줄 것이다.
Github Action에서 S3에 업로드하고 CodeDeploy를 동작시키기 위해서 필요한 키를 만드는 것이다.
따라서 다음 2개의 권한 정책을 선택해 주면 된다!
- AWSCodeDeployFullAccess
- AmazonS3FullAccess
🛠️ AppSpec 작성하기
많이 클릭한 것 같지만 아직 끝난 것이 아니다..! 🥲🥲
CodeDeploy가 어떻게 동작할 것인지 알려줘야 하는데 그것을 적어둔 것이 AppSpce 파일이다.
루트 디렉터리에 위치해야 하고 yml파일로 작성해야 한다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/flag
overwrite: yes # 덮어쓸 것인지
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: CD/stop.sh
timeout: 60
runas: ubuntu
ApplicationStart:
- location: CD/start.sh
timeout: 60
runas: ubuntu
가볍게 한번 살펴보면 다음과 같다.
- files : 배포 파일을 어디에 위치시킬지에 대한 정보
- permissions : 배포 파일에 대한 권한 설정
- hooks : 어떤 작업을 할지에 대한 정보. 자세한 작업은 스크립트 파일에 명세해줘야 한다.
훅은 Github Action에서 사용하는 jobs랑 같다고 보면 된다 😋😋
자세한 건 공식 문서를 살펴보자!
🎆 스크립트 파일
내가 작성한 스크립트 파일은 다음과 같다! 이걸 보고 작성하시는 분은 참고하시면 좋을 것 같다.
원래 하나의 파일에서 동작하도록 작성했었는데 오류가 몇 번 생겨서 작업을 분리시켰다.
1️⃣ stop.sh
#!/usr/bin/env bash
# 기본 변수
PROJECT_ROOT="/home/ubuntu/flag"
JAR_FILE="$PROJECT_ROOT/flag-webapp.jar"
TIME_NOW=$(date +%c)
# 로그 변수
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
echo "> 현재 실행중인 애플리케이션 pid 확인" >> $DEPLOY_LOG
CURRENT_PID=$(lsof -i :8080)
if [ -z $CURRENT_PID ]; then
echo "$TIME_NOW > 현재 실행중인 애플리케이션이 없습니다." >> $DEPLOY_LOG
else
echo "$TIME_NOW > 실행중인 $CURRENT_PID 애플리케이션 종료하고 재시작합니다. " >> $DEPLOY_LOG
kill -15 $CURRENT_PID
# 종료될 때까지 대기
sleep 5
fi
2️⃣ start.sh
#!/usr/bin/env bash
# 기본 변수
PROJECT_ROOT="/home/ubuntu/flag"
JAR_FILE="$PROJECT_ROOT/flag-webapp.jar"
TIME_NOW=$(date +%c)
# 로그 변수
APP_LOG="$PROJECT_ROOT/application.log"
ERROR_LOG="$PROJECT_ROOT/error.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
echo "$TIME_NOW > $JAR_FILE 파일 복사" >> $DEPLOY_LOG
cp $PROJECT_ROOT/build/libs/*.jar $JAR_FILE
echo "$TIME_NOW > $JAR_FILE 파일 실행" >> $DEPLOY_LOG
nohup java -jar $JAR_FILE > $APP_LOG 2> $ERROR_LOG &
CURRENT_PID=$(pgrep -f $JAR_FILE)
echo "$TIME_NOW > 실행된 프로세스 pid는 $CURRENT_PID 입니다." >> $DEPLOY_LOG
😋 지극히 개인적인 블로그지만 훈수와 조언은 제 성장에 도움이 됩니다 😋
'Web > BackEnd' 카테고리의 다른 글
[BackEnd] MapStruct 사용기 (3) | 2023.05.13 |
---|---|
[BackEnd] Enum 유효성 검사 구현기 (1) | 2023.04.25 |
[AWS] AWS 인프라 구축하기 - SES (4) (0) | 2023.04.05 |
[AWS] AWS 인프라 구축하기 - S3 (3) (0) | 2023.04.04 |
[AWS] AWS 인프라 구축하기 - RDS (2) (0) | 2023.04.04 |
댓글