Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

CDN

CDN(Content delivery Network)란 지리적으로 분산된 프락시 서버(proxy server)와 데이터센터로 구성된 분산 네트워크를 의미한다. CDN의 목표는 서비스를 지리적으로 분산하여 가용성과 성능을 높이는데 있다.

CDN은 인터넷이 사람과 기업을 위한 미션 크리티컬한 매체가 되는 1990년대 후반에 등장했다. 오늘날 CDN은 웹객체(텍스트, 이미지, 스크립트), 다운로드 가능한 파일(영상, 소프트웨어, 문서), 애플리케이션(전자상거래, 포털), 라이브 스트리밍, 주문형 스트리밍 등 다양한 영역에서 활용하고 있다.

CDN은 인터넷 생태계의 한 계층이며, 미디어회사와 전자 상거래 회사들은 최종 사용자에게 콘텐츠를 전달하기 위해서 CDN을 사용한다.

CDN 서비스는 특정 단체 혹은 기업이 무료 혹은 비용을 받고 제공한다.

특징

  1. 지역성(Locality)
  2. 다수의 복제본
  3. 레이턴시 최소화
CDN의 최종 목표는 "레이턴시의 최소화"이며, 이 목적을 달성하기 위해서 지역성과 다수의 복제본 특징을 구축한다.

CDN은 데이터를 소비하는 지역 근처에 스토리지를 배치함으로써 레이턴시를 최소화한다. 데이터를 소비하는 지역이 여러 개일 경우 다수의 복제본을 두는 것으로 소비자가 지역적으로 가까운 서버에서 데이터에 접근 할 수 있도록 한다.

구성요소

 CDN 구조

CDN은 각 지역에 파견나간 컨텐츠(데이터) 중계자라고 생각하면 된다.
  1. 컨텐츠 제공자 : CDN은 원본(Origin)의 중계자이다. 컨텐츠 제공자가 원본을 제공한다.
  2. 캐시서버 : CDN은 원본을 가지지 않는다. 원본에 대한 캐시를 가진다. 이 캐시에 원본을 복제한 컨텐츠를 저장한다.
  3. 원본(Origin) : 원본 컨텐츠
  4. 데이터 : 원본으로 부터 복제되어서 만들어진 서비스 데이터로 고객이 받아본다.
중계자라고 생각하면 하는 일은 간단하다.
  1. 권한/인증 : 데이터 원본 소유자임을 인증한다.
  2. Report : 컨텐츠 제공자에게 원본 컨텐츠를 요청한다.
  3. 컨텐츠 제공 : 컨텐츠 소비자가 컨텐츠를 요청하면 데이터를 제공(Delivery)한다.

기술

CDN은 지리적으로 분산된 여러 지역에 CND노드로 구성된다. 이들 CDN 노드는 인터넷 백본을 통해서 연결이 되며, 이를 통해서 고속으로 컨텐츠를 배포 한다. CDN의 이점은 레이턴시 개선, 컨텐츠의 글로벌 가용성 증가, 대역폭 비용 감소 등이 포함된다. CDN을 구성하는 노드와 서버의 수는 아키텍처에 따라 다르다. 보통 PoPs(points of presence)라고 불리는 원격 데이터센터에 수천에서 수만대의 노드로 구성된다.

컨텐츠 요청은 여러가지 알고리즘을 이용하여 최적의 노드로 전달되도록 한다. 가장 일반적인 알고리즘은 사용자와 가까운 위치의 노드에 접속 하도록 하는 것이다. 혹은 사용자의 위치에서 레이턴시가 가장 짧은 노드로 접속하도록 한다. 비용이 중요하다면 저렴한 위치를 선택하도록 할 수 있다.

대부분의 CDN 제공 업체는 미국, 글로벌, 아시아 태평양 등과 같이 원하는 지역에 전개된 PoP 세트를 통해서 서비스를 제공한다. 이러한 PoP 세트를 "애지", "에지 노드", "에지 서버", "에지 네트워크"라고 한다. 에지라고 하는 이유는 해당 CDN이 사용자로 부터 가장 가까운 에지가 되기 때문이다.

 Content Delivery Network Overview

