엣지 함수
개요
엣지 함수는 CloudFront를 통해 엣지에 사용자 지정 로직을 추가할 수 있는 강력한 개발자 도구입니다. 엣지 함수를 통해 개발자는 지연 시간을 줄이면서 웹 애플리케이션을 강화하고 완전히 분산된 애플리케이션을 구축할 수 있습니다. 엣지 함수는 다음과 같은 용도로 사용할 수 있습니다.
- 고급 HTTP 로직 구현. CloudFront는 HTTP에서 HTTP로의 리디렉션, 요청 경로에 따른 다른 오리진으로의 라우팅 등과 같은 기본 규칙을 제공합니다. 엣지 함수를 사용하면 CloudFront의 기본 기능을 뛰어넘어 캐시 키 정규화, URL 재작성, HTTP CRUD 작업 등과 같은 고급 HTTP 로직을 구현할 수 있습니다.
- 애플리케이션 지연 시간 감소. 일부 애플리케이션 로직을 오리진에서 엣지로 오프로드하여 캐싱(예: A/B 테스트)을 활용하거나 사용자에게 더 가까운 위치에서 실행(예: HTTP 리디렉션, URL 단축, HTML 렌더링)할 수 있습니다. 마이크로 서비스 또는 마이크로 프론트 아키텍처에서는 엣지 함수를 사용하여 공통 로직(예: 권한 부여 및 인증)을 각 구성 요소에 개별적으로 구현하는 대신 애플리케이션의 진입점에서 한 번 구현할 수 있습니다.
- 애플리케이션 경계 보호. 엣지 함수를 사용하여 액세스 제어, 고급 지역 차단과 같은 보안 제어를 엣지에 적용할 수 있습니다. 이를 통해 오리진의 공격 표면을 줄이고 불필요한 확장 비용을 없앨 수 있습니다.
- 요청 라우팅. 엣지 함수를 사용하여 애플리케이션 로직에 따라 각 HTTP 요청을 특정 오리진에 라우팅할 수 있습니다. 이는 고급 장애 조치, 오리진 로드 밸런싱, 다중 리전 아키텍처, 마이그레이션, 애플리케이션 라우팅 등과 같은 시나리오에 유용할 수 있습니다.
CloudFront를 사용한 엣지 함수 유형
CloudFront는 CloudFront Functions와 Lambda@Edge라는 두 가지 유형의 엣지 함수를 제공합니다. CloudFront Functions는 밀리초 미만의 시작 시간을 제공하며 초당 수백만 건의 요청을 처리할 수 있도록 즉시 확장되므로 경량 로직(캐시 정규화, URL 재작성, 요청 조작, 권한 부여 등)에 적합합니다. Lambda@Edge는 AWS Lambda의 확장으로, 리전 엣지 캐시에 분산된 방식으로 실행됩니다. Lambda@Edge는 비용과 지연 시간 오버헤드가 더 높기는 하지만 더 많은 컴퓨팅 성능과 외부 네트워크 호출과 같은 고급 기능을 제공합니다. 이 설명서에서는 두 런타임 간의 차이점에 대한 자세한 내용을 제공합니다.
엣지 함수는 진행 중인 HTTP 요청 및 응답을 조작하거나 CloudFront에서 업스트림으로 이동하는 대신 단순히 요청을 종료하고 응답을 생성하는 데 사용할 수 있습니다. CloudFront에서 요청 수명 주기 동안 다양한 이벤트에서 실행되도록 엣지 함수를 구성할 수 있습니다.
- 최종 사용자 이벤트: CloudFront 캐시를 확인하기 전에 모든 요청에 대해 실행됩니다. 캐시 정규화, 권한 부여 또는 고유 쿠키 배치에 이상적입니다. CloudFront Functions는 최종 사용자 이벤트에만 사용할 수 있습니다.
- 오리진 이벤트: 파일을 가져오기 위해 오리진으로 이동하기 전에 캐시 미스(cache miss) 시 실행됩니다. 캐싱하기 전에 콘텐츠를 생성하거나 응답을 조작하고 요청을 다른 오리진로 동적으로 라우팅하는 것이 이상적입니다.
다음과 같은 모범 사례를 살펴보세요.
- 엣지 함수를 가장 구체적인 캐시 동작에 연결하여 불필요한 함수 실행 비용을 방지합니다.
- 최종 사용자 이벤트에서 실행되는 사용 사례의 경우 CloudFront Functions를 선택하고, 오리진 이벤트에서 실행되는 사용 사례의 경우 Lambda@Edge를 선택합니다.
- CloudFront Functions의 기능이 로직의 요구 사항을 충족할 수 없는 경우에만 최종 사용자 이벤트에서 Lambda@Edge로 대체하세요.
- 최종 사용자 이벤트에서는 Lambda@Edge 또는 CloudFront Functions 중 하나를 사용할 수 있지만 둘 다 사용할 수는 없습니다(예: 최종 사용자 요청 이벤트 시 Lambda@Edge, 최종 사용자 응답 이벤트 시 CloudFront Functions).
- 애플리케이션을 설계할 때 엣지 함수에 대한 제한 사항에 대해 알아보세요.
CloudFront Functions
CloudFront Functions는 JavaScript로 작성되며, CloudFront Console 및 API에서 전체적으로 구축하고 테스트할 수 있으며, us-east-1 리전의 CloudWatch Logs에 로깅할 수 있습니다. 개발자는 컴퓨팅 사용률이 80% 미만인 함수를 작성해야 합니다. 컴퓨팅 사용률 할당량을 초과하는 실행은 CloudFront에 의해 조절되며, CloudWatch 지표를 사용하여 모니터링할 수 있습니다.
이 프로그래밍 모델 안내서는 CloudFront Functions를 작성하는 데 도움이 됩니다. 다음은 독일에서 오는 사용자를 현지화된 독일어 콘텐츠로 리디렉션하는 함수의 예시입니다.
function handler(event) {
var request = event.request;
var headers = request.headers;
var host = request.headers.host.value;
var country = 'DE';
var newurl = `https://${host}/de/index.html`;
if (headers['cloudfront-viewer-country']) {
var countryCode = headers['cloudfront-viewer-country'].value;
if (countryCode === country) {
var response = {
statusCode: 302,
statusDescription: 'Found',
headers: { location: { value: newurl } },
};
return response;
}
}
return request;
}
CloudFront Functions는 CloudFront KeyValueStore를 통해 영구 데이터를 코드와 별도로 분리하고 저장할 수 있는 기능도 제공합니다. KeyValueStore는 대량 리디렉션 매핑과 같은 임베디드 데이터로 인해 함수의 크기 할당량이 초과되는 상황에 특히 적합합니다. 또한 함수를 수정하지 않고도 영구 데이터를 업데이트할 수 있다는 이점도 있습니다.
Lambda@Edge
Lambda@Edge 함수는 NodeJS 또는 Python으로 작성할 수 있습니다. 이를 통해 구성 가능한 메모리(최대 10GB)를 갖춘 Lambda 컨테이너의 성능을 활용할 수 있습니다. Lambda@Edge 함수는 AWS Lambda를 기반으로 하기 때문에 Lambda 콘솔에서 작성되며 us-east-1에서만 독점적으로 작성됩니다. 작성을 완료하고 CloudFront 배포에 배포하면 CloudFront는 전역적으로 해당 리전 엣지 캐시에 복제합니다. Lambda@Edge 함수를 CloudFront 캐시 동작과 연결하려면 먼저 새 버전을 게시한 다음 대상 캐시 동작에 배포해야 합니다. 모든 Lambda@Edge 함수 업데이트는 새로운 CloudFront 배포를 트리거합니다(초기 연결만 CloudFront 배포를 트리거하는 CloudFront Functions와 대조적). Lambda@Edge 함수를 개발할 때는 다음 사항을 고려하세요.
- Lambda@Edge 사용 모범 사례, 특히 실행 동시성 관리에 대해 알아보세요. 동시성은 리전 엣지 캐시 리전별로 동시에 실행되는 Lambda 컨테이너의 수를 측정합니다. 각 리전에서 Lambd@Edge 동시성에는 버스팅 속도와 절대 제한 측면에서 할당량이 있습니다.
- Lambda@Edge 함수에서 외부 데이터를 가져오는 모범 사례에 대해 알아보세요.
- Lambda@Edge 로그는 로그가 실행된 리전의 CloudWatch Logs로 전송되며 로그 그룹 이름 앞에 us-east-1이 붙습니다. Lambda @Edge 로그를 단일 리전에서 중앙 집중화해야 하는 경우 다음과 같은 Lambda@Edge 로그 집계자 솔루션을 살펴보세요. 참고로 함수를 실행할 때마다 CloudWatch Logs에 로그가 생성됩니다(함수 코드에 명시적으로 작성된 경우에만 로그가 생성되는 CloudFront Functions와 대조적). 연결된 IAM 역할에서 CloudWatch로 로그를 전송할 권한을 제거하여 Lambda@Edge 로그를 비활성화할 수 있습니다.
이 프로그래밍 모델 안내서는 Lambda@Edge 함수를 작성하는 데 도움이 됩니다. 다음은 규제 목적으로 독일 사용자로부터 오는 요청을 독일에 기반을 둔 서버로 라우팅하는 함수의 예시입니다.
'use strict';
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
if (request.headers['cloudfront-viewer-country']) {
const countryCode = request.headers['cloudfront-viewer-country'][0].value;
if (countryCode === 'DE') {
const domainName = 'origin.example.de';
request.origin.custom.domainName = domainName;
request.headers['host'] = [{ key: 'host', value: domainName }];
}
}
return request;
};