AWS ec2서비스를 활용하여 spring배포, Route 53 서비스를 통한 DNS 서버 연동, 깃허브 액션을 통한 ci, cd 구축
전체 아키텍쳐
사용 기술
AWS ec2, GitHub Action, Spring, AWS Code Deploy
1. ec2 인스턴스 생성
2. 인스턴스에 JRE설치 및 CodeDeploy Agent 설치
ubuntu@ip-172-31-34-244:~$ sudo apt update
ubuntu@ip-172-31-34-244:~$ sudo apt install openjdk-17-jre-headless
ubuntu@ip-172-31-34-244:~$ java -version
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment (build 17.0.6+10-Ubuntu-0ubuntu120.04.1)
OpenJDK 64-Bit Server VM (build 17.0.6+10-Ubuntu-0ubuntu120.04.1, mixed mode, sharing)
자신의 프로젝트에 맞는 자바 버전 설치
ubuntu@ip-172-31-34-244:~$ sudo apt install ruby-full
ubuntu@ip-172-31-34-244:~$ sudo apt install wget
ubuntu@ip-172-31-34-244:~$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
ubuntu@ip-172-31-34-244:~$ chmod +x ./install
ubuntu@ip-172-31-34-244:~$ sudo ./install auto
ubuntu@ip-172-31-34-244:~$ sudo service codedeploy-agent status
ubuntu@ip-172-31-34-244:~$ sudo service codedeploy-agent status
● codedeploy-agent.service - LSB: AWS CodeDeploy Host Agent
Loaded: loaded (/etc/init.d/codedeploy-agent; generated)
Active: active (running) since Fri 2023-07-09 01:19:51 UTC; 1min 1s ago ⇐ 정상적으로 동작되는 것을 확인
Docs: man:systemd-sysv-generator(8)
Tasks: 2 (limit: 1141)
Memory: 59.7M
CGroup: /system.slice/codedeploy-agent.service
├─6234 codedeploy-agent: master 6234
└─6236 codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of ma>
Mar 31 01:19:50 ip-172-31-34-244 systemd[1]: Starting LSB: AWS CodeDeploy Host Agent...
Mar 31 01:19:51 ip-172-31-34-244 codedeploy-agent[6224]: Starting codedeploy-agent:
Mar 31 01:19:51 ip-172-31-34-244 systemd[1]: Started LSB: AWS CodeDeploy Host Agent.
코드 디플로이 설치 및 설치 확인
3. ec2에서 s3 버킷에 저장된 코드를 가져올 수 있게 권한 부여
사용할 ec2 연결
CodeDeploy Agent 재시작
ubuntu@ip-172-31-34-244:/opt/codedeploy-agent$ sudo service codedeploy-agent restart
ubuntu@ip-172-31-34-244:/opt/codedeploy-agent$ sudo service codedeploy-agent status
4. S3 버킷을 생성
5. CodeDeploy 애플리케이션 및 배포 그룹을 생성
6.Github Actions 설정
AmazonS3 FullAccess 및 AWSCodeDeployRole 추가
액세스키 추가
생성된 액세스 키 값과 비밀 액세스 키 값 저장
깃허브 설정 => Actions에 New repository secret
엑세스 키 값 추가
비밀 엑세스 키 값 추가
7.Github Actions 워크플로우를 작성
. github/workflows/deploy.yml 파일 작성
on:
push:
branches: [ "githubaction" ] <= 자신의 브런치로 설정
env:
AWS_REGION: ap-northeast-2
S3_BUCKET_NAME: sihyun-webserver <= 자신의 S3버킷으로 이름 변경
name: Deploy to Amazon EC2
on:
push:
branches: [ "githubaction" ]
env:
AWS_REGION: ap-northeast-2
S3_BUCKET_NAME: sihyun-cicd-bucket
CODE_DEPLOY_APPLICATION_NAME: my-codedeploy-app
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: my-codedeploy-deployment-group
permissions:
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
cache: 'gradle'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with gradle
run: ./gradlew build --no-daemon -x test
- 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 }}
- name: Upload to AWS S3
run: |
aws deploy push \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--ignore-hidden-files \
--s3-location s3://${{env.S3_BUCKET_NAME}}/$GITHUB_SHA.zip \
--source .
- 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
8.scripts 작성
scripts/start.sh
#!/usr/bin/env bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/bridge-0.0.1-SNAPSHOT.jar"
APP_LOG="$PROJECT_ROOT/application.log"
ERROR_LOG="$PROJECT_ROOT/error.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
TIME_NOW=$(date +%c)
echo "$TIME_NOW : copy $JAR_FILE" >> $DEPLOY_LOG
cp $PROJECT_ROOT/build/libs/*.jar $PROJECT_ROOT
echo "$TIME_NOW : run $JAR_FILE" >> $DEPLOY_LOG
chmod 111 JAR_FILE
nohup java -jar $JAR_FILE > $APP_LOG 2> $ERROR_LOG &
CURRENT_PID=$(pgrep -f $JAR_FILE)
echo "$TIME_NOW : process id is $CURRENT_PID" >> $DEPLOY_LOG
scripts/stop.sh
#!/usr/bin/env bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/bridge-0.0.1-SNAPSHOT.jar"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
TIME_NOW=$(date +%c)
CURRENT_PID=$(pgrep -f $JAR_FILE)
if [ -z $CURRENT_PID ]; then
echo "$TIME_NOW : no process" >> $DEPLOY_LOG
else
echo "$TIME_NOW : stop PID $CURRENT_PID" >> $DEPLOY_LOG
kill -15 $CURRENT_PID
fi
9. 배포 결과 확인
10. Route53 연동
'인프라 > AWS' 카테고리의 다른 글
다른 IAM 계정에서 EKS-Cluster 조작 방법 (0) | 2023.09.12 |
---|---|
AWS NAT Gateway, NAT Instance (0) | 2023.09.12 |
AWS - EKS 실습 (0) | 2023.09.12 |
AWS Manage Console로 eks 만들었지만 Error from server (NotFound): configmaps "aws-auth" not found 뜨는 경우 (0) | 2023.09.08 |
GitHub Action을 통한 AWS s3 서버리스 정적 웹페이지 ci/cd 구축 및 React 배포 (0) | 2023.06.08 |