Amazon CloudFront 소개

Amazon CloudFront는 개발자 친화적인 환경에서 짧은 지역 속도와 빠른 전송 속도로 데이터, 동영상, 애플리케이션 및 API를 전 세계 고객에게 안전하게 전송하도록 도와주는 고속의 CDN 서비스다.

CloudFront는 네트워크 및 애플리케이션 계층 DDoS 공격을 비로해 여러 유형의 공격으로부터 보호하기 위한 AWS Shield, AWS Web Application Firewall, Route 53과 완벽하게 통합되어 있으며, 필드 수준 암호화 및 HTTPS 를 포함한 대부분의 고급 보안 기능을 제공한다.

CloudFront는 Amazon S3, Amazon EC2, Elastic Load Balancing와 같은 AWS 서비스 혹은 사용자 지정 HTTP 서비스를 오리진으로 할 수 있다. 프로그래밍 가능한 엣지 컴퓨팅 기능은 AWS Lambda@Edge를 사용하여 CloudFront를 통해 컨텐츠 전송을 사용자 지정할 수 있다.

CloudFront를 이용한 컨텐츠 제공 방법

  • CloudFront는 기본적으로 오리진(Origin)으로 부터 분산된 캐시 서비스다. CloudFront는 원본으로 S3 버킷, ELB, 소유하고 있는 다른 HTTP 서버로 부터 컨텐츠(파일)을 읽어와서 CloudFront의 엣지 로케이션에 배포한다. 최대 25개의 Amazon S3 버킷, 채널 HTTP 서버를 결합하여 원본으로 설정 할 수 있다.
  • 일단 오리진 컨텐츠가 있어야 한다. 우리나라에서 서비스를 시작했다면, 원본 컨텐츠는 서울리전(ap-northeast-2)에 있는 S3, ELB 등에 존재 할 것이다. 이 서비스는 전 세계 유저들이 사용한다. 북미, 유럽에서의 접근은 느릴 수 밖에 없을 것이다. CloudFront를 이용해서 파일들을 분산하기로 했다.
  • CloudFront 설정을 통해서 오리진파일의 위치를 설정하고 배포즉시 CDN을 활성화 할지와 같은 세부 설정을 한다.
  • 파일을 모든 사람이 사용할지 일부 사용자로만 액세스를 제한할지를 설정 한다.
  • 특정 국가의 사용자가 콘텐츠에 액세스하는 것을 차단할지 등을 설정 할 수 있다.
  • 배포를 시작하면 CloudFront는 (컨텐츠를 포함한)모든 구성요소를 엣지 로케이션으로 보낸다.
  • HTTP와 HTTPS 프로토콜 모두 처리한다.
  • 지원하는 HTTP 메소드는 아래와 같다.
    • DELETE
    • GET
    • HEAD
    • OPTIONS
    • PATCH
    • POST
    • PUT
  • CloudFront는 GET 및 HEAD 요청에 대한 응답을 항상 캐싱하며, OPTIONS 요청을 캐싱하도록 CloudFront를 구성 할 수 있다.
  • 예전의 CDN은 파일만을 처리했으나, 요즘에는 컴퓨팅 처리까지 가능하다. Lambda@Edge를 이용해서 AWS Lambda를 CloudFront 엣지 로케이션에서 실행하도록 할 수 있다. CloudFront 배포를 Lambda@Edge 함수와 연결하면 CloudFront가 CloudFront 엣지 로케이션에서 요청 및 응답을 가로채고 이를 이벤트로 Lambda 함수를 실행 할 수 있다.

캐시 설정 과 가용성 최적화

