📌 CloudFront
💡 CloudFront 개요 (Introduction)
- CloudFront는 콘텐츠 전송 네트워크 (CDN)로, 사용자의 콘텐츠를 전 세계에 있는 엣지 로케이션(POP)에 캐시 처리하여 성능을 높인다.
- 콘텐츠가 엣지에서 캐시됨으로써 읽기 성능을 개선하고, 사용자 경험을 향상시킨다.
- 전 세계에 216개의 엣지 로케이션이 있으며, 이는 AWS의 DDoS보호와 통합되어 있다.
💡 CloudFront 오리진 (Origins)
- CloudFront의 오리진은 콘텐츠가 실제로 저장되어 있는 S3 버킷 또는 커스텀 오리진 (HTTP) 일 수 있다.
- 커스텀 오리진으로는 Application Load Balancer, EC2 인스턴스, 또는 HTTP 백엔드를 설정할 수 있다.
- S3 버킷은 파일을 분산하고 캐시하는 데 사용되며, 오리진 액세스 제어 (OAC)를 통해 보안을 강화할 수 있다.
🦾 CloudFront 작동 원리 (How it works)
- CloudFront는 엣지 로케이션을 통해 클라이언트 요청을 처리하며, 캐시된 콘텐츠를 제공하여 성능을 향상시킨다.
- 클라이언트가 콘텐츠를 요청하면 엣지 로케이션에서 먼저 캐시를 확인한 후, 없으면 오리진에서 가져온다.
🆚 CloudFront와 S3 리전 간 복제 비교
- CloudFront는 전 세계 엣지 네트워크를 통해 콘텐츠를 전송하며, 캐시된 콘텐츠를 TTL (Time to Live) 동안 유지한다.
- S3 리전 간 복제는 특정 리전 간에만 콘텐츠를 복제하며, 실시간으로 업데이트됩니다. 주로 동적 콘텐츠를 빠르게 제공하는 데 적합하다.
🔒 CloudFront 보안 및 DDoS 보호
- CloudFront는 전 세계에 걸쳐 분산된 엣지 로케이션을 통해 DDoS 공격에 대한 방어를 제공하며, AWS Shield와 AWS WAF(웹 애플리케이션 방화벽)와 통합되어 있다.
- 사용자는 CloudFront를 통해 보안 및 성능을 동시에 유지할 수 있다.
📌 CloudFront 캐싱 및 캐싱 정책, 무효화
💡 CloudFront Caching 개요
- 캐시 저장 위치: 캐시는 CloudFront의 엣지 로케이션에 저장된다.
- 캐시 키 : CloudFront 캐시 키는 캐시 내 객체를 식별하는 고유한 값
- 기본적으로, 캐시 키는 호스트 이름과 URL의 리소스 부분으로 구성된다.
- 캐시 히트 : 엣지 로케이션에 캐시된 콘텐츠를 바로 제공할 수 있는 경우
- 캐시 히트(Caching Hit) 극대화: 오리진 서버에 대한 요청을 줄이기 위해서는 캐시 적중률을 극대화하는 것이 중요하다.
- CloudFront 캐시 정책: 캐시 히트를 높이려면, 정책을 통해 캐시 키를 확장.
- 캐시 히트(Caching Hit) 극대화: 오리진 서버에 대한 요청을 줄이기 위해서는 캐시 적중률을 극대화하는 것이 중요하다.
- 캐시 키 확장: 특정 사용자, 기기, 언어, 위치 등에 따라 콘텐츠가 달라지는 경우에는 HTTP 헤더, 쿠키, 쿼리 문자열을 포함하여 캐시 키를 확장할 수 있다.
- 캐시 무효화(Cache Invalidation): 객체가 TTL(만료 시간) 전에 변경되거나 만료되면 CreateInvalidation API를 사용해 캐시의 일부를 무효화할 수 있다.
💡 CloudFront Cache Policy
- 캐시 정책(Cache Policy): 캐시는 HTTP 헤더, 쿠키, 쿼리 문자열에 따라 설정될 수 있다.
- 헤더(Headers): 캐시 키에 포함할 헤더를 정의할 수 있습니다. 선택지는 None, Whitelist 다.
- 쿠키(Cookies): 캐시 키에 포함할 쿠키를 선택할 수 있습니다. None, Whitelist, Include All-Except, All의 선택지가 있다.
- 쿼리 문자열(Query Strings): 캐시 키에 포함할 쿼리 문자열을 설정할 수 있다.
- TTL 제어: TTL(Time to Live)을 0초에서 최대 1년까지 설정할 수 있으며, 오리진 서버의 Cache-Control 또는 Expires 헤더에 의해 설정될 수 있다.
- 정책 설정: 사용자는 사전 정의된 관리형 정책을 사용할 수 있으며, 필요에 따라 사용자 정의 캐시 정책을 생성할 수 있다.
💡 CloudFront Caching - Cache Policy HTTP Headers
HTTP 헤더 기반 캐싱
- None: 기본적으로 어떤 헤더도 캐시 키에 포함되지 않는다. 헤더는 전달되지 않으며, 가장 빠른 캐싱 성능을 제공한다.
- Whitelist: 특정한 헤더만 선택적으로 캐시 키에 포함할 수 있다. 이를 통해 필요한 정보만 캐시하고 오리진에 전달할 수 있다.
💡 CloudFront Cache Policy - Query Strings
쿼리 문자열 기반 캐싱
- None: 쿼리 문자열을 캐시 키에 포함하지 않으며 오리진에도 전달되지 않는다.
- Whitelist: 특정 쿼리 문자열만 캐시 키에 포함되고 오리진에 전달된다.
- Include All-Except: 제외할 쿼리 문자열을 지정하고, 나머지는 모두 포함시킨다.
- All: 모든 쿼리 문자열을 캐시 키에 포함시켜 오리진에 전달하지만, 성능이 저하될 수 있다.
💡 CloudFront Policies - Origin Request Policy
오리진 요청 정책
- 캐시 키에는 포함되지 않지만, 오리진 요청에 추가로 전달하고자 하는 값을 지정할 수 있다.
- HTTP 헤더, 쿠키, 쿼리 문자열을 선택하여 포함할 수 있으며, API 키 또는 보안 헤더와 같은 추가 헤더를 지정할 수도 있다.
- 이를 통해 콘텐츠가 캐시에 저장되지만, 추가적인 정보는 오리진에만 전달되어 보안을 강화할 수 있다.
🆚 Cache Policy vs. Origin Request Policy
- 캐시 정책(Cache Policy)은 캐시에 포함될 항목을 정의하며, 이를 통해 적중률을 높인다.
- 오리진 요청 정책(Origin Request Policy)은 캐시에는 포함되지 않지만, 오리진에 요청할 때 필요한 추가 정보를 포함한다. 이를 통해 캐시 효율성을 높이면서도 오리진에서 정확한 데이터를 받을 수 있다.
- Cache Policy는 캐시 키를 구성하는 반면, Origin Request Policy는 오리진 요청에 포함되는 정보를 관리합니다. 둘은 다른 목적을 가지고 있으며, 적절히 사용해야 합니다.
- 캐시 키에 어떤 항목이 포함되고, 오리진 요청에 어떤 추가 항목이 포함되는지를 보여준다.
💡 캐시 무효화
- 백엔드 오리진에서 파일을 업데이트할 경우, TTL이 만료되기 전에 업데이트된 콘텐츠를 제공하기 위해 Cache Invalidation을 사용한다.
- 경로를 지정하여 특정 파일 또는 전체 파일을 무효화할 수 있다.
📌 CloudFront - 캐시 동작
🤖 CloudFront – Cache Behaviors
- 캐시 동작
- CloudFront의 캐시 동작(Cache Behavior)은 서로 다른 URL 패턴에 대해 다른 설정을 적용할 수 있다.
- 예시: 이미지 파일(images/*.jpg)에는 S3 버킷 오리진을, /api/* 경로에는 애플리케이션 로드 밸런서를 오리진으로 설정할 수 있다.
- 또한, 경로 패턴이나 콘텐츠 유형에 따라 오리진 또는 오리진 그룹으로 라우팅을 설정할 수 있다.
- 라우팅 옵션
- /images/*: 이미지 파일은 S3 버킷 오리진으로 보내기.
- /api/*: API 요청은 애플리케이션 로드 밸런서 오리진으로 보내기.
- /*: 기본적으로 모든 다른 요청은 S3 버킷 오리진으로 보내기.
- 기본 캐시 동작
- 추가적인 캐시 동작이 추가되더라도, 기본 캐시 동작인 /*은 항상 마지막에 처리된다.
🔐 CloudFront – Cache Behaviors – Sign In Page
- 로그인 캐시 동작
- /login 경로는 EC2 인스턴스를 오리진으로 설정하고, 로그인된 사용자에게 서명된 쿠키(Signed Cookies)를 제공하여 다른 리소스에 액세스할 수 있게 한다.
- 서명된 쿠키의 역할
- 사용자는 로그인 후 쿠키를 통해 인증된 상태로 CloudFront 배포의 다른 리소스에 액세스할 수 있다.
CloudFront – Maximize Cache Hits by Separating Static and Dynamic Distributions
캐시 적중률을 높이기 위한 분리
- 정적 콘텐츠는 캐시 처리하고, 동적 콘텐츠는 헤더와 쿠키 기반으로 처리해 캐시 적중률을 최대화할 수 있다.
📌 CloudFront - 오리진으로서의 ALB
- CloudFront와 EC2 인스턴스 연결
- CloudFront는 EC2 인스턴스를 오리진으로 사용할 수 있다.
- 그러나 CloudFront는 퍼블릭 네트워크에서만 EC2 인스턴스에 접근할 수 있기 때문에, EC2 인스턴스는 반드시 퍼블릭이어야 한다.
- 이를 위해서는 CloudFront 엣지 로케이션의 모든 퍼블릭 IP 목록을 EC2의 보안 그룹에 허용하여 액세스할 수 있도록 설정해야 한다.
- CloudFront와 ALB 연결
- CloudFront는 또한 애플리케이션 로드 밸런서 (ALB)를 오리진으로 사용할 수 있다.
- ALB는 퍼블릭이어야 하지만, 이 경우 EC2 인스턴스는 프라이빗으로 유지할 수 있다.
- ALB와 EC2 인스턴스 간에는 VPC 프라이빗 연결을 통해 연결이 가능하며, EC2 인스턴스의 보안 그룹에서 ALB의 보안 그룹을 허용하면 된다.
📌 CloudFront - 지리적 제한
- CloudFront Geo Restriction을 통해 사용자의 콘텐츠 접근을 국가별로 제한할 수 있다.
- Allowlist(허용 목록): 지정된 국가 목록에 있는 사용자만 콘텐츠에 접근할 수 있다.
- Blocklist(차단 목록): 지정된 국가 목록에 있는 사용자는 콘텐츠 접근이 차단된다.
- 국가 결정은 3rd party Geo-IP 데이터베이스를 사용하여, 사용자의 IP 주소를 해당 국가와 매핑하는 방식으로 이루어진다.
- 주요 활용 사례로는 저작권법을 준수하기 위해 특정 국가에서의 콘텐츠 접근을 제어하는 것이다.
📌 CloudFront 서명 URL/쿠키
CloudFront 서명된 URL 및 서명된 쿠키 개요
- CloudFront 배포를 비공개로 설정하여 전 세계 프리미엄 사용자에게 유료 공유 콘텐츠 액세스를 제공.
- 서명된 URL 또는 서명된 쿠키를 이용해 특정 사용자에게만 콘텐츠 접근 권한 부여.
- 정책을 연결하여 URL이나 쿠키의 만료 시점, 액세스 가능한 IP 범위, 신뢰할 수 있는 서명자 지정.
- 서명된 URL과 서명된 쿠키의 유효 기간 설정 예시:
- 영화나 음악: 몇 분
- 개인 콘텐츠: 몇 년
CloudFront 서명된 URL 작동 방식
- CloudFront 배포에 여러 엣지 로케이션 존재.
- Amazon S3 버킷 액세스 정책에 오리진 액세스 제어(OAC) 적용.
- OAC를 통해 S3 버킷의 객체에 오직 CloudFront만 접근 가능.
- 사용자 인증 및 권한 부여 후 서명된 URL 생성.
- 클라이언트는 서명된 URL을 통해 CloudFront에서 객체 접근.
서명된 URL vs 서명된 쿠키
서명된 URL
- 개별 파일에 대한 접근 제공.
- 파일마다 별도의 URL 필요.
- 예: 100개의 파일 → 100개의 URL
서명된 쿠키
- 여러 파일에 대한 접근 제공.
- 하나의 쿠키로 여러 파일 접근 가능.
- 효율적이고 재사용 가능.
서명된 URL vs S3 미리 서명된 URL
CloudFront 서명된 URL
- 오리진에 상관없이 경로의 접근 허용.
- 오리진이 S3이든 다른 HTTP 백엔드이든 관계없이 작동.
- 계정 전체에 적용되는 키 페어로 루트만 관리 가능.
- IP, 경로, 날짜, 만료일 기준 필터링 가능.
- CloudFront의 모든 캐시 기능 활용 가능.
S3 미리 서명된 URL
- S3의 파일에 직접 접근 허용.
- 서명된 URL 생성자의 권한 상속.
- URL 수명 제한적.
- CloudFront와 연동되지 않음.
CloudFront 서명된 URL
- 서명자의 종류
- 신뢰할 수 있는 키 그룹(권장):
- API를 활용하여 키 생성 및 순환 가능.
- IAM을 통해 API 보안 관리.
- CloudFront에서 공용 키를 검증하는데 사용.
- AWS 계정에 있는 CloudFront 키 페어
- 루트 계정을 사용하여 키 관리.
- AWS 콘솔에서 관리 필요 (권장하지 않음).
- 자동화 X
- 신뢰할 수 있는 키 그룹(권장):
- 키 그룹 생성:
- CloudFront 분산 배포에서 하나 이상의 신뢰할 수 있는 키 그룹 생성 가능.
- 공용 키와 개인 키의 생성:
- 개인 키: 애플리케이션 (예: EC2)에서 서명된 URL을 생성하는 데 사용.
- 공용 키: CloudFront가 서명된 URL을 검증하는 데 사용.
📌 CloudFront 고급 개념
CloudFront 가격 및 가격 등급
- CloudFront의 데이터 전송 비용은 엣지 로케이션의 위치에 따라 달라진다.
- 엣지 로케이션은 전 세계에 걸쳐 퍼져 있으며, 각 로케이션의 데이터 전송 비용이 다르다.
데이터를 많이 전송할수록 요금이 낮아지는 구조를 가지고 있으며, 각 지역마다 요금이 다르기 때문에, 전송 데이터를 최적화하는 것이 중요하다.
- 가격 등급(Price Class)을 사용해 비용을 최적화할 수 있다.
- Price Class는 세 가지로 나뉜다.
- Price Class All: 모든 엣지 로케이션을 포함하여 최상의 성능을 제공하지만, 비용이 가장 비싸다.
- Price Class 200: 가장 비싼 지역을 제외한 대부분의 엣지 로케이션을 포함한다.
- Price Class 100: 비용이 가장 저렴한 엣지 로케이션만 사용하여 비용을 절감할 수 있다.
💡 다중 오리진(Multiple Origins)
- CloudFront는 다중 오리진을 지원하여, 경로 패턴에 따라 서로 다른 오리진으로 트래픽을 라우팅할 수 있다. 이를 통해 콘텐츠 유형별로 트래픽을 분리하고 성능을 최적화할 수 있다.
- 예를 들어, /images/* 경로는 S3 버킷에서 이미지를 제공하고, /api/* 경로는 애플리케이션 로드 밸런서(ALB)를 통해 API 응답을 처리하도록 설정할 수 있다.
- 이를 통해 각 콘텐츠 유형별로 적절한 오리진을 선택하여, 성능과 비용을 최적화할 수 있다.
👥 오리진 그룹 (Origin Groups)
- CloudFront는 오리진 그룹을 사용하여 고가용성을 보장할 수 있다. 오리진 그룹은 하나의 주 오리진(Primary Origin)과 하나의 보조 오리진(Secondary Origin)으로 구성된다.
- 주 오리진에서 장애가 발생하면, CloudFront가 자동으로 보조 오리진으로 트래픽을 전환하여 서비스 중단을 최소화할 수 있다.
- 이 기능은 특히 재해 복구나 지역 간 가용성을 보장하는 데 유용하다.
- 예를 들어, 두 개의 S3 버킷을 오리진 그룹으로 설정하고, 주 오리진에 문제가 발생했을 때 자동으로 보조 오리진에서 데이터를 제공할 수 있다.
🔒 필드 수준 암호화 (Field-Level Encryption)
- CloudFront는 필드 수준 암호화를 통해 민감한 데이터를 보호할 수 있다. 이는 비대칭 암호화를 사용하여 데이터 전송 중 특정 필드를 암호화하고, 오직 개인 키를 소유한 수신자만 해당 데이터를 해독할 수 있다.
- 이 기능은 HTTPS로 보호된 연결 위에 추가적인 보안 계층을 제공하여, 민감한 데이터를 엣지에서 암호화하여 안전하게 전송한다.
- 예를 들어, 클라이언트가 신용카드 정보를 제출할 때 해당 필드만 암호화하고, 서버에 도착하기 전까지 중간에 있는 모든 시스템은 이 데이터를 볼 수 없다.
📌 CloudFront - 실시간 로그
💡 CloudFront 실시간 로그 소개
- CloudFront 실시간 로그 기능을 통해 사용자 요청을 Kinesis 데이터 스트림에 전송하여 실시간으로 기록하고, 이를 분석해 콘텐츠 전송 성능을 최적화할 수 있다.
- 실시간 로그는 콘텐츠 전송 지연을 최소화하고 빠른 의사결정을 돕는 도구로 사용되며, 실시간 분석이 필요한 서비스에 매우 유용하다.
- 예를 들어, 사용자가 이미지 파일을 요청했을 때, 이 요청이 언제, 어디에서 발생했는지 기록되며, 성능 문제 발생 시 빠르게 확인하고 조치를 취할 수 있다.
💡 실시간 로그와 Kinesis 데이터 스트림
- 이때 Kinesis 데이터 스트림은 실시간으로 로그를 처리할 수 있는 인프라로, 요청이 발생한 시점에서 즉시 데이터를 수집하고 저장한다.
- 람다(Lambda) 함수를 통해 이 데이터를 실시간으로 분석하거나 추가 조치를 취할 수 있다. 예를 들어, 특정 요청이 실패했을 경우, 이를 즉시 확인하여 빠르게 복구할 수 있는 구조다.
- Use case: 실시간 이벤트 기반 시스템에서 API 호출의 성공 또는 실패 여부를 즉시 파악하여 대처하는 상황.
CloudFront에서 Kinesis 데이터 스트림으로 로그가 전송되고, Lambda가 이를 실시간으로 처리하는 과정
📝 Near Real-Time Processing
- 실시간 처리가 불필요하거나 대량의 데이터를 다룰 경우, Kinesis Data Firehose를 통해 배치 처리 방식으로 로그를 저장할 수 있다.
- 이 경우, 데이터를 실시간으로 처리하기보다는 일정 주기로 모아서 Amazon S3, OpenSearch 등의 스토리지나 분석 서비스로 전송하게 된다.
- 배치 처리 방식은 대규모 트래픽을 효율적으로 처리하고, 비용을 절감하는 데 적합하다.
- 예를 들어, 웹사이트에 대량의 이미지를 배포하고 분석할 경우, 실시간 처리보다는 일정 주기로 데이터를 수집하여 분석하는 것이 더 적합할 수 있다.
⏳샘플링 비율과 경로 필터링
- 샘플링 비율을 설정하여 모든 요청을 로그로 기록하지 않고, 특정 비율만 선택하여 처리할 수 있다.
- 예를 들어, 100%의 요청을 모두 기록하는 것이 과도한 트래픽과 비용을 초래할 수 있는 경우, 샘플링을 통해 일부 요청만 처리하여 효율적으로 운영할 수 있다.
- 또한, 필드 및 캐시 동작 설정을 통해 특정 경로에 대한 요청만 로그로 기록할 수 있습니다. 예를 들어, /images/* 경로에 대한 요청만 기록하도록 설정하면, 이미지 요청에 대한 로그만 집중적으로 분석할 수 있다.
- 이를 통해 비용을 절감하고 효율적인 로그 관리가 가능하다.
반응형
'AWS' 카테고리의 다른 글
AWS Section 18. CloudFormation (2) | 2024.11.04 |
---|---|
AWS Section 16. ECS, ECR 및 Fargate - AWS의 도커 (0) | 2024.10.26 |
AWS Section 14. Amazon S3 보안 (0) | 2024.09.27 |
AWS Section 13. Amazon S3 고급 (0) | 2024.09.27 |
AWS Section 12. AWS CLI, SDK, IAM 역할 및 정책 (0) | 2024.09.27 |