Site icon 지락문화예술공작단

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

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

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

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

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

현대적 애플리케이션에 필요한 성능과 확장성을 제공하기 위해 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 — 더 짧은 지연 시간으로 엣지에서 코드 실행을 위한 신규 기능

Exit mobile version