CloudFront를 사용하는 목적 중 하나는 오리진 서버에서 직접 응답해야 하는 요청의 수를 줄이기 위함이다. CloudFront 캐싱을 사용하면 사용자에게 더 가까운 CloudFront 엣지 로케이션에서 더 많은 객체가 제공된다. 따라서 오리진 서버에 걸리는 부하가 줄어들고 지연시간이 단축된다.

  • 엣지 캐시에서 CloudFront가 처리 할 수 있는 요청이 많을 수록 오리진으로의 사용자 요청이 줄어든다.
  • 모든 요청에 대해서 CloudFront 캐시에서 직접 처리되는 요청의 비율을 "캐시 적중률"이라고 한다. CloudFront 콘솔에서 요청의 적중, 누락, 오류 백분율을 확인 할 수 있다.
  • Cache-Control max-age 명령을 추가하도록 오리진을 구성하고 max-age에 긴 값을 지정해서 캐시 주기를 늘릴 수 있다. 이를 통해서 캐시 적중률을 최적화 할 수 있다.
  • CloudFront Origin Shield를 이용하면 오리진 앞에 캐싱 계층을 추가 할 수 있다. 이를 통해서 캐시 적중률을 높일 수 있다.
 Origin Shield

  • 오리진 장애조치를 사용하여 CloudFront를 설정하는 것으로 고가용성 시스템을 구축 할 수 있다. 2개의 오리진(기본 오리진 및 보조 오리진)이 포함된 오리진 그룹을 만든다. 기본 오리진을 사용 할 수 없거나 실패하는 경우 특정 HTTP 응답 상태코드에 대해서 자동으로 보조 오리진으로 전환한다. 아래와 같은 문제에 대응 한다.
    • 기본 오리진이 장애조치를 위해서 기 설정된 HTTP 상태 코드를 반환한다.
    • CloudFront가 기본 오리진 연결에 실패한다.
    • 기본 오리진의 응답이 너무 오래 걸린다.(시간 초과)
  • CloudFront는 파일을 CloudFront 캐시에 보관하는 시간을 제어할 수 있다. 이 시간을 조정해서 동적 컨텐츠를 제공 할 수 있다. 시간이 늘어나면 캐시 적중률이 높아지므로 사용자에게 제공되는 성능이 빨라질 것이고, 오리진의 부하가 줄어들 것이다. 캐시 기간이 지난 상태에서 이 파일에 대한 요청을 받으면 CloudFront는 이 요청을 오리진 서버로 전달하여 최신 버전의 파일이 있는지 확인한다. 오리진의 응답은 파일 변경 여부에 따라 달라진다.
    • 이미 최신버전이 있는 경우 304 Not Modified를 반환한다.
    • 최신 버전이 없는 경우 오리진은 200 OK와 함께 최신 버전의 파일을 반환한다.
  • Cache-Contrl 와 Expires 헤더를 사용하여 객체가 캐시에 머무르는 시간을 제어 할 수 있다.
    • Cache-Control: max-age명령을 사용해서 이 객체를 캐시에 보관하려는 시간을 지정 할 수 있다. CloudFront가 지원하는 최소 만료시간은 0초, 최대 만료시간은 100년이다.
    • Expires 헤더 필더를 사용해서 만료시간을 지정할 수 있다.

CloudFront 모니터링 및 로깅

  • CloudFront는 Amazon CloudWatch 와 통합되어 있으며 배포당 6개의 운영 지표를 자동으로 게시한다.
  • 기본 지표 외에 추가 비용이 드는 추가 지표를 활성화 할 수 있다.
  • 기본 CloudFront 배포 지표는 아래와 같다.
    • 요청 : HTTP, HTTPS 요청에 대해 CloudFront에서 수신한 최종 사용자 요청 수
    • 다운로드된 바이트 : GET, HEAD, OPTIONS 요청에 대해 다운로드한 총 바이트 수
    • 업로드된 바이트 : POST, PUT 요청을 사용하여 오리진에 CloudFront와 함께 업로드한 총 바이트 수
    • 4xx 오류 발생률
    • 5xx 오류 발생률
    • 총 오류 발생률
  • 추가 CloudFront 지표는 아래와 같다.
    • 캐시 적중률
    • 오리진 지연시간 : CloudFront에 요청을 수신한 시점부터, 오리진에 제공되는 요청까지의 응답에 소요되는 총시간. 첫번째 바이트 대기시간 혹은 time-to-first-byte라고도 한다.
    • 상태 코드별 오류 발생률
  • Lambda@Edge 함수 지표는 아래와 같다.
    • 5xx 오류 발생률
    • Lambda 실행 오류
    • 잘못된 Lambda 응답
    • Lambda 제한
  • CloudWatch 경보를 사용하여 지정한 기간동안 단일 지표를 감시 할 수 있다. 지표가 지정된 임계값을 초과하면 Amazon SNS 주제 또는 AWS Auto Scaling 정책으로 알림이 전송된다.

