CloudFront
- 정적, 동적 실시간 웹사이트 컨텐츠를 유저들에게 전달
- Edge Location을 사용
- Content Delivery Network(CDN)
- 웹페이지를 요청하는 클라이언트들의 지역에 근거하여 컨텐츠 웹 페이지에 딜리버리 해주는 분산 네트워크이다.
- 분산 네트워크(Distributed Network)
CloudFront 용어 정리
- Edge Location(엣지 지역) : 컨텐츠들이 캐시(Cache)에 보관되어지는 장소
- Origin(오리진) : 원래 컨텐츠들이 들어있는 곳, 웹 서버 호스팅이 되어지는 곳, S3, EC2인스턴스가 오리진이 될 수 있음
- Distribution(분산) : CDN에서 사용되어지며 Edge Location들을 묶고 있다는 개념
실습
- S3 버킷의 객체를 CloudFront로 배포해보기
![](https://velog.velcdn.com/images/black2code/post/3bd43429-4648-439e-b166-4f1343752edd/image.png)
![](https://velog.velcdn.com/images/black2code/post/456ff0aa-a7e8-4bc3-b8a2-6a5714518fb6/image.png)
- 전 세계에서 접근 가능한 퍼블릭 S3를 생성하기 위해, 모든 퍼블릭 액세스 차단 해제
![](https://velog.velcdn.com/images/black2code/post/bfb3c5ad-138b-49cd-900d-48aca7a00390/image.png)
![](https://velog.velcdn.com/images/black2code/post/35a81a69-1b36-47d0-8262-7c524c355129/image.png)
![](https://velog.velcdn.com/images/black2code/post/b0efb0a3-0e48-4b7a-b68d-9348f3226d43/image.png)
-
S3 버킷을 만들때 분명 퍼블릭으로 설정하여 만들었지만, 이상하게 객체 접근이 Access Denied가 뜬다.
-
앞서 생성한 S3 버킷을 보면 객체를 퍼블릭으로 설정할 수 있음 메세지가 있는 것을 확인할 수 있다.
-
이는 아직 퍼블릭으로 설정되지 않았다는 뜻이며 외부에서 접근할 수 없다는 것을 의미한다.
-
따라서 외부에서 해당 버킷에 접근 가능하도록 하기 위해서는 버킷 정책을 수정해야 한다.
![](https://velog.velcdn.com/images/black2code/post/ed9b73f4-763a-4c44-8447-5779f8b68f05/image.png)
정책 생성기
![](https://velog.velcdn.com/images/black2code/post/c6b439fa-f393-4c50-be26-e4d0f5ad6a69/image.png)
- 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": "*" // 정책 적용 대상 모두
}
]
}
![](https://velog.velcdn.com/images/black2code/post/805290b4-692a-4838-85fb-66bc1ade4cb2/image.png)
- 혹시나 버킷 정책을 입력하고 변경사항 저장을 할때
- Action does not apply to any resource(s) in statement 에러가 발생한다면
- 버킷 정책의 Resource에 있는 value 즉 arn값 뒤에다가 /*를 붙여주고 변경사장 저장을 클릭하시면 퍼블릭으로 변경 된다.
정책 추가 후 객체 URL로 접속해보면 업로드된 파일이 정상적으로 화면에 보여진다.
버킷 ACL
버킷 접근 제어 3가지 방법
![](https://velog.velcdn.com/images/black2code/post/0b2898c9-64a5-403b-aaa7-2a13955a1df9/image.png)
- IAM 제어는 IAM 계정에 S3 접근 권한(policy)를 설정해 사용자 단위로 액세스를 제어하는 것
- 버킷 정책은 버킷 단위로 상세한 접근 제어를 확정하고 이후에 변경이 적을 때,
- ACL은 객체 단위로 간단하게 접근 제어할 때 사용
접근정책(ACL)은 버킷정책을 통해 사용할 수 있는 권한보다 세부적인 제어를 제공하지 않는다.
읽기 및 쓰기 엑세스 권한 이외의 세부 권한을 찾고 있는 경우 접근정책(ACL)을 통해 버킷정책(Bucket Policy)을 선택하여 구성이 가능하다.
단, 버킷정책은 파일형태로 만들어 버킷에 적용하며 이 파일은 20KB를 초과할 수 없다.
버킷 ACL 설정하기
![](https://velog.velcdn.com/images/black2code/post/0b0f5b92-ffb3-4155-9e35-b777ae218b38/image.png)
![](https://velog.velcdn.com/images/black2code/post/00b687eb-de83-488f-94c0-4b2e59a34618/image.png)
![](https://velog.velcdn.com/images/black2code/post/68a3ea36-4382-4817-9424-2ee210910a64/image.png)
![](https://velog.velcdn.com/images/black2code/post/1cc1d79c-966b-469e-99bb-038b5519bd76/image.png)
-
버킷을 퍼블릭으로 설정했으면, 각 파일에 대해서도 퍼블릭으로 설정해주어야 한다.
-
파일을 처음 업로드할때 밑의 ACL 메뉴에서 파일에 대한 접근 권한을 설정해줄 수 있고,
![](https://velog.velcdn.com/images/black2code/post/60fef08e-6a3e-4e08-8a94-488bce581cc5/image.png)
- 이미 업로드된 객체일 경우, ACL을 통해 퍼블릭으로 지정
![](https://velog.velcdn.com/images/black2code/post/eafd7de2-9b0f-4747-9fb6-af8eea8026f0/image.png)
ACL 설정 후 객체 URL로 접속해보면 업로드된 파일이 정상적으로 화면에 보여진다.
CloudFront 배포
![](https://velog.velcdn.com/images/black2code/post/b5b73022-d2d2-41f5-8746-8260a62fca4e/image.png)
- 원본 경로 : 만약 S3 버켓 안에 여러개의 폴더가 있고, 각각의 폴더에 다른 이미지 동영상이 있다면
- 특정 폴더만을 타겟을 원한다면 원본 경로 입력
S3 버킷 액세스
- OAI (origin access identity) 를 이용하여 클라우트프론트에 오리진이 되는 S3 버킷에 대한 액세스 컨트롤 할것인지?
- 원본 액세스 제어 설정 : cloudfront에 identity를 생성해 S3버킷에 접근할 수 있게 해줌
![](https://velog.velcdn.com/images/black2code/post/6eac50c8-63fc-4cd1-93f5-76eec46718f7/image.png)
Origin shield
- Origin으로 등록한 스토리지(S3 등)에 전달되는 리퀘스트의 횟수를 줄여 관리 비용을 줄인다고 한다. (캐시 적중률을 높힌다는 이야기)
- Yes 옵션을 선택 후, 자기 서비스 오리진의 지역에 가까운 지역을 선택해서 골라주면 설정이 끝난다.
![](https://velog.velcdn.com/images/black2code/post/0de84fb5-42b7-47bf-a0dc-2d6848ff05de/image.png)
- 자동으로 객체 압축 : CloudFront가 전송속도를 높이기 위해 오리진에서 가져온 오브젝트를 자동으로 압축 하는 기능
- Http, Https 사용
- GET 뿐만아니라 PUT, POST, PATCH, DELETE도 CloudFront로 가능
뷰어 액세스 제한
![](https://velog.velcdn.com/images/black2code/post/cae29075-a231-4cc1-abe9-ca49d0d549c4/image.png)
- 승인받은 유저들만 접속 가능하도록, ex.특정 웹사이트 방문하기 위해 로그인 과정
- signed url을 가지고 있는 특정 유저들만 웹사이트 컨텐츠를 볼 수 있게 해주는 URL
![](https://velog.velcdn.com/images/black2code/post/09cf29b3-7017-4555-9b08-d85c4bc2c2a8/image.png)
-
캐싱된 객체가 가지고 있는 고유 식별자(key)
-
현재 사용자의 요청에 의한 캐쉬 key와 이전 요청에서 생성된 캐쉬 key가 동일한 경우 캐쉬히트라고 한다.
-
캐쉬히트가 발생할 때, 해당 오브젝트 콘텐츠가 클라우드프론트 엣지에서 최종 사용자에게 전달하기 때문에 오리진 서버의 부하를 감소, 최종 사용자에 대한 딜레이 타임을 줄여줄 수 있다.
-
원본 요청(Origin request)는 요청된 오브젝트, 콘텐츠가 클라우드프론트 엣지 로케이션에 캐싱되어 있지 않을 경우, 또는 특정 조건을 통한 리퀘스트가 있을 때 클라우드프론트가 오리진에 요청을 보내서 객체를 검색하고 캐싱을 하는것을 의미 함
-
TTL을 설정할 수 있다, 얼마나 오래동안 콘텐츠들이 캐시에 저장되는지에 대한 설명
![](https://velog.velcdn.com/images/black2code/post/437e1e9d-8111-4850-a59a-34f489e691b7/image.png)
- 정책보기로 세팅이 어떻게 되어있는지 확인 가능하다.
- 최소 TTL은 1, 최대 TTL 31536000초(365일), 디폴트는 86400초(24시간)
![](https://velog.velcdn.com/images/black2code/post/40d4e190-8bbf-4dc6-987e-b1d33df4d519/image.png)
- 가격분류 : 어느 지리적 위치에 클라우드프론트 엣지로케이션을 사용할 것인지
- AWS WAF 웹 ACL - 클라우드프론트에 WAF, ACL 선택하는 메뉴
- 대체 도메인 이름 : 대체 도메인이 있을 경우, 도메인 주소를 구매해 사용
- 사용자 정의 SSL 인증서 : SSL을 사용할 것인지
- HTTP 버전 선택 가능
![](https://velog.velcdn.com/images/black2code/post/dc06c43c-595e-4e48-a0e9-d0f00d116391/image.png)
- 기본값 루트 객체 : 리퀘스트가 특정 오브젝트가 아니라 루트로 요청할 때, 어떤 객체를 반환할 것인지?
- 표쥰로깅 : 리퀘스트 로그를 S3 버킷에 저장할지
- IPv6 지원 여부
CloudFront 생성 후
![](https://velog.velcdn.com/images/black2code/post/74f0fb90-f87f-4320-9eca-1c060ff942a4/image.png)
- 오류페이지 : 유저가 웹서버에서 400대 500 에러가 발생시 보여주는 웹 페이지를 직접 지정할 수 있다.
![](https://velog.velcdn.com/images/black2code/post/5111fa4b-15f4-4f9a-be11-1cd0679be918/image.png)
- 지리적제한 : 특정 국가의 유저들을 차단할 수 있다.
![](https://velog.velcdn.com/images/black2code/post/a3882694-5243-4e67-8abc-9c2c9dc53a4d/image.png)
- 캐시에 들어오는 오브젝트를 삭제할 수 있다.
- ex. S3버킷에 파일이 새로 업데이트 되었지만, 캐시에는 오래된 파일을 가지고 있다.
- 새로운 파일을 캐시에 넣기 위해서는 기존 캐시를 비워줘야 한다. TTL에서 설정된 시간동안 기다리기에는 비효율적
- 수동으로 캐시를 비울 수 있다.
- 단점은 추가적인 비용이 든다. 애초에 TTL에 대한 설정을 올바르게 하거나, S3버킷의 용도를 알맞게 디자인해야 한다.
- 버킷의 컨텐츠가 자주 업데이트 될시 TTL을 낮게 잡아주는게 좋다.
퍼블릭 액세스 권한 해제
![](https://velog.velcdn.com/images/black2code/post/bfe2fa29-97b2-497d-ac6c-6331fa201440/image.png)
- S3의 미리 업로드된 파일의 퍼블릭 액세스 해제
![](https://velog.velcdn.com/images/black2code/post/da81a304-afb6-47ec-99d0-d16287561a0d/image.png)
![](https://velog.velcdn.com/images/black2code/post/bb41f5af-c8a0-4087-a793-da13129983ea/image.png)
![](https://velog.velcdn.com/images/black2code/post/f3da24d1-e753-4c39-856c-0666aa7c0339/image.png)
- S3 객체의 URL과 CloudFront URL로 접근해보면 접근 거부가 뜬다.
![](https://velog.velcdn.com/images/black2code/post/b6689782-0c08-4718-89e2-07ded42128a0/image.png)
![](https://velog.velcdn.com/images/black2code/post/f84257f8-1e77-4c10-be81-9138ab2d1ba4/image.png)
- CloudFront URL로만 접근 가능하다.
S3 직접 호스팅, CloudFront로 배포 차이
- 앞에서 퍼블릭 제한을 해제
- S3에서 직접 호출과 CloudFront 호출의 차이점 보기
![](https://velog.velcdn.com/images/black2code/post/1e19c828-b6b1-43e9-b10e-26e11f29ce5e/image.png)
![](https://velog.velcdn.com/images/black2code/post/34d0a3a2-3258-4414-acdd-41db400b9329/image.png)
- CloudFront로 호출 시 x-cache : Hit from cloudfront 헤더가 추가 된걸 확인할 수 있다.
![](https://velog.velcdn.com/images/black2code/post/8c085417-2065-44ed-8f2d-88a021d7f857/image.png)
![](https://velog.velcdn.com/images/black2code/post/b74710b5-419e-48da-a4b0-8656e552c217/image.png)
- 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