이전 포스트(https://sikk.tistory.com/276 React App을 S3와 CloudFront를 이용한 배포)를 이어 Github Action을 이용하여 배포자동화 하는것을 기록하려고 한다.
AWS - S3, CloudFront를 통한 React 배포
CloudeFront란? CloudeFront란 AWS에서 제공하는 글로벌 콘텐츠 전송 네트워크(CDN) 서비스입니다. CloudFront는 사용자에게 콘텐츠를 더 빠르게 제공하기 위해 전 세계에 분산된 서버(에지 로케이션) 네트
sikk.tistory.com
IAM 사용자 생성
IAM -> 사용자 -> "사용자 생성" 버튼 클릭

"직접 정책 연결" 선택 후 AmazonS3FullAccess, CloudFrontFullAccess 추가 -> "다음" 버튼 클릭

"사용자 생성" 버튼 클릭

IAM -> 사용자 -> 방금 만든 사용자 클릭 -> "엑세스 키 만들기" 클릭

"Command Line Interface(CLI)"를 선택한 뒤, 아래 권장 사항 이해 부분을 체크해줍니다. 이후 작성할 yml 파일의 코드를 보면 AWS CLI를 사용해서 S3, CloudFront에 접근하기 때문입니다.

설명 태그 작성 - 생략가능 -> "엑세스 키 만들기" 버튼 클릭

액세스 키와 비밀 액세스 키는 나중에 쓰이므로 따로 메모장 같은곳에 기록해두어야한다.

Github Secret 세팅
프로젝트 repo에 Settings - Security - Secrets and variables - Actions로 들어가서 New repository secret을 누릅니다.

아래 4개의 키를 등록해줍니다.
AWS_CLOUDFRONT_ID: cloudfront id
AWS_S3_ACCESS_KEY_ID: aws iam에서 발급받은 엑세스 키
AWS_S3_BUCKET_NAME: aws s3 버킷 이름
AWS_S3_SEcret_ACCESS_KEY_ID: aws iam에서 발급받은 비밀 엑세스 키

.yml 파일 생성 및 작성
프로젝트의 루트에 .github이라는 폴더를 생성하고, 그 안에 workflows라는 폴더를 추가로 생성합니다.
그안에 prod-ci.yml 파일을 만들어줍니다. (파일명은 자유)

prod-ci.yml 파일 내용 채우기
name: MAIN CI
on:
# trigger가 되길 바라는 action을 입력합니다. push / pull_request가 있습니다.
# 저는 main 브랜치에 push가 되면 actions을 실행하도록 설정했습니다.
push:
branches:
- main
tags:
- "production-**"
jobs:
Deploy:
# runner가 실행될 환경을 지정합니다.
runs-on: ubuntu-latest
# name은 단계별로 실행되는 액션들의 설명을 담은 것으로, 나중에 github action에서 workflow에 표시됩니다.
# uses 키워드로 Action을 불러올 수 있습니다.
steps:
# 1 - 소스코드 복사
- name: Checkout source code
uses: actions/checkout@v3
# 2 - node_modules 캐싱
# workflow가 실행될 때 필요한 파일 중에서 거의 바뀌지 않는 파일들을 GitHub의 캐시에 올려놓고 CI 서버로 내려받습니다.
# 프로젝트에서 자주 바뀌지 않는 수많은 패키지를 매번 다운받아 올리면 시간도 오래걸리고 네트워크 대역폭을 많이 사용하게됩니다.
- name: Cache node modules
# **uses** 키워드는 GitHub Actions 마켓플레이스에서 제공하는 액션을 사용하겠다는 것을 나타냅니다.
# 여기서는 **actions/cache@v3**라는 액션을 사용하며, 이는 파일이나 디렉토리를 캐싱하는 데 사용되고 있습니다.
uses: actions/cache@v3
# **with** 키워드는 사용할 액션에 전달할 **입력값**들을 지정합니다.
with:
# **path** 키워드는 캐싱할 파일 또는 디렉토리의 경로를 지정합니다.
path: ~/.npm
# **key**는 캐시의 고유 식별자를 설정합니다. 이 식별자는 캐시를 생성하고 검색하는 데 사용됩니다.
# **{{ runner.OS }}**는 실행 중인 러너의 운영 체제를 나타냅니다.
# **hashFiles('**/package-lock.json')**는 **package-lock.json** 파일의 해시값을 계산하여,
# 의존성이 변경될 때마다 새로운 캐시를 생성하도록 합니다.
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
# **restore-keys**는 캐시 키가 정확히 일치하지 않을 경우 사용할 대체 키를 제공합니다.
# 이는 가장 최근에 일치하는 캐시를 검색하는 데 사용됩니다.
# ** {{ runner.OS }}-node- **와 일치하는 최신 캐시를 찾는 데 사용되는 대체 키입니다.
restore-keys: |
${{ runner.os }}-node-
# 3 - 의존성 패키지 설치
- name: Install Dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: npm install
# 4 - 빌드
- name: Build
run: npm run build
# 5 - AWS 인증
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_S3_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_S3_SECRET_ACCESS_KEY_ID }}
aws-region: ap-northeast-2
# 6 - AWS S3에 빌드 결과물 배포
## CRA로 생성한 React App은 build 폴더에 빌드 결과물이 들어있습니다. (dist 폴더가 아님!)
- name: Deploy to S3
run: aws s3 sync ./dist s3://${{ secrets.AWS_S3_BUCKET_NAME }} --delete
# 7 - CloudFront 캐시 무효화
- name: Invalidate CloudFront Cache
run: aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_CLOUDFRONT_ID }} --paths "/*"
잘 적용되었는지 확인하기
prod-ci.yml을 보면 저는 main 브랜치에 푸시를 하면 github action이 작동하도록 설정했습니다. main브랜치에 push를 하고 repo Actions 탭에서 성공 여부를 확인할 수 있습니다.
'study > Deploy' 카테고리의 다른 글
AWS - S3, CloudFront를 통한 React 배포 (0) | 2024.04.15 |
---|