IAM
IAM(Identity and Access Management)
: 외부에서 AWS 리소스에 대한 액세스 권한을 안전하게 제어하는 서비스
- 예시
- Github Actions에서 S3에 접근할 때.
- NodeJS에서 S3에 이미지 업로드하기 위해서 S3에 접근할 때
1. IAM 사용자 생성하기
Github Actions에서 S3에 업로드하고 CloudFront의 캐시를 무효화하기 위해서 IAM 사용자를 사용하여 접근해보겠습니다.
- IAM - 사용자 메뉴 - 사용자 생성
- 사용자 이름 입력
- 직접 정책 연결 체크 후
AmazonS3FullAccess
와CloudFrontFullAccess
체크.
Github Actions에서 S3와 CloudFront에 접근할 것이기에 위에 2개를 체크해줬다.
- 검토 후 사용자 생성
- 생성된 사용자 이름 클릭
- 보안 자격 증명 탭 - 액세스 키 만들기
: 외부에서 사용할 수 있게 액세스 키를 생성한다.
- 사용 사례 - 서드 파티 (깃헙 등)
- 설명 태그 설정 - 설정하고 - 액세스 키 만들기
- 액세스 키 생성됨
🚨 이 페이지에서 바로 나가지 말고 깃헙 secrets에 등록하기
페이지를 나가면 다시 액세스 키를 보거나 다운받을 수 없습니다!
이 키는 절대 외부로 유출하면 안되기 때문에 Github Secret에 등록하여 깃헙에 올라가지 않게 합니다.
- ✅[필수] 깃헙 레포 - Settings > Actions > New ~ secret 해서 등록하기
2. Github Actions CI/CD 작성
jobs 진행 과정
- NodeJS 세팅
- yarn install
- build 하기
- AWS 인증 정보 설정
- AWS S3에 배포하기
- AWS CloudFront 캐시 무효화
name: CI-CD-biblical-web
on:
push:
branches:
- master
paths:
- 'apps/web/**'
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x]
steps:
- uses: actions/checkout@v3
- name: ⎔ Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: ⎔ Monorepo install
uses: ./.github/actions/yarn-install
- name: ⎔ Build web
working-directory: apps/web
env:
API_URL: ${{ secrets.API_URL}}
USER_IMG_FIELD: ${{ secrets.USER_IMG_FIELD}}
CLIENT_URL: ${{ secrets.CLIENT_URL}}
run: |
yarn build
- name: ⎔ Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ap-northeast-2
- name: ⎔ Deploy to AWS S3
run: |
aws s3 sync --delete --region ap-northeast-2 apps/web/dist s3://S3버킷명
- name: ⎔ Invalidate AWS CloudFront Cache
run: |
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_DISTRIBUTION_ID }} --paths "/*"
AWS S3에 배포하기
aws s3 sync --delete --region ap-northeast-2 apps/web/dist s3://버킷명
- sync : S3 버킷과 로컬폴더 간 동기화하기
- --delete : 로컬에서 삭제된 파일은 S3 버킷에서도 삭제된다
- --region ap-northeast-2 : 리전을 서울로 지정
- apps/web/dist : 빌드폴더 경로
AWS CloudFront 캐시 무효화
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_DISTRIBUTION_ID }} --paths "/*"
- --paths "/*" : 모든 파일에 대한 캐시 무효화
- 캐시 무효화하는 이유
: CloudFront의 캐시 정책을CachingOptimized
로 선택한 경우,
캐시 유지시간이 기본 TTL 24시간으로 설정되어 있다. 따라서 S3 버킷을 재업로드 후 변경된 사항을 배포된 cloudfront에서 바로 확인하고 싶다면 캐시 무효화를 해줘야 한다. - 참고로 캐시 객체 무효화는 매월 1000개 경로까지 무료이고 그 이상부터 경로당 0.005 USD 비용이 발생한다. (CloudFront 비용)