Amazon CloudFront Functions — 더 짧은 지연 시간으로 엣지에서 코드 실행을 위한 신규 기능

Amazon CloudFront Functions — 더 짧은 지연 시간으로 엣지에서 코드 실행을 위한 신규 기능

Amazon CloudFront를 사용하면 짧은 지연 시간과 빠른 전송 속도로 전 세계 고객에게 데이터, 비디오, 애플리케이션 및 API를 안전하게 전송할 수 있습니다. 사용자 지정 경험을 제공하고 가장 낮은 지연 시간을 제공하기 위해 대부분의 최신 애플리케이션은 엣지에서 특정 형태의 로직(Logic)을 실행합니다. 엣지에 로직을 적용하는 사용 사례는 두 가지 주요 범주로 그룹화할 수 있습니다.

  • 첫 번째 범주는 객체가 캐시에 없을 때 실행되는 컴퓨팅 집약적인 복잡한 작업입니다. 여러 복잡한 사용자 지정을 구현할 수 있는 완전히 프로그래밍 가능한 서버리스 엣지 컴퓨팅 환경을 제공하기 위해 2017년에 Lambda@Edge출시하였습니다. Lambda@Edge 함수는 리전 엣지 캐시(일반적으로 클라이언트가 접속하는 CloudFront 엣지 로케이션에 가장 가까운 AWS 리전)에서 실행됩니다. 예를 들어, 비디오 또는 오디오를 스트리밍할 때 Lambda@Edge를 사용하여 적절한 세그먼트를 즉시 만들고 제공할 수 있으므로 오리진 확장성에 대한 필요성을 줄일 수 있습니다. 또 다른 일반적인 사용 사례는 Lambda@Edge 및 Amazon DynamoDB를 사용하여 단축된 사용자 친화적인 URL을 전체 URL 방문 페이지로 변환하는 것입니다.
  • 사용 사례의 두 번째 범주는 수명이 매우 짧은 함수로 실행할 수 있는 간단한 HTTP 요청/응답 조작입니다. 이러한 사용 사례에는 모든 요청에서 실행할 수 있는 성능, 확장성 및 비용 효율성을 갖춘 유연한 프로그래밍 환경이 필요합니다.

이 두 번째 범주의 사용 사례를 지원하기 위해 새로운 서버리스 스크립팅 플랫폼, CloudFront Functions의 가용성을 발표하게 되어 정말 기쁩니다. 이를 통해 Lambda@Edge 요금의 약 1/6의 비용으로 218개 이상의 CloudFront 엣지 로케이션에서 경량 JavaScript 코드를 실행할 수 있습니다.

아키텍처 다이어그램.

CloudFront Functions는 웹 요청의 경량 처리에 이상적입니다. 예를 들어, 다음과 같습니다.

  • 캐시 키 조작 및 정규화: HTTP 요청 속성(예: URL, 헤더, 쿠키 및 쿼리 문자열)을 변환하여 캐시 키를 구성합니다. 캐시 키는 캐시에 있는 객체의 고유 식별자이며, 객체가 이미 캐싱되었는지 여부를 확인하는 데 사용됩니다. 예를 들어, 최종 사용자의 디바이스 유형을 포함하는 헤더를 기반으로 캐싱하여 모바일 및 데스크톱 사용자를 위한 두 가지 버전의 콘텐츠를 생성할 수 있습니다. 요청 속성을 변환하여 여러 요청을 단일 캐시 키 항목으로 정규화하고 캐시 적중률을 크게 향상시킬 수도 있습니다.
  • URL 다시 쓰기 및 리디렉션: 요청을 다른 URL로 리디렉션하는 응답을 생성합니다. 예를 들어, 인증되지 않은 사용자를 제한된 페이지에서 로그인 양식으로 리디렉션합니다. URL 다시 쓰기는 A/B 테스트에도 사용할 수 있습니다.
  • HTTP 헤더 조작: 요청/응답 헤더를 보거나 추가, 수정 또는 삭제합니다. 예를 들어, HTTP Strict Transport Security(HSTS) 헤더를 응답에 추가하거나 요청과 함께 오리진으로 전달되도록 클라이언트 IP 주소를 새 HTTP 헤더에 복사합니다.
  • 액세스 권한 부여: 요청을 허용/거부하기 위해 HMAC 토큰 또는 JSON 웹 토큰(JWT)과 같은 사용자 생성 토큰을 생성 및 검증하여 CloudFront를 통해 전송되는 콘텐츠에 대한 액세스 제어 및 권한 부여를 구현합니다.

