학습 목표

Amazon CloudFront — 배포, 오리진, 캐시 동작

CloudFront는 배포(distribution) 단위로 구성합니다. 배포 하나는 콘텐츠를 가져올 오리진(origin) 목록과, 요청 경로에 따라 어떻게 처리할지 정하는 캐시 동작(cache behavior) 목록을 가집니다. 배포를 만들면 d111111abcdef8.cloudfront.net 형태의 도메인 이름이 생기고, 자체 도메인을 쓰려면 대체 도메인 이름(alternate domain name, CNAME)을 등록합니다.

CloudFront 요청이 지나는 4단 경로와 캐시 키 뷰어에서 출발한 요청이 엣지 로케이션, 리전 엣지 캐시, 오리진 순서로 올라가는 왼쪽에서 오른쪽 흐름입니다. 응답이 어느 단계에서 돌아오는지에 따라 세 갈래로 갈립니다. 첫째, 엣지 로케이션 캐시에 적중하면 그 자리에서 즉시 응답합니다. 가장 빠르고 오리진에는 요청이 가지 않습니다. 둘째, 엣지가 미스면 여러 엣지가 공유하는 리전 엣지 캐시로 올라가고, 거기 적중하면 오리진까지 가지 않고 응답합니다. 셋째, 둘 다 미스면 오리진까지 올라가 응답을 받아 내려오면서 캐시에 채웁니다. 세 갈래를 아래쪽에 서로 겹치지 않는 되돌아오는 선으로 그렸습니다. 아래쪽은 캐시 키입니다. 경로는 항상 캐시 키에 들어가고 쿼리 문자열과 헤더와 쿠키는 캐시 정책이 허용한 것만 들어갑니다. 캐시 키에 넣는 항목이 늘어날수록 같은 콘텐츠가 여러 벌로 쪼개져 적중률이 떨어지므로, 적중률은 운이 아니라 캐시 정책 설계의 결과라는 것이 결론입니다. 뷰어 브라우저 · 앱 엣지 로케이션 가장 가까운 지점 여기서 맞으면 끝 리전 엣지 캐시 여러 엣지가 공유 오리진 요청을 줄임 오리진 S3 · ALB 커스텀 오리진 요청 미스 미스 엣지 캐시 히트 — 즉시 응답 리전 엣지 캐시에서 응답 둘 다 미스 — 오리진까지 올라간 뒤 캐시를 채웁니다 캐시 키를 구성하는 요소 — 캐시 정책이 허용한 것만 들어갑니다 경로 항상 포함 쿼리 문자열 정책에서 선택 헤더 정책에서 선택 쿠키 정책에서 선택 캐시 키에 넣는 항목이 늘어날수록 같은 콘텐츠가 여러 벌로 쪼개져 적중률이 떨어집니다 적중률은 운이 아니라 캐시 정책 설계의 결과입니다
CloudFront 요청 처리 경로 — 뷰어 요청이 엣지 로케이션에 도착해 캐시 적중이면 즉시 응답하고, 미스면 리전 엣지 캐시를 거쳐 오리진까지 올라갑니다. 어느 단계에서 돌려주는지를 결정하는 것이 캐시 키와 TTL 설계입니다

오리진 — S3, ALB, 그리고 커스텀 오리진

CloudFront는 오리진을 두 부류로 취급합니다. S3 REST 엔드포인트를 가리키는 S3 오리진과, 그 밖의 모든 것을 가리키는 커스텀 오리진입니다. API 문서는 커스텀 오리진을 "S3 버킷이 아닌 모든 오리진, 단 한 가지 예외가 있다"고 정의하는데, 그 예외가 정적 웹사이트 호스팅으로 구성된 S3 버킷입니다. 웹사이트 엔드포인트는 S3 오리진이 아니라 커스텀 오리진으로 등록해야 합니다.

이 구분이 시험에서 중요한 이유는 OAC를 쓸 수 있는지가 여기서 갈리기 때문입니다. 웹사이트 엔드포인트로 등록한 버킷에는 OAC도 OAI도 붙일 수 없습니다. S3를 비공개로 유지하면서 CloudFront로만 노출하려면 REST 엔드포인트 + OAC 조합이어야 합니다.

오리진 유형별 구성과 제약
오리진 API에서의 구성 오리진 보호 방법
S3 버킷 (REST 엔드포인트) S3OriginConfig OAC 사용 가능 — 버킷을 비공개로 두고 버킷 정책으로 CloudFront만 허용
S3 버킷 (정적 웹사이트 엔드포인트) CustomOriginConfig OAC 사용 불가 — 커스텀 헤더를 요구하도록 구성해 우회
Application Load Balancer CustomOriginConfig 커스텀 헤더 검증, 보안 그룹, WAF 규칙 조합
온프레미스 HTTP 서버 CustomOriginConfig 커스텀 헤더 검증 + 방화벽에서 CloudFront 대역만 허용
VPC 내부 리소스 VpcOriginConfig 퍼블릭 노출 없이 VPC 오리진으로 연결