CloudFront와 보안

  • 전송중 데이터 암호화 : 최종 사용자가 HTTPS를 사용하여 파일을 요청하도록 CloudFront를 구성한다. 또한 CloudFront가 오리진 파일을 받을 때 HTTPS를 사용하도록 구성 할 수 있다.
  • 서명된 URL 또는 서명된 쿠키 사용 : 서명된 URL 또는 서명된 쿠키를 사용하여 CloudFront를 통해 프라이빗 컨텐츠를 제공 할 수 있다. 이러한 기능은 유료 사용자와 같은 선택된 사용자를 대상으로 컨텐츠를 제한하는데 사용 할 수 있다.
  • Amazon S3 버킷의 콘텐츠에 대한 액세스 제한 : CloudFront 서명된 URL 또는 서명된 쿠킬르 사용하여 콘텐츠에 대한 액세스를 제안하는 경우 사용자가 파일에 대한 직접 URL을 사용하여 파일에 접근 하는 것을 원치 않을 것이다. 대신 CloudFrontURL을 사용해야만 파일에 액세스하도록 허용 할 수 있다. Amazon S3를 CloudFront의 오리진으로 사용할 경우 OAI(오리진 액세스 아이디)를 설정하여 콘텐츠에 대한 직접 액세스를 관리 할 수 있다. OAI는 CloudFront 사용자 자격증명이므로 전체 또는 일부의 S3 콘텐츠를 보호할 수 있다.
  • AWS WAF를 사용하여 웹 액세스 제어 목록(웹 ACL)을 만들어 콘텐츠에 대한 액세스를 제한 할 수 있다. IP 주소 또는 쿼리 문자열의 값등의 조건에 따라 CloudFront는 요청된 컨텐츠에 대한 접근을 제어 할 수 있다.
  • 지리적 제한 사용 : 지리적 제한을 사용하여 특정 지리적 위치에 있는 사용자가 CloudFront 배포를 통해 제공한 콘텐츠에 액세스 하는 것을 차단 할 수 있다.
  • 필드레벨 암호화 : 필드레벨 암호화는 특정 데이터를 보호하고 특정 애플리케이션에서만 이를 볼 수 있도록 기능하는 추가적인 보안레이어를 제공한다. 필드레벨 암호화를 사용하면 POST 요청의 필드 세트와 암호화에 사용할 퍼블릭키를 지정 할 수 있다. 한 요청에서 최대 10개의 데이터 필드를 암호화 할 수 있다. 필드 레벨 암호화가 포함된 HTTPS 요청은 오리진에 전송 할 때도 계속 암호화되어서 민감한 데이터의 침해 또는 우발적인 데이터 손실의 위험을 줄인다. 크래딧 번호에 대한 액세스를 필요로 하는 결제 시스템과 같이 민감한 데이터에 대한 액세스를 필요로 하는 곳에 사용 할 수 있다.
 필드레벨 암호화

규정 준수

  • PCI DSS(Payment Card industry/Data Security Standard)의 준수
  • HIPAA(Health Insurance Portability and Accountability Act) 규정 준수. HIPAA는 보건의료체계의 효율성을 높이고자 의료관행 행정 및 금융 자료의 전자교환을 표준화하는 법률이다.
  • SOC 1, SOC 2, SOC 3를 포함한 시스템 및 조직제어(SOC) 측정값을 준수한다.

제한

  • CloudFront를 통해 전송할 수 있는 단일 파일의 최대 크기는 20GB이다.
  • 배포 당 데이터 전송률은 40Gbps다.
  • 배포 당 제공 할 수 있는 파일은 무제한이다.