CloudFront
- 정적, 동적 실시간 웹사이트 컨텐츠를 유저들에게 전달
- Edge Location을 사용
- Content Delivery Network(CDN)
- 웹페이지를 요청하는 클라이언트들의 지역에 근거하여 컨텐츠 웹 페이지에 딜리버리 해주는 분산 네트워크이다.
- 분산 네트워크(Distributed Network)
CloudFront 용어 정리
- Edge Location(엣지 지역) : 컨텐츠들이 캐시(Cache)에 보관되어지는 장소
- Origin(오리진) : 원래 컨텐츠들이 들어있는 곳, 웹 서버 호스팅이 되어지는 곳, S3, EC2인스턴스가 오리진이 될 수 있음
- Distribution(분산) : CDN에서 사용되어지며 Edge Location들을 묶고 있다는 개념
실습
- S3 버킷의 객체를 CloudFront로 배포해보기
- 전 세계에서 접근 가능한 퍼블릭 S3를 생성하기 위해, 모든 퍼블릭 액세스 차단 해제
-
S3 버킷을 만들때 분명 퍼블릭으로 설정하여 만들었지만, 이상하게 객체 접근이 Access Denied가 뜬다.
-
앞서 생성한 S3 버킷을 보면 객체를 퍼블릭으로 설정할 수 있음 메세지가 있는 것을 확인할 수 있다.
-
이는 아직 퍼블릭으로 설정되지 않았다는 뜻이며 외부에서 접근할 수 없다는 것을 의미한다.
-
따라서 외부에서 해당 버킷에 접근 가능하도록 하기 위해서는 버킷 정책을 수정해야 한다.
정책 생성기
- Principal : 버킷 정책이 적용될 대상 전체(*)
- Actions : 버킷에 수행할 액션 (GetObject, PutObject)
- ARN : 버킷에 어떤 리소스에 적용할지 -> 버킷 이름 선택, 리소스 전체(*)
{
"Id": "Policy1674005307483", // 정책 ID
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1674004914180",
"Action": [ // 버킷에 수행할 액션(행동)
"s3:GetObject", // 객체 가져오기
"s3:PutObject" // 객체 업로드하기
],
"Effect": "Allow", // 정책 적용
"Resource": "arn:aws:s3:::aws-learner-cloudfront-jmw/*", // 어떤 버킷에 어떤 리소스에 적용, 버킷에 있는 모든 리소스(객체)
"Principal": "*" // 정책 적용 대상 모두
}
]
}
- 혹시나 버킷 정책을 입력하고 변경사항 저장을 할때
- Action does not apply to any resource(s) in statement 에러가 발생한다면
- 버킷 정책의 Resource에 있는 value 즉 arn값 뒤에다가 /*를 붙여주고 변경사장 저장을 클릭하시면 퍼블릭으로 변경 된다.
정책 추가 후 객체 URL로 접속해보면 업로드된 파일이 정상적으로 화면에 보여진다.
버킷 ACL
버킷 접근 제어 3가지 방법
- IAM 제어는 IAM 계정에 S3 접근 권한(policy)를 설정해 사용자 단위로 액세스를 제어하는 것
- 버킷 정책은 버킷 단위로 상세한 접근 제어를 확정하고 이후에 변경이 적을 때,
- ACL은 객체 단위로 간단하게 접근 제어할 때 사용
접근정책(ACL)은 버킷정책을 통해 사용할 수 있는 권한보다 세부적인 제어를 제공하지 않는다.
읽기 및 쓰기 엑세스 권한 이외의 세부 권한을 찾고 있는 경우 접근정책(ACL)을 통해 버킷정책(Bucket Policy)을 선택하여 구성이 가능하다.
단, 버킷정책은 파일형태로 만들어 버킷에 적용하며 이 파일은 20KB를 초과할 수 없다.
버킷 ACL 설정하기
-
버킷을 퍼블릭으로 설정했으면, 각 파일에 대해서도 퍼블릭으로 설정해주어야 한다.
-
파일을 처음 업로드할때 밑의 ACL 메뉴에서 파일에 대한 접근 권한을 설정해줄 수 있고,
- 이미 업로드된 객체일 경우, ACL을 통해 퍼블릭으로 지정
ACL 설정 후 객체 URL로 접속해보면 업로드된 파일이 정상적으로 화면에 보여진다.
CloudFront 배포
- 원본 경로 : 만약 S3 버켓 안에 여러개의 폴더가 있고, 각각의 폴더에 다른 이미지 동영상이 있다면
- 특정 폴더만을 타겟을 원한다면 원본 경로 입력
S3 버킷 액세스
- OAI (origin access identity) 를 이용하여 클라우트프론트에 오리진이 되는 S3 버킷에 대한 액세스 컨트롤 할것인지?
- 원본 액세스 제어 설정 : cloudfront에 identity를 생성해 S3버킷에 접근할 수 있게 해줌
Origin shield
- Origin으로 등록한 스토리지(S3 등)에 전달되는 리퀘스트의 횟수를 줄여 관리 비용을 줄인다고 한다. (캐시 적중률을 높힌다는 이야기)
- Yes 옵션을 선택 후, 자기 서비스 오리진의 지역에 가까운 지역을 선택해서 골라주면 설정이 끝난다.
- 자동으로 객체 압축 : CloudFront가 전송속도를 높이기 위해 오리진에서 가져온 오브젝트를 자동으로 압축 하는 기능
- Http, Https 사용
- GET 뿐만아니라 PUT, POST, PATCH, DELETE도 CloudFront로 가능
뷰어 액세스 제한
- 승인받은 유저들만 접속 가능하도록, ex.특정 웹사이트 방문하기 위해 로그인 과정
- signed url을 가지고 있는 특정 유저들만 웹사이트 컨텐츠를 볼 수 있게 해주는 URL
-
캐싱된 객체가 가지고 있는 고유 식별자(key)
-
현재 사용자의 요청에 의한 캐쉬 key와 이전 요청에서 생성된 캐쉬 key가 동일한 경우 캐쉬히트라고 한다.
-
캐쉬히트가 발생할 때, 해당 오브젝트 콘텐츠가 클라우드프론트 엣지에서 최종 사용자에게 전달하기 때문에 오리진 서버의 부하를 감소, 최종 사용자에 대한 딜레이 타임을 줄여줄 수 있다.
-
원본 요청(Origin request)는 요청된 오브젝트, 콘텐츠가 클라우드프론트 엣지 로케이션에 캐싱되어 있지 않을 경우, 또는 특정 조건을 통한 리퀘스트가 있을 때 클라우드프론트가 오리진에 요청을 보내서 객체를 검색하고 캐싱을 하는것을 의미 함
-
TTL을 설정할 수 있다, 얼마나 오래동안 콘텐츠들이 캐시에 저장되는지에 대한 설명
- 정책보기로 세팅이 어떻게 되어있는지 확인 가능하다.
- 최소 TTL은 1, 최대 TTL 31536000초(365일), 디폴트는 86400초(24시간)
- 가격분류 : 어느 지리적 위치에 클라우드프론트 엣지로케이션을 사용할 것인지
- AWS WAF 웹 ACL - 클라우드프론트에 WAF, ACL 선택하는 메뉴
- 대체 도메인 이름 : 대체 도메인이 있을 경우, 도메인 주소를 구매해 사용
- 사용자 정의 SSL 인증서 : SSL을 사용할 것인지
- HTTP 버전 선택 가능
- 기본값 루트 객체 : 리퀘스트가 특정 오브젝트가 아니라 루트로 요청할 때, 어떤 객체를 반환할 것인지?
- 표쥰로깅 : 리퀘스트 로그를 S3 버킷에 저장할지
- IPv6 지원 여부
CloudFront 생성 후
- 오류페이지 : 유저가 웹서버에서 400대 500 에러가 발생시 보여주는 웹 페이지를 직접 지정할 수 있다.
- 지리적제한 : 특정 국가의 유저들을 차단할 수 있다.
- 캐시에 들어오는 오브젝트를 삭제할 수 있다.
- ex. S3버킷에 파일이 새로 업데이트 되었지만, 캐시에는 오래된 파일을 가지고 있다.
- 새로운 파일을 캐시에 넣기 위해서는 기존 캐시를 비워줘야 한다. TTL에서 설정된 시간동안 기다리기에는 비효율적
- 수동으로 캐시를 비울 수 있다.
- 단점은 추가적인 비용이 든다. 애초에 TTL에 대한 설정을 올바르게 하거나, S3버킷의 용도를 알맞게 디자인해야 한다.
- 버킷의 컨텐츠가 자주 업데이트 될시 TTL을 낮게 잡아주는게 좋다.
퍼블릭 액세스 권한 해제
- S3의 미리 업로드된 파일의 퍼블릭 액세스 해제
- S3 객체의 URL과 CloudFront URL로 접근해보면 접근 거부가 뜬다.
- CloudFront URL로만 접근 가능하다.
S3 직접 호스팅, CloudFront로 배포 차이
- 앞에서 퍼블릭 제한을 해제
- S3에서 직접 호출과 CloudFront 호출의 차이점 보기
- CloudFront로 호출 시 x-cache : Hit from cloudfront 헤더가 추가 된걸 확인할 수 있다.
- CloudFront로 호출시 S3에서 직접 호출하는것 보다 시간이 빠른걸 알 수 있다.
- S3호스팅은 매번 새로고침 즉 매번 리퀘스트에대해 S3버킷에서 해당 오브젝트를 불러와서 페이지를 로딩하지만
- CloudFront는 S3버킷의 객체를 캐싱하여, 캐싱서버에 저장하고 리퀘스트가 있을때 캐싱서버에서 불러오기 때문에 빠르다.
https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95
https://taxijjang.tistory.com/117
https://hyeon9mak.github.io/access-s3-through-cloudfront/
https://www.inflearn.com/course/aws-%EC%9E%85%EB%AC%B8/dashboard