웹 서비스의 사용자들은 위치에 관계없이 빠르고 안정적인 응답을 기대한다. 이에 따라 컨텐츠를 효율적으로 전송하기 위한 CDN(Content Delivery Network)의 중요성이 점점 더 커지고 있다.
AWS CloudFront는 Amazon이 제공하는 대표적인 CDN 서비스로, 전 세계에 분산된 엣지 로케이션을 통해 컨텐츠를 빠르게 전달할 수 있도록 도와준다. 다양한 AWS 서비스와 연동하여 사용할 수 있으며, 트래픽 최적화, 보안, 캐싱 전략까지 유연하게 설정할 수 있는 장점이 있다.
이번 포스팅에서는 CloudFront를 이해하기 위한 기본 개념들을 살펴보고, 간단한 적용을 실습해 볼 예정이다.
1. AWS CloudFront : 주요 개념 및 기능
2. 배포(Distribution)
3. 원본(Origin) : 종류(Custom Origin & S3 Origin), 추가 기능(Origin Group, Custom Header)
4. 동작(Behavior) : Origin 설정, Viewer 설정, Policy 설정 (캐시 정책 & 원본 요청 정책 & 응답 헤더 정책)
5. CloudFront 활용 : 원본 서버 배포
6. CloudFront 활용 : Failover
AWS CloudFront
CloudFront는 AWS가 제공하는 글로벌 컨텐츠 배포 서비스이다. 전 세계 수백 곳에 위치한 캐시 서버(Edge Location)를 통해, 사용자에게 가장 가까운 서버에서 컨텐츠를 전달함으로써 리소스를 더 빠르게 제공할 수 있도록 지원한다.
- AWS에서 제공하는 CDN (Content Delivery Network) 서비스
- 컨텐츠(정적 및 동적)를 전 세계 사용자에게 빠르고 안정적으로 전달한다.
- 정적 컨텐츠와 동적 컨텐츠는 다른 캐시 처리 전략이 필요하다.
- 글로벌 서비스 : 전 세계 수백 개 엣지 로케이션 활용 (리전은 US-east1 취급)
- 비용 : 데이터 송신/수신 & 엣지 컴퓨팅 & 추가 기능 + 프리티어에서 지원을 많이 해주는 편이다.
주요 개념
- CDN 서버 : 컨텐츠를 본래 서버에서 받아와 캐싱하여 빠르게 컨텐츠를 제공하는 캐시 서버
- 사용자의 지리적 위치와 가까운 CDN 서버에서 응답을 제공해 지연(latency)을 줄임.
- Edge Location : AWS의 CloudFront 등의 CDN 서비스들을 가장 빠른 속도로 캐싱하기 위한 거점, 즉 가장 가까운 데이터센터에서 컨텐츠를 가져오는 지점. → Global Accelerator와 유저를 연결하는 거점
- Regional Edge Cache : Edge Location의 상위 단위, 좀 더 큰 캐싱 거점
- 원본(Origin) : 실제 컨텐츠가 존재하는 서버(EC2, S3 등)
- 배포(Distribution) : CloudFront의 CDN 구분 단위 → 여러 엣지 로케이션으로 구성된 컨텐츠 제공 채널
- 동작(Behavior) : 프로토콜, 캐싱 정책, 로그 등 컨텐츠 전달 방식 설정
주요 기능
- 컨텐츠 가속화 (Content Acceleration)
- 정적 컨텐츠 캐싱 : 이미지, JS, CSS, HTML 같은 정적 컨텐츠를 캐싱하여 빠른 응답 제공
- 동적 컨텐츠 응답 최적화 : API 등의 동적 컨텐츠도 캐싱 및 TLS 및 Keep-Alive 등의 네트워크 최적화로 Acceleration 가능
- 원본 서버(Origin)의 부하 감소 & 정밀한 캐시 정책 적용 가능
- 유연한 원본(Origin) 설정 및 장애 대비
- S3, EC2, ALB, API Gateway, 외부 서버 등 다양한 오리진 지원
- 장애(Failover) 발생 시 백업 오리진으로 자동 전환 및 커스텀 에러 페이지 지원
- HTTPS / TLS 지원 : AWS Certificate Manager를 통해 TLS 인증서를 발급받아 무료로 적용 가능
- 다양한 최적화 및 보안 기능 제공
- 보안 및 접근 제어: S3 Origin에 대한 접근 제어(OAI, OAC) & AWS WAF 연동
- 서버리스 엣지 처리: Lambda@Edge, CloudFront Functions
- 모니터링 및 분석: 로그 저장(S3), CloudWatch, 캐시 히트율 등 확인 가능
- 파일 전송 최적화: 대용량 파일 분할 전송, 압축 등
- 유스케이스
- 이미지, 영상 등 정적 컨텐츠의 빠른 글로벌 응답 제공, 전송 최적화 및 스트리밍 서비스 가속화
- API 응답의 지연을 줄이기 위한 동적 컨텐츠 가속화 활용
- Route 53과 함께 사용하여 도메인 연결 및 HTTPS 인증서 설정 구성 가능
배포 (Distribution)
CloudFront에서 컨텐츠를 전 세계에 전달하기 위해 사용하는 CDN 구성 단위를 배포(Distribution)라고 한다.
하나의 배포는 원본(Origin), 경로 단위의 정책 설정(Behavior)을 포함하고 있으며, 생성 시 고유한 CloudFront 도메인을 자동으로 할당받는다.
- 하나의 배포는 여러 Origin과 Behavior를 포함할 수 있으며, 요청 경로에 따라 라우팅이 달라질 수 있다.
원본 (Origin)
컨텐츠의 실제 출처가 되는 서버를 Origin(원본)이라고 하며, 보통 S3, EC2, ALB, API Gateway, 또는 외부 HTTP 서버 등이 사용된다.
CloudFront는 실제 파일이나 데이터를 보관하는 서버로부터 요청이 들어올 때 캐시가 존재하지 않는다면 원본(Origin)에서 컨텐츠를 가져와 전달한다.
- 특징
- IP 주소는 사용할 수 없으며, 도메인 기반으로 설정해야 한다.
- HTTP 또는 HTTPS 접근 방식을 선택할 수 있다.
- 종류
- Custom Origin : EC2, ALB, Lambda URL, S3 정적 호스팅, 온프레미스 등 S3 외의 HTTP 서버를 대상으로 한다.
- S3 Origin : S3 객체에 대한 직접 POST/PUT 요청 기능 및 접근 제어 기능(OAI / OAC)이 포함된 Origin이다.
- 도메인 지정 규칙 : {bucketname}.s3.{region}.amazoneaws.com으로 지정해야 S3 Origin으로 인식한다.
- 추가 기능
- Origin Group : 여러 Origin을 Primary / Secondary로 묶어 Failover 시나리오를 구성할 수 있다.
- Origin Custom Header : CloudFront가 Origin으로 요청을 보낼 때 커스텀 헤더를 추가할 수 있다. 아래는 대표적인 유스케이스이다.
- 요청 추적 : CloudFront 요청임을 식별할 수 있도록 헤더를 추가한다.
- 보안 강화 : 비공개 인증 헤더를 삽입해 Origin이 CloudFront 요청만 허용하도록 할 수 있다.
- 응답 제어 : A/B 테스트, 환경 분기 등 동적 처리를 위해 헤더 기반으로 응답을 조절할 수 있다.
동작 (Behavior)
Behavior는 CloudFront가 들어오는 요청을 어떻게 처리할지 정의하는 설정의 묶음이다. 특정 경로로 들어오는 요청에 대해 어떤 Origin으로 전달할지, 어떤 방식으로 캐싱하고 응답할지를 세부적으로 지정할 수 있다.
- 요청 경로(Path Pattern)에 따라 Behavior를 구분하여 설정할 수 있다.
- 하나의 배포(Distribution)는 여러 개의 Behavior를 가질 수 있다.
주요 구성 항목
- Origin 설정 : 이 Behavior에 대한 요청을 어떤 Origin(S3, EC2 등)으로 전달할지 지정한다.
- Viewer 설정
- 프로토콜: CloudFront에 접근할 때 HTTP/HTTPS를 어떻게 처리할지 선택 (HTTP and HTTPS / Redirect HTTP to HTTPS / HTTPS only)
- HTTP Method: 허용할 요청 메서드(GET, POST, PUT, DELETE 등)를 선택
- 접근 제한: Presigned URL 또는 Presigned Cookie를 사용하여 접근 제어 가능
- Policy 설정
- Cache Policy (캐시 정책): 특정 요청에 대한 캐시의 동작에 대한 설정 (Cache Key, Cache TTL, 컨텐츠 압축 관련 설정 등)
- Origin Request Policy (원본 요청 정책): CloudFront에서 Origin으로 요청을 보낼 때 포함시킬 HTTP 정보(Header, Query String 등)을 선택하여 요청 가능
- Response Header Policy (응답 헤더 정책) : Origin의 응답을 Viewer에게 제공할 때 추가하거나 제거할 Header 지정 가능 (단, Authorization Header는 설정 불가)
- 기타 기능
- Lambda@Edge / CloudFront Functions를 통해 요청 또는 응답을 실시간으로 조작 가능
- Field Level Encryption을 통해 민감한 데이터 필드 암호화 처리 가능
캐시 정책 (Cache Policy)
CloudFront는 요청된 컨텐츠를 Origin에서 매번 가져오지 않고, 엣지(Edge Location)에 미리 저장해두었다가 빠르게 응답할 수 있다.
이때 캐시 동작 방식을 결정하는 것이 바로 캐시 정책(Cache Policy)이다. 이것은 CloudFront의 Behavior에 연결되어 적용된다
- 캐시의 동작 구조 : 요청에 대해 먼저 Edge Location에서 캐시 데이터 확인 → 없다면 상위인 Regional Edge Cache, 이후 Origin 순으로 요청됨.
- Cache Hit : Edge Location에 캐시 데이터가 존재하여 바로 응답 가능한 경우를 캐시 히트라고 하며, CloudFront를 운영할 때 캐시 히트의 빈도를 높일 수 있도록 하는 것이 중요하다.
- 설정 항목 : Cache Key 구성 기준, TTL, 컨텐츠 압축 등
- Cache TTL : 캐시된 객체의 보관 시간을 설정하는 값
- 구성 항목 : Default TTL(기본), Minimum TTL(최소), Maximum TTL(최대)
- 적용 범위 : 특정 CloudFront 배포의 모든 Object에 대해서 Default TTL 일괄 적용
- 파일 단위에서는 Origin에서 Cache-Control & Expires Header를 통해 개별적 TTL 조절 가능
- Cache-Control : 얼마나 오래 Object를 Cache할 지 기간을 설정
- Expires : Cache가 만료되는 시점을 설정 → CloudFront + 브라우저 모두 영향
- CloudFront의 Min-Max TTL 범위 안에서만 설정 가능
- 파일 단위에서는 Origin에서 Cache-Control & Expires Header를 통해 개별적 TTL 조절 가능
- Cache Key : 캐시 데이터는 Key-Value 형태로 Edge Location에 저장된다. 이때 Key를 구성하는 기준을 의미한다.
- Key의 기본값은 요청 경로(Path)이며, 여기에 Header, Query String, Cookie의 포함 여부를 결정할 수 있다.
- 효율적인 캐시 전략은 이 Cache Key 구성을 얼마나 잘 하는가에 달려 있다.
- 예를 들어 http://example.com/image/banner?location=kr에 대해서 생각해보자.
- 모든 지역에서 동일한 컨텐츠를 제공한다면, 즉 location 파라미터가 실제 응답에 영향을 주지 않는다면, 쿼리스트링을 Cache Key에서 제외하는 것이 더 효율적이다.
- 반대로 지역마다 다른 컨텐츠를 제공한다면(location 파라미터에 따라 응답이 달라진다면), 쿼리 스트링을 Cache Key에 포함시키는 것도 고려할 수 있다.
- Cache TTL : 캐시된 객체의 보관 시간을 설정하는 값
- 캐시 정책의 종류
- Managed Policy: AWS에서 미리 제공하는 기본 정책 사용 (ex : CachingOptimized)
- Custom Policy: 사용자가 직접 캐시 기준을 정의한 정책
CloudFront는 요청 경로별로 서로 다른 동작(Behavior)을 정의하고, 그에 맞는 캐시 정책을 적용할 수 있다. 아래 그림은 /images/*와 /api/* 경로에 대해 실제 설정된 예시이다.
- 이미지 요청 (/images/*)
- 이미지는 변경이 거의 없고, 여러 사용자에게 동일한 응답을 반복적으로 제공해야 하는 정적 컨텐츠의 성격이다. 따라서 리소스를 엣지에서 캐싱하면 응답 속도는 빨라지고, Origin 부하는 줄어든다.
- 캐시 정책(Managed-CachingOptimized)은 TTL을 길게 설정하고, 불필요한 쿼리/헤더/쿠키는 제외하는 정책이다.
- API 요청 (/api/*)
- API 응답은 사용자 상태, 인증 정보, 요청 시간 등에 따라 달라질 수 있는 동적 컨텐츠이다.
- 캐시 정책(Managed-CachingDisabled)으로는 캐시를 아예 하지 않고, 원본 요청 정책(Managed-AllViewer)으로 모든 요청 정보를 Origin에 전달해 정확한 응답을 보장하는 정책을 적용했다.
- 해당 Behavior은 예시일 뿐, API도 모든 요청을 반드시 실시간 처리할 필요는 없으며 캐시를 활용할 수 있다. 공용 데이터, 읽기 중심 API는 목적에 따라 캐싱이 효과적으로 활용될 수 있다. 예를 들어 게시판 조회 등이 있다.
CloudFront 활용
지금부터는 CloudFront를 활용하여 EC2로 배포된 간단한 웹을 Origin Server로 설정하고, CDN의 캐시 활용이 실제 응답에 어떤 영향을 주는지 확인해보려고 한다.
배포(Distribution) 생성 및 원본(Origin) 설정
- CloudFront Distribution(배포)를 생성하면서, EC2 인스턴스를 Origin으로 설정하는 단계이다.
- Origin은 CloudFront가 컨텐츠를 가져오는 실제 서버로, 이 설정이 캐싱 대상의 출처가 된다. 이후 설정될 Behavior에 따라 캐시 전략과 처리 방식이 결정된다.
- 도메인 입력란에는 EC2의 퍼블릭 DNS 주소를 입력하고, 기본 포트는 80으로 설정했다.
- HTTP 또는 HTTPS 프로토콜을 선택할 수 있으며, 이번 실습에서는 HTTP를 사용한다.
디폴트 동작(Behavior) 설정
- 배포 구성 시점에 Default Behavior를 함께 설정해야 한다. 모든 요청(*)에 대한 기본 정책으로서 해당 Behavior가 사용되게 된다. 추후에 경로별 Behavior를 추가하여 세분화할 수 있다.
- HTTP 및 HTTPS 요청을 모두 허용하고, GET과 HEAD 메서드로 제한했다.
- 캐시 정책은 Customize 유형으로 직접 설정했다. 캐시 Key는 오리진의 캐시 헤더를 그대로 사용하도록 설정하고, TTL은 기본 10초로 지정하였다.
결과 확인
- CloudFront 배포를 정상적으로 진행했다면 도메인을 확인할 수 있으며 약간 기다리면 CDN이 활성화된다. 해당 도메인으로 접속하면 원본 서버의 웹 사이트가 브라우저상에 나타나는 것을 확인할 수 있다.
for i in {1..30}; do curl -s https://d2dihhan48ten1.cloudfront.net/; sleep 1; done
- crul 명령어를 통해서 1초 간격으로 30번의 요청을 해 보았다.
- 이 때 Origin 서버의 Access Log의 마지막 Tail 부분을 확인해보면 모든 요청이 Origin까지 전달되지는 않았다.
- 마지막 로그에 찍힌 요청은 10초 간격으로 3건으로, 이는 CloudFront가 캐시된 컨텐츠를 재사용했음을 의미한다.
- 이 때 10초는 캐시 정책의 TTL로 설정했던 기간이었다. CloudFront는 최초 요청 이후 10초 동안 동일한 요청을 캐시에서 처리한 것이다.
CloudFront 활용 : Failover
이어서 추가적으로 Origin 설정으로 Origin Group을 활용하고, Behavior를 변경하여 원본 서버가 비정상일 때 대응할 수 있는 대체 리소스를 제공하는 Failover 대응 방법에 대해서도 알아보자.
CloudFront 단에서의 Failover 구현을 통해서 자동으로 예비 리소스로 전환하여 고가용성을 확보하거나 서비스 장애 안내 등의 높은 사용자 경험을 제공할 수 있다.
이전 포스팅에서는 Route 53에서도 Failover를 구현하였었다. 두 서비스에서의 Failover의 주요 목적은 다음과 같다.
- Route53의 Failover : 도메인 레벨의 가용성 확보가 목적이다. 즉 호스팅하는 도메인에 대한 서비스의 지속성을 위한 Failover를 구현해야 한다.
- CloudFront의 Failover : 컨텐츠 단위의 가용성 확보, 즉 요청에 대한 응답의 지속성이 목적이다. 특정 Origin 서버 단위의 문제에 대응하기 적합하며, 대체 컨텐츠 및 안내 페이지 제공에 활용된다.
Secondary Origin 생성
- 생성했던 배포(Distribution)에서 원본(Origin)을 하나 더 추가해주자.
- 추가할 Origin은 Secondary Origin으로서 활용할 것이며, 서비스 이용 불가능을 안내하는 웹 사이트를 제공하는 EC2 인스턴스를 연결해주었다.
원본 그룹 생성
- Origin Group 기능을 통해 Primary Origin이 비정상일 경우 자동으로 Secondary Origin으로 전환할 수 있다.
- 두 개의 EC2 인스턴스를 Primary와 Secondary로 등록해주었다. Primary는 정상 웹 서비스이며, Secondary는 대체 웹 서비스이다.
- Failover 조건으로는 HTTP 상태 코드 404, 500, 503을 선택하여, 이 응답이 발생하면 자동으로 대체 Origin으로 요청이 전환되도록 설정하였다.
동작(Behavior) 수정
- 기존에 개별 Origin으로 지정되어 있던 기본 동작(Behavior)을 수정하여, 앞서 생성한 Origin Group으로 변경하는 과정이다.
- 경로 패턴이 기본값(*)으로 설정되어 있기 때문에 모든 요청에 대해 Failover가 적용되도록 구성된다.
결과 확인
- 기본적인 상황에서는 Primary Origin에 연결되어 정상 페이지와 함께 인스턴스 ID가 출력된다.
- Primary 인스턴스를 중지시켜 보았다. 즉 서버가 비정상 상황임을 가정하였다. 만약 Failover 처리를 하지 않았다면 503, 504 Error 등이 뜰 것이다.
- 그렇지만 우리는 Failover 처리를 해 두었기 때문에 Secondary Origin으로 연결되는 것을 확인할 수 있다.
References
https://docs.aws.amazon.com/
docs.aws.amazon.com
쉽게 설명하는 AWS 기초 강의 강의 | AWS 강의실 - 인프런
AWS 강의실 | , 안녕하세요. AWS 강의실입니다.AWS 공식 커뮤니티 빌더이자 2만명의 구독자를 보유한 AWS Only 강의 유튜브의 경험으로 AWS를 쉽게 알려드립니다.이 강의는AWS의 서비스 및 활용 지식을
www.inflearn.com
'Backend > AWS' 카테고리의 다른 글
[AWS] Route53 : 라우팅 정책 설정 (+ Failover 웹 호스팅 설정하기) (2) | 2025.05.29 |
---|---|
[AWS] Route53 : DNS 서비스의 이해 (+ 도메인 호스팅 설정하기) (1) | 2025.05.29 |
[AWS + Spring] SNS 활용 : 이벤트 메시지 브로드캐스트 구현 (0) | 2025.05.01 |
[AWS + Spring] SQS 활용 : 메시지 큐 기반 비동기 통신 구현 (Standard & FIFO) (1) | 2025.04.30 |
[AWS] 메시지 서비스의 이해 : SQS & SNS & Kinesis (1) | 2025.04.28 |