https://growth-coder.tistory.com/220
이전 포스팅에서 깃허브 액션만 사용하여 CI/CD를 구축했었다.
ssh-action과 scp-action을 통해서 배포 자동화를 구축했는데 이번에는 AWS CodeDeploy를 사용하여 배포 자동화를 구축해보려고 한다. (CI 생락)
아키텍처는 다음과 같다.
진행에 앞서 프로젝트 상황을 다음과 같이 가정하겠다.
- ssh 방식이 아닌 AWS 서비스를 사용하여 파일을 가져온다.
- application.properties 파일을 깃허브에 올리지 않는다,
우선 AWS 서비스에 접근할 수 있어야 하기 때문에 권한을 부여해야 한다.
github actions가 S3와 AWS CodeDeploy에 접근하기 위해 해당 권한을 부여한 IAM 사용자 계정을 만들어준다.
코드에서 접근해야하기 때문에 프로그래밍 방식 액세스를 해줘야 한다.
AWSCodeDeployFullAccess와 AmazonS3FullAccess 권한을 가진 사용자를 생성한다.
사용자를 생성하고나면 Access key를 생성해야 한다.
(Access key 생성 방법은 아래 포스팅 참고)
https://growth-coder.tistory.com/158
이제 이 Access key를 github secrets에 등록해준다.
그리고 application.properties도 github secrets에 등록해줘야 한다.
만약 application.properties에 민감한 정보가 담겨있어서 깃허브에 올리지 않는다면 secrets를 통해서 생성해야하기 때문이다.
region 정보도 넣어준다.
Deploy agent 설치
EC2에 Deploy agent를 설치해야 CodeDeploy를 적용할 수 있다.
EC2에 접속하여 다음 명령어를 차례대로 입력한다. 마지막 명령어를 했을 때 running 메시지가 뜨면 성공적으로 설치한 것이다.
sudo yum update
sudo yum install ruby
sudo yum install wget
wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/install
chmod +x ./install
sudo service codedeploy-agent status
(자세한 옵션을 주고 싶으면 다음 링크 참고)
그리고 EC2에 역할을 연결해야 한다.
IAM -> 역할에서 AmazonEC2RoleforAWSCodeDeploy 권한을 가진 역할을 생성하고 EC2에 연결한다.
CodeDeploy 설정
CodeDeploy -> 애플리케이션 -> 애플리케이션 생성에 들어간다. 컴퓨팅 플랫폼을 EC2로 선택한다.
생성된 애플리케이션에서 배포 그룹을 생성한다.
배포 그룹 이름을 정하고 서비스 역할을 선택한다.
EC2에 AmazonEC2RoleforAWSCodeDeploy 권한을 가진 역할이 연결되어야 EC2 인스턴스를 선택할 수 있다.
현재 위치를 선택하고 태그 그룹에 EC2 인스턴스를 선택한다.
로드 밸런서를 사용하지 않는다면 로드 밸런서 활성화도 풀어주고 배포 그룹을 생성한다.
Workflow 작성
Workflow의 과정은 다음과 같다.
- 환경 세팅을 진행한다.
- github secrets에 넣어둔 PROPERTIES 파일로 application.properties를 만들어서 /src/main.resources 아래에 생성한다.
- 빌드를 한다.
- AWS 인증을 한다.
- cicd 디렉토리를 생성한다.
- cicd 디렉토리 안에 jar 파일, appspec yml, deploy.sh 파일을 넣고 압축해서 deploy.zip 파일을 만든다.
- AWS S3에 이 zip 파일을 복사한다.
- code deploy에 배포를 진행한다.
- /home/ec2-user/cicd에 압축 파일을 가져온다.
- deploy.sh를 실행한다.
name: Java CI/CD
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- uses: actions/checkout@v3
- run: touch ./src/main/resources/application.properties
- run: echo "${{ secrets.PROPERTIES }}" > ./src/main/resources/application.properties
- run: cat ./src/main/resources/application.properties
- name: make gradlew executable
run: chmod +x ./gradlew
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: build
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Make dir
run: mkdir cicd
- name: Copy jar
run: cp ./build/libs/*.jar ./cicd
- name: Copy appspec
run: cp ./appspec.yml ./cicd
- name: Copy script
run: cp ./deploy.sh ./cicd
- name: Make zip
run: zip -r -qq -j ./deploy.zip ./cicd
- run: ls -al
- name: Upload S3
run: aws s3 cp --region ${{ secrets.AWS_REGION }} ./deploy.zip s3://ci-cd-test-123/ci-cd/
- name: Code Deploy
run: aws deploy create-deployment --application-name cd-test --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name CD --s3-location bucket=ci-cd-test-123,bundleType=zip,key=ci-cd/deploy.zip
<deploy.sh>
#!/bin/bash
CURRENT_PID=$(pgrep -f .jar)
echo "$CURRENT_PID"
if [ -z $CURRENT_PID ]; then
echo "no process"
else
echo "kill $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 3
fi
JAR_PATH="/home/ec2-user/cicd/*.jar"
echo "jar path : $JAR_PATH"
chmod +x $JAR_PATH
nohup java -jar $JAR_PATH >> /home/ec2-user/cicd/deploy.log 2>> /home/ec2-user/cicd/deploy_err.log &
echo "jar fild deploy success"
<appspec.yml>
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/cicd
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStart:
- location: deploy.sh
timeout: 60
runas: ec2-user
참고
'공부 > Spring' 카테고리의 다른 글
[Spring] 스프링 부트 Redis를 사용하여 refresh token 저장하기 (1) (0) | 2023.07.12 |
---|---|
[Spring] 깃허브 액션(github action)과 도커(docker)를 사용하여 스프링 부트 서버 CI/CD 구축하기 (0) | 2023.07.09 |
[Spring] 깃허브 액션으로 CI/CD 구축해보기 (스프링 부트) (0) | 2023.07.02 |
[Spring][인프런 스프링 DB] 스프링, 자바 예외 처리 (0) | 2023.07.01 |
[Spring][인프런 스프링 DB] 트랜잭션(Transaction) 문제 해결 (0) | 2023.06.25 |
댓글