0. 목표 및 구조
1. React & Spring Boot
2. AWS S3/EC2
3. 배포 자동화 - Github Actions & AWS CodeDeploy
4. 정리
3. 배포 자동화 - Github Actions & AWS CodeDeploy
AWS 공식 문서 한글화가 정말 잘되어있다. 웬만한 내용은 공식 문서에서 쉽게 찾아볼 수 있다.
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html
AWS EC2 설정부터 배포 자동화까지의 전체적인 흐름은 이 분의 포스트를 참고했다. 감사합니다.
Github Actions
특징
- 테스트, 빌드, 배포를 자동화 할 수 있는 CI/CD 플랫폼
- Git Repository에서 event가 발생했을 때/스케쥴 설정했을 때/수동으로 workflow가 trigger되는 작동 방식
- 이 workflow에 작업할 내용을 설정하면 된다
- 기본적으로 workflow는 Github에서 제공하는 가상 서버에서 돌아감
https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions
Github Actions Secrets - Configure AWS Credentials
Github Actions 배포 자동화 튜토리얼을 보다보면 workflow에 이 내용이 꼭 등장한다. 왜 쓰는 걸까?
- 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: ${{ secrets.AWS_REGION }}
Github Actions marketplace에서는 다양한 플러그인을 제공한다.
이 플로그인은 Github Secrets를 사용하여 AWS 환경 변수를 설정하는 기능이다.
workflow 스크립트 uses: 에 써져있는 게 이거다.
이전에 AWS IAM에서 발급 받은 Access key, Secret acces key를 이용하여 AWS CLI, AWS API 요청할 수 있다.
이 정보는 악용될 수 있기 때문에 보안에 신경 써야한다. 즉, 현재 프로젝트의 경우 정보가 Github에 그대로 노출되면 안된다.
Github Actions에 Secrets에 Access key, Secret acces key를 저장하고 위 플러그인을 사용하여 코드에는 변수로 표현한다.
Github Actions Secrets - DB 접속 정보 관리
스프링부트 profile 분리 공부 중이었다.
보통 보안을 위해 프로젝트 내부에는 운영 환경 정보를 포함시키지 않고 서버에서 외부에 파일을 생성하여 관리하는 것 같다. 그리고 jar 실행 시 -Dspring.config.location을 사용해 절대 경로를 잡아준다.
근데 위 플러그인을 보고 그럼 운영 DB 접속 정보도 Secrets으로 관리할 수 있지 않나? 생각이 들었다.
외부에 생성한 파일의 경로를 파악하지 않아도 되고 Git에는 업로드되지 않지만 빌드할 때 값을 사용할 수도 있다.
Variable Substitution라는 플러그인이 있다!
https://github.com/marketplace/actions/variable-substitution
Secrets에 DB 접속 정보를 저장 -> workflow에서 플러그인을 사용하여 변수 처리 -> build 시 real-db.yml에 DB 접속 정보가 주입됨
- name: Set yml variable
uses: microsoft/variable-substitution@v1
with:
files: './src/main/resources/real-db.yml'
env:
spring.datasource.url: ${{ secrets.URL }}
spring.datasource.username: ${{ secrets.USERNAME }}
spring.datasource.password: ${{ secrets.PASSWORD }}
고려할 점
Git에는 노출되지 않지만 S3에 빌드된 파일이 저장된다. Git에서 S3으로, S3에서 EC2로 전송될 때 위험하진 않을까?
AWS에 보안 책임을 넘겼으니 편하긴 하지만 그만큼 내가 AWS 보안 설정을 확실히 해야 한다.
버킷의 모든 퍼블릭 액세스를 차단하고 IAM 사용자 및 역할에 따른 접근만 가능하게 설정했다.
AWS CodeDeploy
특징
- 자동 배포 서비스
- 배포 중지 및 롤백
- 동시 배포 가능
- AppSpec이라는 배포 명세 파일에 설정 추가하면 됨
https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-structure.html
CodeDeploy 배포 과정
0. 배포할 파일에는 반드시 AppSpec 파일이 root 디렉토리에 프로젝트와 함께 포함되어야 한다.
1. CodeDeploy는 미리 설정해준 *저장소에서 번들링된 배포 파일을 인스턴스로 복사
2. 배포 파일 번들링 해제
3. AppSpec에 적혀진 경로에 파일을 복사
4. 배포 스크립트 실행
*CodeDeploy는 현재 AWS S3, Github, BitBucket만 저장소로 지원
에러
The deployment failed because no instances were found for your deployment group.
Check your deployment group settings to make sure the tags for your EC2 instances or Auto Scaling groups correctly identify the instances you want to deploy to, and then try again.
code deploy 배포 그룹 편집 > 배포 유형 > 태그 일치 1이 나오는지 확인한다.
태그를 [ Name / 인스턴스명 ] 으로 했더니 태그 일치가 0이었다.
[ name / 인스턴스명 ] 으로 재설정해주니까 해결되었다.
CodeDeploy 배포 로그 위치
/opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log
'Project' 카테고리의 다른 글
커피 주문 서비스를 객체 지향으로 설계해보기 with Java (0) | 2022.10.19 |
---|---|
4. AWS + Spring Boot + React 프로젝트 근데 이제 배포 자동화를 곁들인 (0) | 2022.03.27 |
2. AWS + Spring Boot + React 프로젝트 근데 이제 배포 자동화를 곁들인 (0) | 2022.03.24 |
1. AWS + Spring Boot + React 프로젝트 근데 이제 배포 자동화를 곁들인 (0) | 2022.03.23 |
0. AWS + Spring Boot + React 프로젝트 근데 이제 배포 자동화를 곁들인 (0) | 2022.03.23 |