(사이드 프로젝트) 미리도서관 API, CD 구축하기

유인근·2021년 10월 17일
0

토이 프로젝트

목록 보기
3/3
post-thumbnail

CD 구축을 위해 AWS 서비스 중 S3와 CodeDeploy를 사용했다. 추가적으로, 배포 알림을 위해서는 SNS와 Lambda를 사용했다. 그래서 작업은 CD 구축과 배포 알림 작업으로 크게 2가지로 나눠 진행하게 되었다.

CD 구축

구축하고자 하는 CD 과정은 다음과 같다.

  1. Jenkins -> S3 (배포 관련 파일 업로드, Jenkins plugin 사용)
  2. Jenkins -> CodeDeploy (S3에 업로드된 파일로 배포 요청, Jenkins plugin 사용)
  3. CodeDeploy -> API EC2 (배포 진행)

배포를 위한 설정 & 스크립트 작성

S3에는 아래와 같은 파일이 압축되어 업로드 될 것인데, 이를 위한 코드 작업을 먼저 진행한다.

  • 빌드 결과물 파일 (*.jar)
  • appspec.yml (AWS CodeDeploy에 대한 설정 파일)
  • deploy.sh (배포를 수행할 스크립트)
version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ubuntu/app/deploy/
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    - location: deploy.sh
      runas: ubuntu
  • ㄴ appspec.yml
#!/bin/bash

REPOSITORY_DIR=/home/ubuntu/app
APP_NAME=work-assistant-api
PID_PATH=$REPOSITORY_DIR/PID

SESSION_PROPERTIES=$REPOSITORY_DIR/application-production-session-storage.yaml
THIRD_PARTY_PROPERTIES=$REPOSITORY_DIR/application-thid-party.yaml
DB_PROPERTIES=$REPOSITORY_DIR/application-production-db.yaml

echo "copy executable jar file"

cp $REPOSITORY_DIR/$APP_NAME/build/libs/*.jar $REPOSITORY_DIR

echo "check current pid"

if [ -f $PID_PATH ]; then
	PID=$(cat $PID_PATH)
	echo "stop current pid $PID"
	kill -15 $PID
	sleep 10
fi

echo "new application deploy"

echo $(ls -tr $REPOSITORY_DIR | grep .jar | tail -n 1)

JAR_NAME=$(ls -tr $REPOSITORY_DIR/ | grep .jar | tail -n 1)

echo "jar name : $REPOSITORY_DIR/$JAR_NAME"

nohup java -jar \
  -Dspring.config.location=classpath:/application.yaml,$SESSION_PROPERTIES,$THIRD_PARTY_PROPERTIES,$DB_PROPERTIES \
  -Dspring.profiles.active=production \
   $REPOSITORY_DIR/$JAR_NAME 2>&1 & echo $! > $PID_PATH
  • ㄴ deploy.sh

S3, CodeDeploy 전용 IAM 생성

AWS를 외부 서비스에서 사용하기 위해서는 인증이 필요한데, 이를 위해 IAM(Identity and Access Management)을 생성한다.

  • AmazonS3FullAccess, AWSCondeDeployFullAccess 권한을 가진 IAM 추가

1. Jenkins -> S3 (배포 관련 파일 업로드)

S3 버킷 생성

각종 파일들을 저장할 저장소인 버킷을 생성한다.

  • AWS > S3 > 버킷 만들기에서 별도 설정 없이 위와 같이 생성

Jenkins와 S3 연동

그리고 Jenkins와 S3를 연동하기 위해 플러그인을 설치하고, Connection 설정을 진행한다.

  • Jenkins 관리 > S3 publisher 플러그인 설치

  • Jenkins 관리 > 시스템 설정 > S3 profile 설정

Build > S3에 업로드 되도록 설정

Jenkins에서 빌드 후, 빌드 결과물을 압축한 파일이 S3에 업로드 되도록 스크립트 작성 및 설정을 진행한다.

  • Jenkins 프로젝트 선택 > 구성 > Build > Command 작성

  • 빌드 후 조치 > S3 버킷 및 업로드 할 파일 설정

  • Jenkins 빌드 후, S3 버킷에 업로드가 잘 되는지 확인

2. Jenkins -> CodeDeploy (배포 요청)

CodeDeploy를 위한 IAM 생성

CodeDeploy 구축

배포 작업에 대한 구성을 지정해 생성한다.

  • CodeDeploy > 배포 구성 > 배포 구성 만들기

배포를 진행할 애플리케이션을 생성한다.

  • CodeDeploy > 애플리케이션 > 애플리케이션 생성

이전에 생성한 IAM ARN, API EC2 Name, 배포 설정 값을 올바르게 지정해 배포 그룹을 생성한다.

  • CodeDeploy > 애플리케이케이션 > 배포 그룹 생성

(AWS 권한 문제로 이후 작업 보류)

profile
조금씩 꾸준하게 🔥

0개의 댓글

관련 채용 정보