오리진과의 연결 방식은 OriginProtocolPolicy가 정합니다. 값은 http-only · https-only · match-viewer 세 가지이며, 엔드투엔드 암호화가 요구되면 https-only를 씁니다. 오리진 응답 타임아웃은 기본 30초(1~120초), 연결 유지(keep-alive) 타임아웃은 기본 5초(1~120초)입니다.

오리진을 오리진 그룹(origin group)으로 묶으면 기본 오리진이 지정한 상태 코드를 반환할 때 보조 오리진으로 넘어갑니다. 이것이 CloudFront 수준의 오리진 장애 조치이며, DNS 수준의 장애 조치인 Route 53 장애 조치 라우팅과는 계층이 다릅니다.

캐시 동작과 경로 패턴

배포에는 기본 캐시 동작이 정확히 하나 있어야 하고, 경로 패턴(images/*.jpg 같은)을 가진 추가 캐시 동작을 여러 개 둘 수 있습니다. 요청 경로는 캐시 동작이 나열된 순서대로 비교되며, 처음 일치한 동작이 적용됩니다. 정적 자산과 동적 API를 한 배포에서 다루려면 이 순서를 설계해야 합니다.

캐시 동작마다 대상 오리진, ViewerProtocolPolicy(allow-all · https-only · redirect-to-https), 허용 HTTP 메서드, 압축 여부, 그리고 세 가지 정책을 붙입니다.

캐시 동작에 붙는 세 가지 정책의 역할
정책 무엇을 정하는가 잘못 쓰면
캐시 정책
CachePolicyId
캐시 키에 포함할 헤더 · 쿠키 · 쿼리 문자열과 MinTTL · DefaultTTL · MaxTTL 불필요한 값을 캐시 키에 넣으면 같은 콘텐츠가 여러 벌로 쪼개져 캐시 적중률이 무너집니다
오리진 요청 정책
OriginRequestPolicyId
캐시 키와 무관하게 오리진으로 전달할 헤더 · 쿠키 · 쿼리 문자열 오리진이 필요로 하는 헤더를 빠뜨리면 오리진에서 오동작합니다
응답 헤더 정책
ResponseHeadersPolicyId
CORS 헤더, 보안 헤더, 사용자 지정 응답 헤더 오리진 코드를 고치지 않고 헤더를 붙일 수 있는데 애플리케이션을 수정하려 듭니다

TTL — 무엇이 우선하는가

CloudFront 개발자 안내서는 기본적으로 파일이 24시간 후 만료된다고 명시합니다. 이 기본값은 두 가지 방법으로 바꿉니다. 캐시 동작 전체에 적용하려면 캐시 정책의 MinTTL · DefaultTTL · MaxTTL을 조정하고, 개별 파일만 바꾸려면 오리진이 Cache-Control: max-age 또는 s-maxage, 혹은 Expires 헤더를 붙여 내려보냅니다.

두 헤더를 모두 보내면 CloudFront는 Cache-Control max-age만 봅니다. 반대로 뷰어가 보낸 Cache-Control이나 Pragma 헤더는 무시합니다. 클라이언트가 헤더를 붙여 오리진까지 강제로 다녀오게 만들 수는 없습니다.

응답이 어느 계층에서 돌아오는지에 따라 지연이 달라집니다 — 뷰어 캐시가 가장 가깝고, 엣지 로케이션 · 리전 엣지 캐시 · 오리진 순으로 멀어집니다. 값은 순서를 나타내는 상대 등급이며 절대 시간이 아닙니다

캐시 무효화 — 마지막 수단이다

만료 전에 파일을 엣지 캐시에서 없애려면 무효화(invalidation)를 요청합니다. 경로는 /images/image1.jpg처럼 개별 파일이거나 /images/*처럼 * 와일드카드로 끝날 수 있습니다. 무효화는 대소문자를 구분하고, 쿠키나 헤더로 여러 벌이 캐시된 경우에는 모든 벌이 함께 무효화됩니다. 특정 벌만 골라 지울 수는 없습니다.

AWS 문서는 자주 바뀌는 파일에는 무효화가 아니라 버전이 붙은 파일 이름 (style.v3.css 같은)을 권장합니다. 이유는 세 가지입니다. 사용자 브라우저나 회사 프록시에 남은 캐시까지는 무효화가 닿지 않고, 액세스 로그에서 버전별 결과를 구분할 수 있으며, 되돌리기가 쉽습니다. 월별 무료 한도를 넘긴 무효화 경로에는 요금이 붙는다는 점도 이유에 들어갑니다.

invalidate.sh — 배포 전체를 무효화합니다. 배포 ID는 예시입니다
# 와일드카드를 쓸 때는 셸이 확장하지 않도록 반드시 따옴표로 감쌉니다.
aws cloudfront create-invalidation \
  --distribution-id E1234567890ABC \
  --paths "/*"

# 특정 디렉터리만 비웁니다.
aws cloudfront create-invalidation \
  --distribution-id E1234567890ABC \
  --paths "/images/*" "/index.html"

오리진 보호 — OAC로 S3 버킷을 비공개로 유지한다

CloudFront 뒤에 S3를 두는 구성에서 버킷을 퍼블릭으로 여는 것은 오답입니다. 버킷이 퍼블릭이면 누구나 S3 엔드포인트로 직접 접근할 수 있어 CloudFront의 서명 URL · 지리적 제한 · WAF 규칙이 전부 우회됩니다. 정답은 버킷을 비공개로 두고, CloudFront가 서명한 요청만 버킷 정책으로 허용하는 것입니다.

OAC 로 S3 오리진을 비공개로 유지하는 구성 같은 뷰어에서 출발한 두 경로를 위아래로 나란히 그렸습니다. 위쪽 경로는 CloudFront 를 거칩니다. 원본 액세스 제어인 OAC 가 오리진 요청에 SigV4 서명을 붙여 보내므로 버킷 정책이 이 요청을 허용합니다. 아래쪽 경로는 뷰어가 S3 엔드포인트로 직접 요청을 보내는 경우입니다. 서명이 없으므로 버킷 정책이 거부하고, 그 지점을 가위표로 표시했습니다. 오른쪽 버킷은 퍼블릭 액세스 차단이 켜져 있고 ACL 은 비활성이므로 버킷 정책이 유일한 관문입니다. 아래 상자는 그 버킷 정책의 핵심입니다. Principal 을 cloudfront.amazonaws.com 서비스 주체로 한정하고, Condition 의 AWS:SourceArn 으로 특정 배포 ARN 에서 온 요청만 허용합니다. 이 조건 덕분에 다른 배포나 다른 계정은 같은 버킷을 쓸 수 없습니다. 결론은 버킷을 퍼블릭으로 열어 두고 앞에 CloudFront 를 세우는 구성이 오답이라는 것입니다. 그렇게 하면 S3 엔드포인트로 직접 오는 요청이 CloudFront 를 우회해 그대로 통과하기 때문입니다. 뷰어 브라우저 Amazon CloudFront 배포 (Distribution) OAC — SigV4 서명 추가 서명된 요청 S3 엔드포인트로 직접 요청 — 서명 없음 버킷 정책이 거부합니다 Amazon S3 버킷 퍼블릭 액세스 차단 ON ACL 비활성 버킷 정책이 유일한 관문 버킷 정책 — CloudFront 서비스 주체만, 그것도 이 배포에서만 "Principal": { "Service": "cloudfront.amazonaws.com" } "Action": "s3:GetObject" "Resource": "arn:aws:s3:::my-bucket/*" "Condition": { "StringEquals": { "AWS:SourceArn": "배포 ARN" } } SourceArn 조건이 있어야 다른 배포나 다른 계정이 같은 버킷을 쓰지 못합니다 버킷을 퍼블릭으로 열고 앞에 CloudFront 를 세우는 구성은 오답입니다 S3 엔드포인트로 직접 오는 요청이 CloudFront 를 우회해 그대로 통과하기 때문입니다
OAC로 S3 오리진을 비공개로 유지하는 구성 — 버킷 정책이 cloudfront.amazonaws.com 서비스 주체를 특정 배포 ARN 조건으로만 허용하므로, S3 엔드포인트로의 직접 요청은 차단됩니다

원본 액세스 제어(OAC)

AWS는 S3 오리진에 인증된 요청을 보내는 방법으로 OAC와 구형인 원본 액세스 ID(Origin Access Identity, OAI) 두 가지를 제공하며, 문서는 OAC를 권장합니다. OAC가 지원하는 것 중 OAI가 못 하는 것은 다음 셋입니다.

OAC 자체는 서명 프로토콜(sigv4)과 서명 동작(always · never · no-override)만 정의합니다. 접근을 실제로 허용하는 것은 S3 버킷 정책이며, 이 점이 시험에서 자주 갈립니다.

bucket-policy-oac.json — CloudFront 서비스 주체에게 읽기만 허용하는 버킷 정책. 계정 ID와 배포 ID는 예시입니다
{
  "Version": "2012-10-17",
  "Statement": {
    "Sid": "AllowCloudFrontServicePrincipalReadOnly",
    "Effect": "Allow",
    "Principal": {
      "Service": "cloudfront.amazonaws.com"
    },
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::example-static-assets/*",
    "Condition": {
      "StringEquals": {
        "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/E1234567890ABC"
      }
    }
  }
}

AWS:SourceArn 조건이 없으면 다른 계정의 아무 배포나 이 버킷을 오리진으로 삼을 수 있습니다. 조건을 빼먹은 정책은 "CloudFront만 허용했다"고 착각하기 쉬운 대표적인 잘못된 구성입니다.

오리진을 감추는 것과 콘텐츠를 볼 자격이 있는 사람만 보게 하는 것은 다른 문제입니다. 후자는 서명 URL 또는 서명 쿠키로 해결합니다. 캐시 동작에 신뢰할 수 있는 키 그룹(TrustedKeyGroups)을 연결하면 그 동작에 매칭되는 모든 요청에 서명이 요구됩니다. 서명은 키 그룹에 등록된 공개 키에 대응하는 개인 키로 만듭니다.

서명 URL과 서명 쿠키의 선택 기준
기준 서명 URL 서명 쿠키
대상 범위 개별 파일 (설치 파일 하나 내려받기 등) 여러 파일 (HLS 영상 조각 전체, 구독자 전용 영역 전체)
URL 변경 URL에 서명 파라미터가 붙습니다 현재 URL을 그대로 둘 수 있습니다
클라이언트 요구 쿠키를 지원하지 않는 클라이언트에서도 동작합니다 쿠키를 지원해야 합니다
둘 다 쓸 때 서명 URL이 우선합니다. 뷰어가 서명 URL로 요청하면 CloudFront는 서명 쿠키를 보지 않습니다

지리적 제한

CloudFront의 지리적 제한 기능은 국가 단위로 동작하며, 허용 목록(allow list) 또는 차단 목록(block list) 중 하나를 씁니다. 차단된 요청에는 403 Forbidden이 반환되고, 이 오류 응답은 기본적으로 10초 동안 캐시됩니다.

중요한 제약은 지리적 제한이 배포 전체에 적용된다는 것입니다. 콘텐츠 일부에만 다른 제한을 걸어야 하면 배포를 나누거나, 도시 · 우편번호 단위처럼 국가보다 세밀한 기준이 필요하면 서드파티 지오로케이션 서비스와 서명 URL을 조합해야 합니다.

TLS 종료 지점과 ACM 인증서

CloudFront는 뷰어와의 TLS를 엣지에서 종료합니다. 대체 도메인 이름을 쓰려면 인증서가 필요한데, 여기서 리전 제약이 하나 붙습니다. CloudFront API 문서는 CloudFront가 미국 동부(버지니아 북부) 리전 us-east-1의 ACM 인증서만 지원한다고 명시합니다. 서울 리전에서 발급한 인증서를 CloudFront에 붙일 수 없다는 뜻입니다.

SSLSupportMethod는 sni-only가 권장값입니다. SNI를 지원하지 않는 뷰어까지 받으려면 vip를 쓸 수 있으나 AWS는 권장하지 않고 추가 요금이 발생한다고 안내합니다. MinimumProtocolVersion은 콘솔에서 "보안 정책"으로 표시되며, 허용할 최소 TLS 버전과 암호 스위트를 함께 정합니다.

WAF와 Shield가 붙는 지점

AWS WAF의 웹 ACL은 범위(scope)가 두 가지입니다. CLOUDFRONT는 CloudFront 배포에 붙는 전역 범위이고, REGIONAL은 Application Load Balancer · Amazon API Gateway · AWS AppSync · Amazon Cognito 사용자 풀 같은 리전 리소스에 붙습니다.

연결 방법도 다릅니다. 리전 리소스는 AssociateWebACL API로 연결하지만, CloudFront는 배포 구성의 WebACLId 필드에 웹 ACL ARN을 넣어 연결합니다. 또한 CLOUDFRONT 범위의 웹 ACL은 us-east-1 엔드포인트에서 만들고 관리해야 합니다.

AWS Shield Standard는 모든 CloudFront 배포와 Route 53 호스팅 영역에 자동으로 적용됩니다. Shield Advanced는 별도 구독이며 대응 팀 지원과 공격 대응 기능이 추가됩니다. WAF는 계층 7 규칙, Shield는 DDoS 완화라는 역할 분담을 기억합니다.

엣지에서 코드 실행 — CloudFront Functions와 Lambda@Edge

요청과 응답을 엣지에서 손보는 방법은 두 가지입니다. CloudFront Functions는 CloudFront에 내장된 JavaScript 실행 환경이고, Lambda@Edge는 AWS Lambda의 확장으로 하나의 리전에 게시한 함수를 CloudFront가 전 세계에 복제합니다.

CloudFront Functions와 Lambda@Edge의 차이
항목 CloudFront Functions Lambda@Edge
언어 JavaScript Node.js, Python
연결 가능한 이벤트 viewer-request, viewer-response 둘뿐 viewer-request, viewer-response, origin-request, origin-response 넷 전부
실행 시간 서브밀리초 뷰어 이벤트 최대 5초, 오리진 이벤트 최대 30초
네트워크 접근 불가 가능
파일 시스템 접근 불가 가능
요청 본문 접근 불가 가능
배포 방식 CloudFront 안에서 작성 · 테스트 · LIVE 스테이지 게시 Lambda 함수 버전 ARN을 연결 (별칭이나 $LATEST 불가)

판단 기준은 단순합니다. 캐시 키 정규화 · 헤더 조작 · URL 재작성 · 토큰 검증처럼 요청 하나를 짧게 손보는 일은 CloudFront Functions입니다. 외부 서비스 호출, AWS SDK 사용, 요청 본문 읽기, 무거운 처리가 필요하면 Lambda@Edge입니다. 그리고 오리진 쪽 이벤트에서 뭔가를 해야 한다면 선택의 여지가 없습니다 — CloudFront Functions는 오리진 이벤트에 붙지 않습니다.

CloudFront와 비용 구조

CloudFront는 성능 서비스이면서 비용 최적화 레버이기도 합니다. 구조는 이렇습니다. 캐시가 적중하면 오리진까지 올라가는 요청이 사라지므로 오리진의 송신 트래픽과 요청 처리 부하가 함께 줄어듭니다. S3 오리진이면 GET 요청 수가 줄고, EC2나 ALB 오리진이면 인스턴스 사용량이 줄어듭니다.

비용을 다루는 문항은 금액을 계산시키지 않습니다. 구조적으로 트래픽이 줄어드는 안을 고르게 합니다. 판단 축은 셋입니다.

Amazon Route 53 — 호스팅 영역과 레코드

Route 53은 도메인 등록 · 권한 있는 DNS · 상태 확인 세 가지를 합친 서비스입니다. DNS 레코드는 호스팅 영역(hosted zone) 안에 만듭니다.

퍼블릭 호스팅 영역과 프라이빗 호스팅 영역
항목 퍼블릭 호스팅 영역 프라이빗 호스팅 영역
응답 대상 인터넷의 모든 리졸버 연결한 VPC 안에서만
API 구성 HostedZoneConfig.PrivateZone이 false PrivateZone이 true이고 VPC를 연결
용도 공개 서비스의 도메인 내부 서비스 이름 (db.internal.example.com 등)
제약 - CloudFront 배포를 가리키는 별칭 레코드를 만들 수 없습니다

별칭 레코드와 CNAME

별칭(alias) 레코드는 Route 53 고유 기능으로, AWS 리소스를 직접 가리킵니다. API에서는 AliasTarget을 넣고 ResourceRecords와 TTL을 생략합니다. TTL은 대상 리소스의 값을 따릅니다.

별칭 레코드와 CNAME 레코드의 차이
항목 별칭(Alias) CNAME
영역 정점(example.com) 사용 가능 사용 불가 — DNS 표준이 정점에 CNAME을 금지합니다
대상 CloudFront 배포, ELB, S3 정적 웹사이트, API Gateway, VPC 인터페이스 엔드포인트, 같은 영역의 다른 레코드 임의의 도메인 이름
TTL 지정하지 않습니다 (대상의 TTL을 따릅니다) 직접 지정합니다
대상 상태 반영 EvaluateTargetHealth로 대상 리소스의 상태를 상속할 수 있습니다 불가 — 별도 상태 확인이 필요합니다

Route 53 라우팅 정책 8종 SAA 빈출

Route 53의 라우팅 정책은 8종입니다. 시중 자료 상당수가 지리 근접과 IP 기반을 빠뜨려 6종이나 7종으로 적는데, Route 53 API의 레코드 구조에는 여덟 가지를 구분하는 멤버가 모두 있습니다. 여덟 가지를 전부 알고 있어야 "이 중 해당하지 않는 것은" 형태의 문항에서 실점하지 않습니다.

Route 53 라우팅 정책 8종이 같은 질의에 응답하는 방식 위쪽에 같은 DNS 질의 하나를 놓고, 그 아래 여덟 줄에 라우팅 정책 8종을 나란히 세워 각 정책의 레코드 식별 멤버, 상태 확인 연동 여부, 그리고 같은 질의에 무엇을 응답하는지를 비교합니다. 단순 라우팅은 식별 멤버가 없는 유일한 정책이며 레코드를 그대로 하나 돌려줍니다. 가중치 기반은 Weight 로 비율을 정해 그중 하나를 고릅니다. 지연 시간 기반은 Region 을 보고 가장 빠른 리전을 돌려줍니다. 장애 조치는 Failover 값과 HealthCheckId 가 함께 필요하며 상태 확인이 필수인 유일한 정책입니다. 지리적 위치는 GeoLocation 으로 질의가 어디서 왔는지를 보고, 지리 근접은 GeoProximityLocation 과 편향값으로 리소스가 어디에 있는지를 봅니다. 다중값 응답은 MultiValueAnswer 로 정상인 대상 여러 개를 함께 돌려주고, IP 기반은 CidrRoutingConfig 로 클라이언트 IP 대역별 대상을 돌려줍니다. 지금은 단순 라우팅이 선택된 상태입니다. 아래 안내 상자가 선택된 정책의 쓰임을 설명합니다. 맨 아래 주의 문구가 밝히듯, 지리 근접과 IP 기반이 빠진 6종이나 7종 목록은 옛 자료입니다. 같은 질의에 정책마다 무엇을 응답하는가 app.example.com · A 레코드 질의 라우팅 정책 레코드의 식별 멤버 상태 확인 이 질의에 대한 응답 단순 (Simple) 없음 — 유일한 예외 연동 없음 레코드 하나 그대로 가중치 (Weighted) Weight 선택 비율대로 고른 하나 지연 시간 (Latency) Region 선택 가장 빠른 리전 장애 조치 (Failover) Failover + HealthCheckId 필수 정상인 쪽 하나 지리 위치 (Geolocation) GeoLocation 선택 질의 출발지 기준 지리 근접 (Geoproximity) GeoProximityLocation 선택 리소스 위치 기준 다중값 (Multivalue) MultiValueAnswer 권장 정상인 것 여러 개 IP 기반 (IP-based) CidrRoutingConfig 선택 IP 대역별 대상 선택: 단순 (Simple) — 대상이 하나뿐이고 조건 분기가 없을 때 쓰는 기본값입니다 단순 라우팅을 제외한 7종은 모두 SetIdentifier 가 필수입니다 지리 근접과 IP 기반이 빠진 6종 · 7종 목록은 옛 자료입니다 — 정책은 8종입니다
같은 DNS 질의에 대해 라우팅 정책 8종이 각각 어떤 레코드를 응답하는지 비교합니다 — 정책마다 필요한 식별 멤버와 상태 확인 연동 방식이 다릅니다
Route 53 라우팅 정책 8종 — 식별 멤버와 언제 쓰는가
라우팅 정책 레코드의 식별 멤버 언제 쓰는가
단순(Simple) 없음 대상이 하나뿐이고 조건 분기가 없을 때. 기본값이며 SetIdentifier가 필요 없는 유일한 정책입니다
가중치 기반(Weighted) Weight 트래픽을 비율로 나눌 때. 카나리 배포와 블루/그린 전환, A/B 테스트
지연 시간 기반(Latency) Region 여러 리전에 같은 서비스를 배포해 두고 가장 빠른 리전으로 보낼 때
장애 조치(Failover) Failover (PRIMARY / SECONDARY) + HealthCheckId 액티브-패시브 구성. 기본 사이트가 죽으면 대기 사이트로 넘길 때
지리적 위치(Geolocation) GeoLocation (대륙 · 국가 · 미국 주 코드) 사용자가 어디에 있는지로 콘텐츠를 나눌 때. 언어별 사이트, 저작권 · 규제 대응
지리 근접(Geoproximity) GeoProximityLocation (리전 · 로컬 존 그룹 · 좌표 + Bias) 리소스가 어디에 있는지를 기준으로 가까운 쪽에 보내되, 편향값으로 담당 영역 크기를 조절할 때
다중값 응답(Multivalue answer) MultiValueAnswer 여러 IP를 무작위에 가깝게 돌려주고 상태 확인으로 비정상 대상을 빼고 싶을 때
IP 기반(IP-based) CidrRoutingConfig (CIDR 컬렉션 + 위치 이름) 특정 클라이언트 IP 대역을 지정한 엔드포인트로 보낼 때. 통신 사업자별 경로 최적화 등

지연 시간 · 지리적 위치 · 지리 근접 — 시험이 노리는 3자 구분

셋 다 "가까운 데로 보낸다"처럼 들리지만 판단 기준이 완전히 다릅니다. 문제에서 어떤 단어가 쓰였는지로 갈립니다.

지연 시간 기반 · 지리적 위치 · 지리 근접의 판단 기준
정책 무엇을 보고 결정하는가 문제에 나오는 신호
지연 시간 기반 Route 53이 측정한 사용자와 리전 사이의 실제 지연 "가장 빠른 응답", "최저 지연 시간", "성능"
지리적 위치 질의가 어디에서 왔는가 (대륙 · 국가 · 미국 주) "이 나라 사용자에게는 이 콘텐츠", "규제상 특정 국가 차단", "언어별 사이트"
지리 근접 질의 위치와 리소스 위치의 거리. Bias로 담당 영역을 넓히거나 좁힘 "트래픽을 한쪽 리전으로 점진적으로 옮기고 싶다", "특정 리소스가 더 넓은 지역을 맡게 하라"

헷갈릴 때 쓰는 규칙은 이렇습니다. 지연 시간은 네트워크 성능이 기준이라 지리적으로 가까운 리전이 답이 아닐 수도 있습니다. 지리적 위치는 성능이 아니라 규정과 콘텐츠의 문제입니다. 지리 근접은 거리 기반이면서 편향값으로 비율을 조정할 수 있는 유일한 정책입니다.

상태 확인과 장애 조치 라우팅

Route 53 상태 확인은 여덟 가지 유형이 있고, 크게 세 부류입니다. 엔드포인트를 직접 찔러 보는 유형, 다른 상태 확인을 집계하는 유형, 그리고 외부 신호를 읽는 유형입니다.

Route 53 상태 확인 유형
유형 판정 방식
HTTP / HTTPS TCP 연결 후 요청을 보내고 200 이상 400 미만의 상태 코드를 기다립니다
HTTP_STR_MATCH / HTTPS_STR_MATCH 응답 본문의 앞부분 5,120바이트에서 지정한 문자열을 찾습니다
TCP TCP 연결이 되는지만 봅니다. HTTP가 아닌 서비스에 씁니다
CALCULATED 하위 상태 확인들의 정상 개수를 HealthThreshold와 비교합니다
CLOUDWATCH_METRIC CloudWatch 경보 상태를 읽습니다. 프라이빗 리소스처럼 외부에서 찌를 수 없는 대상에 씁니다
RECOVERY_CONTROL Route 53 Application Recovery Controller의 라우팅 컨트롤 상태(ON/OFF)를 따릅니다

요청 간격(RequestInterval)은 10초 또는 30초이며 지정하지 않으면 30초입니다. 실패 임계값(FailureThreshold)은 기본 3회로, 연속 3회 실패해야 상태가 뒤집힙니다. 두 값 모두 생성 후에는 바꿀 수 없습니다.

장애 조치 라우팅

장애 조치 라우팅은 같은 이름과 유형의 레코드 두 개에 PRIMARY와 SECONDARY를 지정하고 HealthCheckId를 붙여 구성합니다. 동작은 다음과 같습니다.

장애 조치 별칭 레코드를 쓸 때는 EvaluateTargetHealth를 true로 설정해야 합니다. 그러지 않으면 대상이 죽어도 Route 53이 알아채지 못합니다.

failover-records.json — 장애 조치 레코드 쌍. 도메인과 상태 확인 ID는 예시입니다
{
  "Comment": "액티브-패시브 장애 조치",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "www.example.com",
        "Type": "A",
        "SetIdentifier": "primary-seoul",
        "Failover": "PRIMARY",
        "HealthCheckId": "abcdef01-2345-6789-abcd-ef0123456789",
        "TTL": 60,
        "ResourceRecords": [{ "Value": "192.0.2.10" }]
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "www.example.com",
        "Type": "A",
        "SetIdentifier": "secondary-tokyo",
        "Failover": "SECONDARY",
        "HealthCheckId": "fedcba98-7654-3210-fedc-ba9876543210",
        "TTL": 60,
        "ResourceRecords": [{ "Value": "198.51.100.10" }]
      }
    }
  ]
}

AWS Global Accelerator와 CloudFront의 선택

Global Accelerator는 애니캐스트 고정 IP를 발급하고, AWS 엣지 네트워크에서 받은 트래픽을 AWS 글로벌 네트워크를 통해 최적의 엔드포인트로 보냅니다. IP 세트 하나는 최대 2개의 IP 주소를 가지며, 듀얼스택으로 만들면 IPv4 2개와 IPv6 2개를 받습니다.

핵심 차이는 캐시하지 않는다는 점입니다. Global Accelerator는 콘텐츠를 저장하지 않고 경로만 개선합니다. 리스너 프로토콜은 TCP와 UDP이며, 엔드포인트로는 Application Load Balancer, Network Load Balancer, 탄력적 IP 주소, EC2 인스턴스를 등록합니다.

CloudFront 와 Global Accelerator 의 경로 대비 두 서비스의 트래픽 경로를 위아래 두 레인으로 나누어 비교합니다. 위쪽 레인은 Amazon CloudFront 입니다. 사용자의 HTTP 또는 HTTPS 요청이 가장 가까운 엣지 로케이션에 도착하고, 캐시에 적중하면 오리진까지 가지 않고 엣지에서 바로 응답합니다. 미스일 때만 AWS 백본을 타고 오리진으로 올라갑니다. 콘텐츠를 엣지에 두고 돌려주는 것이 목적이므로 캐시 가능한 콘텐츠에서 가장 큰 효과를 냅니다. 아래쪽 레인은 AWS Global Accelerator 입니다. 애니캐스트 고정 IP 두 개를 받아 두면 사용자는 언제나 가장 가까운 엣지로 들어오고, 트래픽은 캐시 없이 AWS 백본을 타고 리전의 ALB, NLB, EC2, 탄력적 IP 같은 엔드포인트로 곧장 전달됩니다. TCP 와 UDP 를 그대로 다루므로 캐시할 수 없는 트래픽이나 게임, 음성, IoT 같은 비 HTTP 워크로드가 대상입니다. 아래쪽 세 상자는 보호 장치가 붙는 지점입니다. AWS WAF 는 CloudFront 와 ALB 와 API Gateway 에 붙고, Shield Standard 는 모든 고객에게 기본 적용되며, Shield Advanced 는 CloudFront, Global Accelerator, Route 53, 탄력적 IP 등에 붙습니다. Amazon CloudFront — 캐시 가능한 HTTP 응답을 엣지에서 돌려줍니다 사용자 HTTP/HTTPS 엣지 로케이션 · 캐시 적중하면 여기서 응답 오리진까지 가지 않습니다 미스일 때만 백본 경유 오리진 Amazon S3 · ALB · 커스텀 AWS Global Accelerator — 캐시 없이 백본으로 곧장 보냅니다 사용자 TCP · UDP 애니캐스트 고정 IP 2개 가장 가까운 엣지로 진입 캐시하지 않습니다 AWS 백본 직행 리전 엔드포인트 ALB · NLB · EC2 · 탄력적 IP 보호 장치가 붙는 지점 AWS WAF CloudFront · ALB API Gateway 에 붙습니다 Shield Standard 모든 고객에 기본 적용 별도 설정이 없습니다 Shield Advanced CloudFront · Accelerator Route 53 · 탄력적 IP 캐시할 수 있으면 CloudFront · 고정 IP 나 비 HTTP 면 Global Accelerator
CloudFront와 Global Accelerator의 경로 대비 — 한쪽은 캐시 가능한 HTTP 응답을 엣지에서 돌려주고, 다른 쪽은 애니캐스트 고정 IP로 받은 TCP/UDP 트래픽을 AWS 백본에 태워 리전 엔드포인트로 보냅니다
Amazon CloudFront와 AWS Global Accelerator 비교
항목 Amazon CloudFront AWS Global Accelerator
주 용도 HTTP/HTTPS 콘텐츠 캐싱과 전송 TCP/UDP 트래픽의 경로 최적화와 장애 조치
프로토콜 HTTP, HTTPS TCP, UDP
캐싱 엣지에서 캐시 캐시하지 않음
진입 주소 배포 도메인 이름 (DNS로 해석) 정적 애니캐스트 IP 2개 (IP 세트당 최대 2개)
엔드포인트 S3, ALB, 커스텀 오리진, VPC 오리진 ALB, NLB, 탄력적 IP, EC2 인스턴스
트래픽 조절 캐시 동작 · 경로 패턴 엔드포인트 그룹별 트래픽 다이얼(%)과 엔드포인트 가중치
상태 확인 오리진 그룹의 장애 조치 상태 코드 10초 또는 30초 간격(기본 30초), 임계값 기본 3회
API 리전 us-east-1에서 관리 us-west-2에서 관리

판단 규칙은 두 문장으로 정리됩니다. 캐시할 수 있는 HTTP 콘텐츠라면 CloudFront입니다. 비 HTTP 프로토콜이거나, 클라이언트가 IP를 고정으로 알아야 하거나, 리전 간 장애 조치를 IP 변경 없이 하고 싶다면 Global Accelerator입니다. 게임 서버(UDP), VoIP, IoT 장비처럼 방화벽에 IP를 등록해야 하는 환경이 후자의 전형입니다.

흔한 오해

시험 포인트 정리

확인 문제

이 장의 핵심을 확인하는 10문항입니다. 키보드만으로 완주할 수 있습니다 — 숫자키 1~5로 선택지를 고르고 Enter로 제출합니다.

학습용 유형 연결형과 순서 배열 문항이 섞여 있을 수 있습니다. 이 두 유형은 암기 확인에 효율이 좋아서 기본개념 확인 문제에만 넣었으며, 실제 SAA-C03 시험에는 출제되지 않습니다.

이어서 볼 곳

공식 문서 출처

이 장의 개념 서술과 API 동작은 모두 아래 문서에서 확인했습니다.