코딩기록
9. Github Action을 통한 최종 배포 진행 본문
지난번 단계에서 RDS, 엘라스틱빈스톡 환경을 구축했다. 이번에 Github Action을 통한 최종 배포를 진행한다.
Github Action은 테스트, 배포, 필요한 스크립트 실행 등을 진행하여 ci/cd를 자동화 해주는 Github의 서비스이다.
Github Action에게 일을 시키기 위해, Spring 프로젝트에 deploy.yml / 00-makeFiles.config / Procfile 3개의 파일을 적절한 경로에 만들어 주어야 한다.
deploy.yml
.github/workflows/*.yml 파일에 배포에 필요한 액션이 작성되는 스크립트이다.
제공되는 라이브러리 활용이 가능하다.
name: lessonReserve
on:
push:
branches:
- prod
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout # 깃허브의 코드 저장소에 올려둔 코드를 CI 서버로 내려받은 후에 특정 브랜치로 전환하는 행위
uses: actions/checkout@v3 # 라이브러리 사용
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 17
distribution: zulu
- name: Permission
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew clean build
- name: Get current time # 한국시간으로 시간 변경
uses: 1466587594/get-current-time@v2
id: current-time # current-time을 아래에서 사용할 수 있도록 id 지정
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Show Current time
run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"
- name: Generate deployment package
run: | # | 여러가지 명령어를 적을 수 있음
mkdir deploy
cp build/libs/*.jar deploy/application.jar
cp Procfile deploy/Procfile
cp -r .ebextensions deploy/.ebextensions
cd deploy && zip -r deploy.zip .
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v21
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY }} #환경변수
aws_secret_key: ${{ secrets.AWS_SECRET_KEY }} #환경변수
application_name: lessonReserve # 엘리스틱 빈스톡 애플리케이션 이름
environment_name: lessonReserve-env # 엘리스틱 빈스톡 환경 이름
version_label: lessonReserve-${{steps.current-time.outputs.formattedTime}} # 버전 시간
region: ap-northeast-2
deployment_package: deploy/deploy.zip # Generate deployment package에서 압축한 deploy.zip 파일을 배포하겠다.
00-makeFiles.config 및 Procfile의 사용순서 및 용도
<원래 엘라스틱빈스톡에 사용자가 jar 파일 직접 업로드 할 시 절차>
1. lessonReserve-0.0.1-SNAPSHOT.jar 을 업로드
2. 엘라스틱빈스톡에서 위 jar 파일을 var/app/current/applicatione.jar 로 수정해서 업로드
3. procfile 만들어 내서 실행
<Github Action을 통해 엘라스틱빈스톡에 배포하는 절차>
1. 00-makeFiles.config -> /sbin/appstart 라는 파일을 가장 먼저 만들어 냄 / 해당 파일은 jar 파일을 실행하는 스크립트
(참고, 리눅스 bin 폴더, sbin 폴더 내부의 파일은 -> 어느 폴더에서든지 실행할 수 있다.)
2. procfile 파일 실행 (= appstart를 실행시키는 스크립트) (appstart = /var/app/current/application.jar 실행하는 스크립트)
00-makeFiles.config
files:
"/sbin/appstart": 이 파일을 만들어 낸다
mode: "000755" 755권한 (4 2 1)
owner: webapp
group: webapp
content: |
#!/usr/bin/env bash
JAR_PATH=/var/app/current/application.jar // 해당 경로는 엘라스틱빈스톡에 zip 파일을 배포하면 jar 파일이 생성되는 경로
# run app
java -Dspring.profiles.active=prod -Dfile.encoding=UTF-8 -jar $JAR_PATH // nohup을 안쓰는 이유? 도커로 실행되기 때문
Procfile
springapp: appstart // appstart 파일을 실행한다.
IAM 생성
: Github Action이 aws s3에 접근하기 위한 권한
사용자 생성
직접 정책 연결 : AdministratorAccess-AWSElasticBeanstalk 추가
액세스키 생성 (설명 태그 값: metacoding)
AWS_ACCESS_KEY: AKIARD6RABEEJZLK4R6S
AWS_SECRET_KEY: 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
위 코드는 실제로는 노출되면 안된다!
따라서 아래 경로의 깃허브 환경변수에 해당 코드를 설정하고, deploy.yml에 ${{ secrets.AWS_ACCESS_KEY }}와 같이 작성하는 것이다.
깃허브 aws-v5- Settings - Secrets and variables - Actions - New repository secret 에 AWS_ACCESS_KEY, AWS_SECRET_KEY 설정
RDS에 한글로 데이터 저장이 안되는 문제 해결
적용하는 파라미터의 character_set ~~ 모든 항목의 값을 utf8mb4로 지정 필요
그후 RDS 재부팅
/var/app/currrent/procfile 파일 및 /var/log/springapp.stdout.log 파일 확인해 보았으나 특이사항 없다.
진짜 이유는 Book 테이블이 utf8 반영되기 전에 만들어졌다. 테이블은 utf8 설정한 후에 만들어야 함
-> 테이블 삭제 후 다시 만들기 필요
nlb (고정 IP를 할당하기 위해 필요)
로드밸런서 생성 -> Network Load Balancer 생성
ec2가서 탄력적 ip 발급
네트워크 매핑 p-northeast-2a (apne2-az1) , ipv4 주소는 탄력적 ip로 설정
리스너 및 라우팅 -> 대상그룹생성
-> Application Load Balancer 체크
이름 aws-v5-alb
최종 배포 완료.
'인프라 > 리눅스, AWS' 카테고리의 다른 글
AWS SQS @SqsListener 작동 안함 원인파악 (Spring cloud AWS 3버전 관련) (0) | 2024.04.04 |
---|---|
5. EC2 우분투 최초 배포 or 지속적 배포 자동 프로세스 스크립트 최종 구축 (0) | 2024.01.27 |
8. GithubAction, 로드밸런서를 통한 최종 배포 환경설정 (1) | 2023.12.31 |
7. CI/CD의 개념 / AWS 로드밸런서 및 IAM의 이해 (0) | 2023.12.31 |
6. AWS 엘라스틱빈스톡 사용해보기 (0) | 2023.12.28 |