-
[AWS] FrontEnd 배포 실습 (S3 + CloudFront)네트워크/AWS 2024. 5. 8. 18:15
개요
1. AWS IAM 설정
2. S3 생성 및 설정
3. CloudFront 설정
4. Github Action으로 CI / CD 구축✅ AWS IAM 설정
📦 IAM(Identity and Access Management)이란?
AWS리소스에 대한 엑세스를 안전하게 제어할 수 있는 웹 서비스로 AWS 계정을 최초로 생성할 때 만들어지는 루트 사용자는 모든 엑세스 권한을 가지기에 보안에 주의해서 사용해야하므로 IAM을 통해 리소스를 사용할 수 있는 인증 및 권한 부여된 대상을 제어한다.
- 리소스에 대해 여러 사람에게 다양한 권한을 부여할 수 있다.
- 사용자에게 직접 정책을 설정할 수도 있지만 그룹에 대해서도 부여할 수 있다.
📦 IAM 사용자 추가하기
- AWS > IAM > 사용자 생성 > 1 ~3단계 수행 > 생성
- S3FullAccess, CloudFrontFullAccess 두개의 권한 옵션을 설정해준다.
- IAM을 통해 발급 받는 access key는 추후에 자주 사용되므로 꼭 발급 받자
- 이때 그룹은 권합 옵션을 공유해주는 집단이므로 프로젝트 팀명으로 구분이 쉽게 하였다.
✅ S3 생성 및 설정
📦 S3(Simple Storage Service)란?
인터넷 스토리지 서비스로 데이터를 객체 형태로 저장하는 파일 저장 서비스이며, 주로 이미지, 동영상 파일 저장을 위해 사용된다.
- SSL을 통해 데이터를 전송 및 암호화하여 높은 내구성과 보안성을 가지고 있다.
- EC2보다 이미지, 영상을 저장할 때 비용이 저렴하다.
- 파일 저장에 최적화 되어 업로드 / 다운로드 속도가 빠르고 정적 웹페이지의 경우 성능을 높이고 비용을 절감할 수 있다.
- 저장 용량이 크다.
📦 S3 버킷 생성
- AWS > S3 > 버킷만들기 > 생성
- ACL 활성화 여부는 외부 노출을 원천 봉쇄하기 위함
- 버킷에 대한 접근을 CloudFront에서 할 것이기에 퍼블릭 엑세스 차단
- 버킷 버전에 대한 관리 필요성이 없기에 비활성화
📦 S3 버킷 설정
- AWS > S3 > [버킷 네임] > 속성
- 정적 웹 사이트 호스팅을 활성화하여 S3 버킷을 웹사이트로 이용할 수 있게끔 할 수 있다. 이는 S3 버킷에 저장된 파일을 웹 브라우저에서 직접 엑세스할 수 있게 해주기 때문이다.
- 설정을 완료하면 버킷 웹 사이트 엔드포인트가 부여가 되지만 정책 설정 및 프로젝트를 올리지 않았기에 접속시 403Error가 발생한다
- AWS > S3 > [버킷 네임] > 권한
- 버킷 정책 설정을 하기 위해서는 기존에 퍼블릭 엑세스 차단을 비활성화로 바꾼 뒤 진행하면 된다.
- 버킷 정책은 버킷을 사용할 권한을 가진 여러 명의 사용자 별로 각각의 행위에 대한 권한 범위를 설정하는 것이다. 이를 통해 읽기, 쓰기 등 행동에 대한 제한을 가할 수도 있고 허용할 수도 있다.
- 정책 생성기를 통해 간편하게 정책을 생성할 수 있으며 아래와 같은 방식으로 정책을 생성해보자.
🎉 정책 생성
더보기정책 생성기
4가지를 설정하면 된다
- Select Type of Policy에서 S3 Bucket Policy를 선택한다.
- Effect는 Allow 설정
- Principa은 * 설정
- Action은 GetObjcet 설정
- Amazon Resorce Name에 복사해놓은 ARN에 끝에 /*를 붙인다.
- 이 정책 문서는 IAM의 정책으로 사용되어 특정 사용자 또는 그룹, 리소스가 S3 버킷에 대한 어떤 작업을 수행할 수 있는지를 제어하고 일반적으로 다음과 같은 내용을 포함한다.
- 어떤 작업이 허용되는지 (GetObject ...)
- 어떤 리소스에 대한 엑세스가 허용되는지 (특정 버킷, 버킷의 모든 객체 ...)
- 엑세스를 요청할 수 있는 조건 (IP 주소, IAM 역할 ...)
이 정책은 S3 버킷 자체에 직접 연결되지 않고 IAM 사용자, 그룹 또는 역할에 연결되어 AWS의 엑세스 제어 매커니즘을 통해 사용자의 권한을 관리하고 제어할 수 있다.
📦 AWS CLI를 통한 S3 버킷에 프로젝트 업로드 🔗
- Install
- 가이드 내용에 따라 설치 후 aws에 대한 설치 상태를 확인
- User setting (CLI)
aws configure --profile [IAM 사용자 이름]
Key ID : IAM 사용자 추가할 때 다운받았던 CSV 파일의 Access key ID
Access Key : IAM 사용자 추가할 때 다운받았던 CSV 파일의 Secret access key
region name : ap-northeast-2output
format : json- Uploading
// package.json { ... "script": { ... "deploy": "aws s3 sync ./dist s3://[S3 버킷 이름] --profile=[IAM 사용자 이름]" } } // ./dist는 vite를 사용해서 그런거고 CRA를 이용했다면 ./build로 나올 것임
✅ CloudFront에 배포하기
📦 CloudFront의 이점?
- 성능
정적 리소스에 대해 캐시를 사용하여 데이터를 관리할 수 있으며 캐시를 짧게 하거나 날리는 등 적절하게 설정한다면 성능상 많은 개선을 할 수 있다. - 보안
CloudFront만을 통해서 유저가 S3로 접근할 수 있어 보안을 높일 수 있다(public Access를 비활성화할 수 있다.) - 글로벌 서비스
CloudFront는 생성한 region에 속하지 않고 엣지 로케이션이라는 캐싱 서버에 캐싱되기에 전 세계 사용자들에게 빠르게 응답할 수 있다.
📦 CloudFront 배포 생성
- AWS > CloudFront > 배포 > 생성
- Origin domain에 대해 S3 버킷을 선택한 뒤 버킷을 CloudFront에서만 접근할 수 있게 하기위해 원본 엑세스 설정 후 OAC를 생성하자
- Origin Shield를 활성화함으로 엣지 로케이션에서 가져오는 콘텐츠의 요청을 최적화할 수 있다.
🎉 Origin Shield
더보기Origin Shield의 유무
여러 지역에 엣지 로케이션이 존재하고 요청하는 객체를 캐시에 가지고 있지 않을 때에는 각 엣지 로케이션이 동시에 Origin으로 요청을해서 S3 버킷에 대해 과부화가 일어날 수 있다. 이때 Origin Shield가 있다면 요청은 Shield로 가게되고 Origin Shield가 S3 버킷에서 객체를 가져오게 된다. 모든 엣지 로케이션은 Shield로 요청을 하므로 S3에 대한 부하를 줄일 수 있고 이를 통해 전번적인 성능과 신뢰성을 향상시킬 수 있다.- 기본 캐시 동작은 뷰어 프로토콜 정책만 변경 후 나머지는 기본값으로 사용한다.
- WAF는 악의적인 HTTP/S 트래픽을 필터링, 모니터링 및 타단하여 웹 앱을 보호하고, 승인되지 않은 데이터가 앱에서 나가는 것을 방지하지만 비용이 청구되는 옵션이기에 비활성화
- 배포 완료 후 사용자 정의 오류 응답편집을 설정하여 마무리를 하면 된다.
- 이후 CloudFront의 배포 도메인을 통해서 접근할 수 있다.
✅ Github Action으로 CI / CD 구축
📦 CI / CD(Continuous Integration / Continuous Deployment)란?
지속적 통합은 개발 팀이 코드를 지속적으로 통합하고 이를 자동으로 테스트하여 버그를 최소화하는 프로세스이다. 코드 변경 시(push)에 자동으로 빌드 및 테스트를 진행하여 프로덕트 품질 관리 및 버그 발견이 빨라질 수 있으며, 지속적 배포를 통해 새로운 기능을 사용자에게 빠르게 전달하고 구축 시간을 단축시킬 수 있습니다.
- github aciton뿐만아니라 Jenkins, Travis... 여러 CI / CD 툴이 존재한다.
- 위와 같은 도구를 통해서 배포에 대한 파이프라인을 설정한다.
- 파이프라인 구축을 통해 불필요한 비용도 줄이고, 개발에만 집중할 수 있는 환경을 조성할 수 있다.
📦 .github/workflows/cicd.yaml 만들기
name: front-dev-deploy on: push: branches: main jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout source code uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v3 - name: Install Dependencies run: pnpm - name: Build run: pnpm run build - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-northeast-2 - name: S3 Deploy run: aws s3 sync ./dist s3://${{ secrets.AWS_S3_BUCKET }} --acl bucket-owner-full-control - name: Invalidate CloudFront Cache run: aws cloudfront create-invalidation --distribution-id ${{secrets.CLOUD_FRONT_ID}} --paths "/*"
📦 secret 설정하기 🔗
Build 및 Deploy 환경에 사용될 환경 변수를 등록하는 것으로 각 환경변수가 무슨 값인지 헷갈리지 않도록 주의해야한다.
📌 Reference
'네트워크 > AWS' 카테고리의 다른 글
[AWS] EC2란? (0) 2024.03.08 [SSL 발급] 대체 도메인 설정 및 서브 도메인 등록 (1) 2023.11.20 [AWS] AWS용어 및 CloudFront, S3, 배포 (0) 2023.10.24