현대적 애플리케이션에 필요한 성능과 확장성을 제공하기 위해 CloudFront Functions는 AWS Lambda 및 Lambda@Edge에서 사용하는 가상 머신(VM) 기반 격리 대신, 새로운 프로세스 기반 격리 모델을 사용합니다. 이를 위해 네트워크 및 파일 시스템 액세스 방지와 같은 몇 가지 제한 사항을 적용해야 했습니다. 또한, 함수는 1밀리 초 미만으로 실행됩니다. 이러한 방식으로 초당 수백만 건의 요청을 처리할 수 있으며 모든 함수 실행에서 뛰어난 성능을 제공합니다. 함수는 전체 콘텐츠 전송 네트워크(CDN) 성능에 거의 영향을 미치지 않습니다.

Lambda@Edge와 마찬가지로, CloudFront Functions는 CloudFront에서 생성하는 이벤트에 대한 응답에서 코드를 실행합니다. 구체적으로 설명하면, CloudFront가 뷰어로부터 요청을 수신한 후(뷰어 요청), 그리고 CloudFront가 뷰어에게 응답을 전달하기 전에(접속 응답) CloudFront Functions를 트리거할 수 있습니다.

CloudFront가 오리진에 요청을 전달하기 전(오리진 요청), 그리고 CloudFront가 오리진으로부터 응답을 수신한 후에(오리진 응답) Lambda@Edge를 트리거할 수도 있습니다. 캐싱 전후에 콘텐츠를 조작해야 하는지 여부에 따라 CloudFront Functions 및 Lambda@Edge를 함께 사용할 수 있습니다.

아키텍처 다이어그램.

네트워크 액세스 또는 더 긴 실행 시간과 같이 CloudFront Functions에서 지원할 수 없는 일부 Lambda@Edge 기능이 필요한 경우 CloudFront에서 콘텐츠를 캐싱하기 전후에 계속 Lambda@Edge를 사용할 수 있습니다.

아키텍처 다이어그램.

CloudFront Functions 및 Lambda@Edge의 차이점을 이해하는 데 도움이 되도록 다음과 같은 간단한 비교를 제공합니다.

CloudFront 함수 Lambda@Edge
런타임 지원 JavaScript
(ECMAScript 5.1 호환)
Node.js, Python
실행 위치 218개 이상의 CloudFront
엣지 로케이션
13개의 CloudFront
리전별 엣지 캐시
지원되는 CloudFront 트리거 뷰어 요청
뷰어 응답
뷰어 요청
뷰어 응답
오리진 요청
오리진 응답
최대 실행 시간 1밀리초 미만 5초(뷰어 트리거)
30초(오리진 트리거)
최대 메모리 2MB 128MB(뷰어 트리거)
10GB(오리진 트리거)
총 패키지 크기 10KB 1MB(뷰어 트리거)
50MB(오리진 트리거)
네트워크 액세스 아니요
파일 시스템 액세스 아니요
요청 본문에 대한 액세스 아니요
요금 프리 티어 사용 가능
요청당 비용 청구
프리 티어 없음, 요청 및
함수 지속 시간당 비용 청구

이제 실제로 어떻게 작동하는지 알아보겠습니다.

콘솔에서 CloudFront Functions 사용
뷰어가 위치한 국가에 따라 웹 사이트의 콘텐츠를 사용자 지정하려고 합니다. 이를 위해 S3 버킷을 오리진으로 사용하여 생성한 CloudFront 배포를 사용합니다. 그런 다음, 캐시 키에 CloudFront-Viewer-Country 헤더(뷰어가 있는 국가의 2자리 국가 코드 포함)를 포함하는 캐시 정책을 생성합니다. CloudFront Functions는 오리진 정책 또는 캐시 키 정책에 포함된 경우에만 CloudFront 지리적 위치 또는 디바이스 탐지 헤더와 같은 CloudFront 생성 헤더를 볼 수 있습니다.

CloudFront 콘솔의 왼쪽 표시줄에서 [함수(Functions)]를 선택하고 [함수 생성(Create function)]을 선택합니다. 함수에 이름을 지정하고 [계속(Continue)]을 클릭합니다.

콘솔 스크린샷.

여기에서는 다음 단계를 사용하여 함수의 수명 주기를 따를 수 있습니다.

  1. 코드를 제공하여 함수를 구축합니다.
  2. 샘플 페이로드를 사용하여 함수를 테스트합니다.
  3. 개발 단계에서 라이브 스테이지로 함수를 게시합니다.
  4. 함수를 하나 이상의 CloudFront 배포와 연결합니다.

