기록용으로 작성하였으니 피드백 주시면 감사하겠습니다
Securely deliver content with low latency and high transfer speeds
Amazon CloudFront
CloudFront는 🌐전 세계의 유저에게 동영상이나 이미지와 같은 콘텐츠를 안정적이고 빠르게 전송하는 콘텐츠 전송 네트워크(CDN, Content Delivery Network) 서비스이다.
사전 지식
🧑💻 CDN (Content Delivery Network)이란
CDN이란 전 세계 사용자에게 빠르고 안전하게 웹 콘텐츠를 전송할 수 있는 기술을 의미한다.
CDN은 전 세계의 서버 위치를 활용하여 통신의 물리적 거리를 줄여 트래픽을 효과적으로 전달한다.
CDN의 자세한 내용: https://jibinary.tistory.com/268
🧑💻 Edge Location (엣지 로케이션)
AWS는 전 세계 각지에 엣지 서버(Edge server)라는 것이 있다.
엣지 로케이션(Edge Location)은 캐시 서버가 있는 거점을 의미한다.
엣지 로케이션에 있는 캐시 서버를 통해 사용자와의 물리적 거리를 줄여 적은 대기시간(low latency)으로 콘텐츠에 접근가능하게 한다.
참고) https://jibinary.tistory.com/112
CloudFront 특징
- 빠른 콘텐츠 전송: 전 세계에 분포된 엣지 로케이션을 통해 콘텐츠를 사용자에게 빠르게 전달한다.
- 다양한 콘텐츠 지원: static content (정적 콘텐츠: 이미지, 비디오 파일 등) 뿐만 아니라 dynamic content (동적 콘텐츠: API 응답 등)를 서버에 캐싱하여 전달 속도를 향상시킨다.
- CloudFront – S3 연동: 거의 모든 경우 CloudFront는 S3와 함께 사용되어 S3는 데이터를 저장하고, CloudFront에서 콘텐츠를 효율적으로 전달한다.
- 보안 기능: AWS Shield Standard가 자동으로 기본 제공되어 DDoS 공격으로부터 보호한다. (추가적으로 AWS WAF와 연동하여 보안을 강화할 수 있다)
CloudFront 데이터 전달 방식
Distribution (디스트리뷰션)
Distribution은 CloudFront에서 콘텐츠를 사용자에게 전달하기 위해 생성하는 논리적 구성이다.
그렇기 때문에 CloudFront를 사용하려면 먼저 Distribution을 생성해야 한다.
Distribution 특징
- Distribution에서는 Origin 이나 Cache 등 콘텐츠를 배포하기 위한 다양한 설정을 한다.
- Distribution을 생성되면 CloudFront를 통해 콘텐츠에 접근할 수 있는 Distribution domain name(예: xxxxxx.cloudfront.net )이 발행된다.
- Distribution domain name의 URL은 통신 암호화 여부(HTTP/HTTPS)를 선택할 수 있다. (URL 예시: http(s)://xxxxxx.cloudfront.net)
- ACM에서 발행된 서버 인증서를 가져와서 URL에 독자적인 도메인 이름을 사용할 수도 있다.
🔧 Origin Server (원본 서버)
Origin은 CloudFront가 콘텐츠를 가져오는 소스 서버를 의미한다. (즉 데이터를 가져오는 곳)
Origin에서 콘텐츠를 받아 캐시 서버에 저장하여 전 세계 사용자에게 빠르게 전달한다.
예시) Origin 종류
- S3 Bucket : 주로 static content(HTML, CSS, 이미지)를 제공할 때 사용된다
- EC2 Instance : 주로 dynamic content(API 응답)를 제공할 때 사용된다.
- ALB : 다수의 EC2 인스턴스나 컨테이너 기반 애플리케이션을 사용할 경우
🔧 Custom Headers (optional)
Custom Headers는 Origin으로 요청을 보낼 때 CloudFront가 추가하는 헤더이다.
이 헤더는 개발자가 직접 정의한 값으로 클라이언트(애플리케이션에 접속한 유저) 요청의 헤더와는 별도로 설정된다.
🔧 Cache Behavior
Cache behavior는 CloudFront에서 특정 파일이나 페이지에 맞춘 캐싱 규칙이다.
CloudFront distribution에서 각 콘텐츠 유형이나 경로별로 다른 캐시 설정을 적용할 수 있도록 하는 중요한 기능이다.
Cache Behavior에 관한 더 쉬운 설명: https://jibinary.tistory.com/559
🔧 Lambda@ Edge와 CloudFront Function (optional)
특정 코드를 실행할 수 있도록 지원하는 서비스이다.
Lambda@ Edge와 CloudFront Function에 관한 더 쉬운 설명: https://jibinary.tistory.com/493
🔧 캐시 TTL (Time To Live: TTL)
캐시를 유지하는 시간이다. URL 경로마다 지정할 수 있다.
CloudFront는 캐시 TTL이 초과된 후 클라이언트로부터 요청을 받으면 오리진 서버에 콘텐츠가 갱신되었는지 확인하고, 갱신된 경우 캐시에 반영하며 응답을 반환한다.
캐시 TTL을 포함한 캐시 설정을 "캐시 정책"이라고 한다.
🔧 Invalidation (캐시 삭제)
엣지 서버에 저장된 캐시를 즉시 삭제할 수 있는 기능이다.
캐시를 삭제한 후 클라이언트로부터 데이터 요청을 받으면, 엣지 서버는 반드시 오리진 서버에서 콘텐츠를 가져오므로 클라이언트에게 제공되는 콘텐츠가 최신화된다.
삭제할 데이터는 폴더명이나 파일명으로 지정할 수 있다.
🔧 OAC (Origin Access Control)
OAC(Origin Access Control)는 CloudFront가 S3 버킷과 같은 오리진에 안전하게 접근할 수 있도록 제어하는 기능이다.
CloudFront에서 S3 버킷을 원본으로 사용할 때, OAC를 사용하면 S3 버킷이 퍼블릭하게 노출되지 않고 CloudFront를 통해서만 안전하게 접근할 수 있게 만든다.
OAC와 OAI에 관한 자세한 내용: https://jibinary.tistory.com/560
Q. 문제 1
Amazon CloudFront를 사용하는 환경에서 문제가 있었던 콘텐츠를 수정했다. 모든 클라이언트가 최신 콘텐츠를 즉시 참조하게 하려면 어떻게 해야 할까?
정답
Invalidation: Edge Server의 캐시를 삭제하기
Q. 문제 2
어떤 회사가 Amazon S3에 호스팅하여 웹사이트를 설계하고 있습니다.
사용자가 S3 버킷에 있는 자산에 직접 링크를 걸지 못하도록 하려면 어떻게 해야 하나요?
즉, S3 버킷에 있는 파일들이 외부에서 직접 접근되는 것을 방지하고, 오직 웹사이트를 통해서만 자산에 접근할 수 있도록 하려는 방법은??
정답
Amazon CloudFront Distrubute를 생성하고, 원본 액세스 제어(OAC)를 설정한 다음, Bucket Policy을 업데이트하여 OAC에만 권한을 부여한다.