1. EC2 생성
ㄱ. 인스턴스 생성
- ap-northeast-2
- ubuntu
- Elastic IP 적용
- 보안그룹에서 22,80,443,8080 열어주기
- Jdk 설치
- sudo apt-get update
- sudo apt-get install openjdk-11-jdk
- nuhup 명령어 : nohup java -jar api-0.0.1-SNAPSHOT.jar &
ㄴ. EC2 태그 추가
- 인스턴스 설정> 태그 관리> 원하는 키 값 입력 후 저장
2. IAM 역할 추가
ㄱ. 역할 추가
- 역할> 역할 만들기
- AWS 서비스
- EC2
- AmazonS3FullAccess
- 역할 이름 적고 생성완료
ㄴ. EC2 인스턴스에서 IAM연결
- 인스턴스 보안 >IAM 역할 수정
- 방금 만든 EC2전용 IAM 역할을 선택한 뒤 저장
3. CodeDeploy Agent 설치
ㄱ. EC2명령어
- 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 service codedeploy-agent status
4. AWS S3 생성
ㄱ. 버킷 생성
- 버킷 > 버킷 만들기
- 버킷 이름 설정
- ACL 비활성화됨
- 엑세스, 버킷 버전, 암호화 비활성화
- 버킷 생성
5. AWS CodeDeploy 생성
ㄱ. 역할 생성
- 역할 > 역할 만들기
- AWS 서비스
- 사용사례 > CodeDeploy 검색해서 찾기
- 역할 이름 설정
ㄴ. CodeDeploy 애플리케이션 생성
- 배포>애플리케이션>애플리케이션 생성
- EC2/온프레미스 선택 생성
ㄷ. CodeDeploy 애플리케이션 생성
- 배포>애플리케이션>배포그룹생성
- 배포그룹이름 입력
- 서비스 역할에서 아까 생성한 IAM 역할 선택
- 배포 유형은 현재 위치
- Amazon EC2 인스턴스 선택
- 아까 생성한 EC2 인스턴스 태크를 선택
- 배포 설정은 CodeDeploydefault.AllAtOnce
- 로드 밸런싱은 비활성화
- 생성완료
6. IAM 사용자 추가
ㄱ. 사용자 추가
- 사용자 > 사용자 추가
- 사용자 이름 작성
- 기존 정책 직접 연결
- AWSCodeDeployFullAccess 와 AmazonS3FullAccess 설정
- 생성완료
ㄴ. 액세스 키 할당
- 방금 만든 사용자 들어가서
- 보안 자격 증명> 엑세스키> 액세스 키 만들기
- AWS 외부에서 실행되는 애플리케이션
- 액세스 키 만들기
- Access 키와 Secret키 저장
ㄷ. Github Repository에 키 저장
- github repo에서 Settings > Secrets and variables > actions
- New repository secret 클릭
- name 과 Secret은 다음과 같이 저장
- AWS_ACCESS_KEY : 받은 access key
- AWS_SECRET_ACCESS_KEY : 받은 secret key
7. Github actions
ㄱ. Github Repository에 키 저장
- github repo에서 Settings > Secrets and variables > actions
- New repository secret 클릭
- name 과 Secret은 다음과 같이 저장
- AWS_ACCESS_KEY : 받은 access key
- AWS_SECRET_ACCESS_KEY : 받은 secret key
ㄴ. 파일 들 작성
- 사진의 위치에 따라 파일 작성
- appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: scripts/stop.sh
timeout: 60
runas: ubuntu
ApplicationStart:
- location: scripts/start.sh
timeout: 60
runas: ubuntu
- stop.sh 작성
#!/usr/bin/env bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/spring-webapp.jar"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
TIME_NOW=$(date +%c)
# 현재 구동 중인 애플리케이션 pid 확인
CURRENT_PID=$(pgrep -f $JAR_FILE)
# 프로세스가 켜져 있으면 종료
if [ -z $CURRENT_PID ]; then
echo "$TIME_NOW > 현재 실행중인 애플리케이션이 없습니다" >> $DEPLOY_LOG
else
echo "$TIME_NOW > 실행중인 $CURRENT_PID 애플리케이션 종료 " >> $DEPLOY_LOG
kill -15 $CURRENT_PID
fi
- start.sh 작성
#!/usr/bin/env bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/spring-webapp.jar"
APP_LOG="$PROJECT_ROOT/application.log"
ERROR_LOG="$PROJECT_ROOT/error.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
TIME_NOW=$(date +%c)
# build 파일 복사
echo "$TIME_NOW > $JAR_FILE 파일 복사" >> $DEPLOY_LOG
cp $PROJECT_ROOT/build/libs/*.jar $JAR_FILE
# jar 파일 실행
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 > 실행된 프로세스 아이디 $CURRENT_PID 입니다." >> $DEPLOY_LOG
ㄷ. build.gradle 수정
jar {
enabled = false
}
- 위 코드 추가
ㄹ. github actions workflow 작성
- 레포에서 Actions > Simple workflow
- 아래와 같이 deploy.yml작성
- env 쪽만 알맞게 바꿔주면 된다.
name: Deploy to Amazon EC2
on:
push:
branches:
- main
# 본인이 설정한 값을 여기서 채워넣습니다.
# 리전, 버킷 이름, CodeDeploy 앱 이름, CodeDeploy 배포 그룹 이름
env:
AWS_REGION: ap-northeast-2
S3_BUCKET_NAME: 내가 만든 버킷이름
CODE_DEPLOY_APPLICATION_NAME: 코드디플로이 어플리케이션 이름
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: 코드디플로이 어플리케이션 그룹 이름
permissions:
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
# (1) 기본 체크아웃
- name: Checkout
uses: actions/checkout@v3
# (2) JDK 11 세팅
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '11'
# (3) Gradle build (Test 제외)
- name: Build with Gradle
uses: gradle/gradle-build-action@0d13054264b0bb894ded474f08ebb30921341cee
with:
arguments: clean build -x test
# (4) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
- 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: ${{ env.AWS_REGION }}
# (5) 빌드 결과물을 S3 버킷에 업로드
- name: Upload to AWS S3
run: |
aws deploy push \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--ignore-hidden-files \
--s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
--source .
# (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
--s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip
ㅁ. 배포 완료
- push 하여 변화가 있을 때 자동으로 actions을 수행해서 바꿔준다
- 중간에 서버에서 접근을 막기도 하지만 1분내로 끝나며 바뀐 결과를 볼 수 있다.
12. 참고
1) : CICD 따라하기 : https://bcp0109.tistory.com/363