콘솔 스크린샷.

1. [구축(Build)] 탭에서는 테스트를 위한 [개발(Development)] 스테이지와 하나 이상의 CloudFront 배포에서 사용할 수 있는 [라이브(Live)] 스테이지와 같은 각 함수의 두 가지 스테이지에 액세스할 수 있습니다. 개발 스테이지를 선택한 상태에서 함수의 코드를 입력하고 [저장(Save)]을 클릭합니다.

function handler(event) {
  var request = event.request;
  var supported_countries = ['de', 'it', 'fr'];
  if (request.uri.substr(3,1) != '/') {
    var headers = request.headers;
    var newUri;
    if (headers['cloudfront-viewer-country']) {
      var countryCode = headers['cloudfront-viewer-country'].value.toLowerCase();
      if (supported_countries.includes(countryCode)) {
        newUri = '/' + countryCode + request.uri;
      }
    }
    if (newUri === undefined) {
      var defaultCountryCode = 'en';
      newUri = '/' + defaultCountryCode + request.uri;
    }
    var response = {
      statusCode: 302,
      statusDescription: 'Found',
      headers: {
        "location": { "value": newUri }
      }
    }
    return response;
  }
  return request;
}

함수는 CloudFront에서 설정한 CloudFront-Viewer-Country 헤더의 콘텐츠를 확인합니다. 지원되는 국가 중 하나가 포함되어 있고 URL에 국가 접두어가 아직 포함되지 않은 경우 URL 경로의 시작 위치에 국가가 추가됩니다. 그렇지 않으면 요청을 변경 없이 전달합니다.

2. [테스트(Test)] 탭에서 이벤트 유형([뷰어 요청(Viewer Request)]), 스테이지(현재 [개발(Development)]) 및 샘플 이벤트를 선택합니다.

콘솔 스크린샷.

아래에서는 HTTP 메서드를 선택한 다음, URL의 경로와 선택적으로 사용할 클라이언트 IP를 편집하여 Input 이벤트를 사용자 지정할 수 있습니다. 사용자 지정 헤더, 쿠키 또는 쿼리 문자열을 추가할 수도 있습니다. 여기에서는 모든 기본값을 그대로 두고 CloudFront-Viewer-Country 헤더를 FR(프랑스) 값으로 설정하여 추가합니다. 선택적으로 시각적 편집기를 사용하는 대신, 함수에 전달되는 JSON 페이로드를 편집하여 입력 이벤트를 사용자 지정할 수 있습니다.

콘솔 스크린샷.

[테스트(Test)] 버튼을 클릭하고 출력을 확인합니다. 예상대로 요청이 리디렉션됩니다(HTTP 상태 코드 302). 응답 헤더에서 요청이 리디렉션되는 위치는 프랑스에 거주하는 뷰어를 위한 사용자 지정 콘텐츠를 제공하기 위해 /fr/로 시작됨을 확인할 수 있습니다. 테스트가 예상대로 작동하지 않으면 함수 로그를 확인할 수 있습니다. 코드에서 console.log()를 사용하여 자세한 디버깅 정보를 추가할 수도 있습니다.

콘솔 스크린샷.

[출력(Output)]에서 HTTP 상태 바로 위에 이 실행에 대한 [컴퓨팅 사용률(Compute utilization)]이 표시됩니다. 컴퓨팅 사용률은 함수가 함수 실행에 걸린 시간을 허용된 최대 시간에 대한 백분율로 표시하는 0에서 100 사이의 숫자입니다. 여기에서 21의 컴퓨팅 사용률은 함수가 허용된 최대 시간의 21% 수준에서 완료되었음을 의미합니다.

3. URL과 헤더의 다양한 구성을 사용하여 더 많은 테스트를 실행한 다음 [게시(Publish)] 탭으로 이동하여 개발 스테이지에서 라이브 스테이지로 함수를 복사합니다. 이제 함수를 기존 배포와 연결할 수 있습니다.

콘솔 스크린샷.

4. [연결(Associate)] 탭에서 [배포(Distribution)], [이벤트 유형(Event type)](뷰어 요청 또는 응답) 및 [캐시 동작(Cache behavior)](현재 배포에는 [기본값(*)(Default (*))] 캐시 동작만 있음)을 선택합니다. [연결 추가(Add association)]를 클릭하고 대화 상자에서 확인합니다.

콘솔 스크린샷.

이제 [연결(Associate)] 탭 맨 아래에 함수 연결이 표시됩니다.

콘솔 스크린샷.

서로 다른 두 위치에서 이 구성을 테스트하기 위해 미국 동부(버지니아 북부) 리전과 EU(파리) 리전에 대해 하나씩, 2개의 Amazon Elastic Compute Cloud(EC2) 인스턴스를 시작합니다. SSH를 사용하여 연결하고 cURL을 사용하여 CloudFront 배포에서 객체를 가져옵니다. 이전에는 배포의 오리진으로 사용되는 S3 버킷에 2개의 객체를 업로드했습니다. 하나는 프랑스에 거주하는 고객에 대한 객체(fr/ 접두사 사용)이고 다른 하나는 지원되는 국가에 거주하지 않는 고객에 대한 객체(en/ 접두사 사용)입니다.

AWS 명령줄 인터페이스(CLI)를 사용하여 두 객체를 나열합니다.

$ aws s3 ls --recursive s3://BUCKET
2021-04-01 13:54:20         13 en/doc.txt
2021-04-01 13:54:20          8 fr/doc.txt

미국 동부(버지니아 북부) 리전의 EC2 인스턴스에서 다음 명령을 실행하여 객체를 다운로드합니다.

[us-east-1]$ curl -L https://d2wj2l15gt32vo.cloudfront.net/doc.txt 
Good morning

그런 다음, EU(파리) 리전에서 동일한 명령을 실행합니다.

[eu-west-3]$ curl -L https://d2wj2l15gt32vo.cloudfront.net/doc.txt
Bonjour

예상대로 동일한 URL에서 다른 결과를 얻습니다. cURL이 수신하는 리디렉션을 따르도록 -L 옵션을 사용합니다. 이러한 방식으로 각 명령은 두 개의 HTTP 요청을 실행합니다. 첫 번째 요청은 CloudFront 함수에서 HTTP 리디렉션을 수신하고 두 번째 요청은 리디렉션을 따르며 URL에 사용자 지정 경로(/en/ 또는 /fr/)를 포함하므로 함수에서 수정되지 않습니다.

리디렉션의 실제 위치와 모든 HTTP 응답 헤더를 보기 위해 cURL을 -i 옵션과 함께 사용합니다. 다음은 미국에서 실행하는 EC2 인스턴스의 응답 헤더입니다. 함수는 버지니아의 엣지 로케이션에서 실행됩니다.

[us-east-1]$ curl -i https://d2wj2l15gt32vo.cloudfront.net/doc.txt 
HTTP/2 302 
server: CloudFront
date: Thu, 01 Apr 2021 14:39:31 GMT
content-length: 0
location: /en/doc.txt
x-cache: FunctionGeneratedResponse from cloudfront
via: 1.1 cb0868a0a661911b98247aaff77bc898.cloudfront.net (CloudFront)
x-amz-cf-pop: IAD50-C2
x-amz-cf-id: TuaLKKg3YvLKN85fzd2qfcx9jOlfMQrWazpOVmN7NgfmmcXc1wzjmA==

다음은 프랑스에서 실행하는 EC2 인스턴스의 응답 헤더입니다. 여기서 함수는 파리 근처의 엣지 로케이션에서 실행됩니다.

[eu-west-3]$ curl -i https://d2wj2l15gt32vo.cloudfront.net/doc.txt
HTTP/2 302 
server: CloudFront
date: Thu, 01 Apr 2021 14:39:26 GMT
content-length: 0
location: /fr/doc.txt
x-cache: FunctionGeneratedResponse from cloudfront
via: 1.1 6fa25eadb94abd73b5efc56a89b2d829.cloudfront.net (CloudFront)
x-amz-cf-pop: CDG53-C1
x-amz-cf-id: jzWcbccJiTDRj22TGwsn_

가용성 및 요금
CloudFront Functions는 오늘부터 신규 및 기존 배포에서 사용할 수 있습니다. AWS 관리 콘솔, AWS 명령줄 인터페이스(CLI), AWS SDKAWS CloudFormation에서 CloudFront Functions를 사용할 수 있습니다. CloudFront Functions에서는 호출 수로 비용을 지불합니다. AWS 프리 티어의 일부로 CloudFront Functions를 시작해볼 수 있습니다. 자세한 내용은 CloudFront 요금 페이지를 참조하세요.

지금 바로 CloudFront Functions를 사용하여 애플리케이션의 엣지에 사용자 지정 로직을 추가해보세요.

Danilo

Source: Amazon CloudFront Functions — 더 짧은 지연 시간으로 엣지에서 코드 실행을 위한 신규 기능

About KENNETH 19688 Articles
지락문화예술공작단

Be the first to comment

Leave a Reply

Your email address will not be published.


*


이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.