반응형
AWS CloudFront와 Lambda를 함께 사용하면, 콘텐츠 전송 네트워크(CDN)에서의 요청을 처리하고, 콘텐츠를 더 동적으로 수정하거나 사용자 맞춤화된 응답을 생성하는 등 다양한 기능을 구현할 수 있습니다. 이를 통해 웹 애플리케이션의 성능을 향상시키고, 서버리스 방식으로 손쉽게 처리할 수 있습니다.
CloudFront와 Lambda를 함께 사용하는 주요 방식은 Lambda@Edge라는 서비스입니다. 이를 통해 CloudFront 배포의 엣지 로케이션에서 직접 Lambda 함수가 실행될 수 있습니다.
1. Lambda@Edge 개요
- Lambda@Edge는 AWS Lambda의 확장으로, CloudFront의 엣지 로케이션에서 Lambda 함수를 실행하여, 클라이언트와 오리진 서버 사이에서 발생하는 트래픽을 처리할 수 있게 합니다.
- 요청이나 응답을 수정하고, 사용자의 요구에 맞는 맞춤형 처리를 할 수 있는 기능을 제공합니다.
2. Lambda@Edge 사용 사례
Lambda@Edge는 여러 가지 시나리오에서 유용하게 사용할 수 있습니다.
1) 요청 수정 (Request Manipulation)
- 헤더 추가/변경: 예를 들어, 요청에 특정 사용자 에이전트 또는 인증 토큰을 헤더로 추가하여 오리진 서버에서 이 정보를 사용할 수 있도록 할 수 있습니다.
- 리디렉션 처리: URL 요청을 조건에 따라 다른 경로로 리디렉션할 수 있습니다.
- 캐시 키 변경: 요청의 일부를 바탕으로 캐시 키를 동적으로 생성하거나 수정할 수 있습니다.
2) 응답 수정 (Response Manipulation)
- 응답 헤더 추가/변경: 예를 들어, CORS 헤더를 동적으로 추가하거나 보안 관련 헤더를 응답에 삽입할 수 있습니다.
- 응답 본문 수정: HTML, JSON 등의 응답 본문을 동적으로 수정하여 사용자에게 더 맞춤화된 콘텐츠를 제공할 수 있습니다.
- 오리진에서 응답 수정: 오리진에서 반환된 콘텐츠를 캐시 전에 수정하는 작업이 가능.
3) A/B 테스트
- 사용자에게 특정 콘텐츠를 제공하는 대신, Lambda@Edge를 사용하여 실시간으로 사용자 요청에 따라 다양한 콘텐츠를 제공하고 A/B 테스트를 구현할 수 있습니다.
4) 인증 및 권한 부여
- 요청에 대한 인증을 Lambda@Edge에서 처리하여, 사용자가 특정 콘텐츠를 요청할 때 인증이 되어 있는지 확인할 수 있습니다.
5) 서버리스 리디렉션
- Lambda@Edge는 서버리스로 구현되므로, URL 리디렉션을 서버리스 방식으로 처리할 수 있습니다.
3. Lambda@Edge와 CloudFront 연결
Lambda@Edge 함수를 CloudFront 배포에 연결하려면 다음 절차를 따릅니다:
1) Lambda 함수 생성
- AWS Management Console에서 Lambda 서비스를 선택하고, 새 Lambda 함수를 생성합니다.
- Node.js, Python 등의 런타임을 선택합니다.
- 생성된 함수는 기본적으로 us-east-1 리전에 생성되어야 합니다. (Lambda@Edge는 us-east-1 리전에서만 배포할 수 있습니다.)
- 함수 코드를 작성합니다. 예를 들어, 요청 헤더를 수정하는 간단한 Lambda 함수는 다음과 같습니다:
exports.handler = async (event) => {
const request = event.Records[0].cf.request;
// 요청 헤더에 새로운 값 추가
request.headers['x-new-header'] = [{ key: 'x-new-header', value: 'my-value' }];
return request;
};
2) Lambda@Edge 함수 배포
- Lambda 함수를 생성한 후, 이를 CloudFront 배포에 배포할 수 있습니다.
- Lambda 함수의 상단에서 Actions 버튼을 클릭하고 Deploy to Lambda@Edge를 선택합니다.
- CloudFront 배포를 선택하고, 이벤트 유형(예: Viewer Request, Origin Request, Viewer Response, Origin Response)을 설정합니다.
- Viewer Request: 클라이언트가 CloudFront에 요청을 보낼 때 처리.
- Origin Request: CloudFront가 오리진 서버로 요청을 보낼 때 처리.
- Viewer Response: CloudFront가 클라이언트로 응답을 보낼 때 처리.
- Origin Response: 오리진에서 CloudFront로 응답을 보낼 때 처리.
3) 배포 확인 및 테스트
- Lambda@Edge 함수가 배포되면, CloudFront의 엣지 로케이션에서 실시간으로 요청을 처리합니다.
- 배포가 완료된 후, 실제 HTTP 요청을 통해 기능이 정상적으로 동작하는지 확인합니다.
CloudFront와 ALB의 연계 아키텍처
CloudFront와 ALB를 함께 사용하는 구조는 일반적으로 다음과 같습니다:
- 클라이언트가 CloudFront로 HTTP/HTTPS 요청을 보냄.
- CloudFront는 요청을 ALB로 전달합니다. (ALB는 CloudFront의 오리진 서버로 설정됩니다.)
- ALB는 요청을 EC2 인스턴스나 ECS 서비스, 또는 Lambda 함수와 같은 백엔드 서버로 전달하여, 해당 요청을 처리하도록 합니다.
- ALB가 요청을 처리한 후, 응답을 CloudFront로 반환합니다.
- CloudFront는 엣지 로케이션에서 응답을 캐시하여, 이후의 동일한 요청에 대해 빠르게 응답할 수 있습니다. (만약 캐시가 만료되면 ALB를 통해 다시 처리)
- CloudFront가 최종적으로 클라이언트에게 응답을 전달합니다.
아키텍처 다이어그램
[Client] --(HTTPS Request)--> [CloudFront] --(Forward Request)--> [ALB] --(Route to Backend)--> [EC2 / Lambda / ECS]
<--(Cached Response)--- <--(Response)--- <--(Processed Data)---
1. CloudFront와 ALB 연동 목적
- 콘텐츠 분산 및 성능 향상: CloudFront는 전 세계 엣지 로케이션을 사용하여 클라이언트의 요청을 가장 가까운 위치에서 처리하고, 캐싱된 콘텐츠를 빠르게 제공하여 응답 시간을 단축시킵니다.
- 애플리케이션 트래픽 분배: ALB는 애플리케이션 레벨에서의 로드 밸런싱을 제공하며, 다양한 서비스나 EC2 인스턴스에 트래픽을 분배합니다. ALB는 HTTP/HTTPS 요청을 수신하고, 이를 지정된 타겟 그룹으로 분배합니다.
- 보안: CloudFront는 SSL/TLS를 제공하여 HTTPS 트래픽을 암호화합니다. ALB는 HTTPS 트래픽을 수신하여 로드 밸런싱 후 백엔드 서버로 전달할 수 있습니다.
2. ALB가 CloudFront 뒤에 배치될 때 장점
- 보안 및 인증: CloudFront는 ALB로 전달되는 요청을 암호화하며, ALB에서 HTTPS 요청을 처리할 수 있습니다. 이를 통해 **SSL 종료(SSL termination)**를 CloudFront에서 처리하거나 ALB에서 처리할 수 있습니다.
- 정적 콘텐츠와 동적 콘텐츠 구분: CloudFront는 정적 콘텐츠(예: 이미지, JavaScript 파일 등)를 캐시하여 빠르게 제공하고, 동적 콘텐츠는 ALB로 전달하여 처리하도록 할 수 있습니다. 예를 들어, ALB는 동적 API 요청이나 사용자 인증을 처리하는 데 사용될 수 있습니다.
- 성능 최적화: CloudFront는 웹 애플리케이션의 성능을 최적화하는 데 중요한 역할을 합니다. 캐시된 콘텐츠를 제공하고, 캐시가 없거나 만료된 콘텐츠에 대해서는 ALB를 통해 요청을 전달하여 응답을 받습니다.
3. CloudFront → ALB 트래픽 흐름
- CloudFront 배포 생성:
- CloudFront를 설정할 때 ALB를 오리진으로 추가합니다. 이렇게 하면 CloudFront가 들어오는 요청을 ALB로 전달하게 됩니다.
- ALB 설정:
- ALB는 CloudFront로부터 전달된 요청을 적절한 타겟 그룹으로 라우팅합니다.
- ALB는 트래픽을 EC2 인스턴스, ECS 서비스, 또는 Lambda 함수로 전달하고, 해당 요청을 처리합니다.
- ALB → 백엔드 서버:
- ALB는 트래픽을 해당 서비스로 라우팅하고, 응답을 CloudFront로 돌려보냅니다.
- CloudFront → 클라이언트:
- CloudFront는 캐시된 응답을 클라이언트에게 전달하거나, 캐시가 없을 경우 ALB로부터 받은 응답을 클라이언트에게 전달합니다.
4. AWS Lambda와 ALB의 연계
Lambda를 ALB 뒤에서 실행하려면 ALB에서 Lambda 함수를 오리진으로 설정할 수 있습니다. 이는 서버리스 애플리케이션을 구축할 때 유용하게 사용할 수 있습니다. 예를 들어, ALB는 HTTP 요청을 Lambda 함수로 전달하여 동적으로 콘텐츠를 처리하고, 응답을 다시 클라이언트로 반환하는 방식입니다.
5. ALB를 CloudFront와 함께 사용할 때의 중요 사항
- 캐싱과 라우팅 전략: CloudFront의 캐시 정책을 잘 설정하여 ALB로의 불필요한 트래픽을 줄이고, 응답 속도를 최적화합니다.
- 보안 설정: ALB는 CloudFront에서 전달된 HTTPS 요청을 처리할 수 있어, SSL 종료를 CloudFront에서 하거나 ALB에서 할 수 있습니다. 일반적으로 SSL 종료는 CloudFront에서 하고, ALB는 HTTP로 전달받는 경우가 많습니다.
- CloudFront와 ALB 사이의 연결: CloudFront와 ALB 간의 연결은 HTTPS로 설정하는 것이 좋습니다. CloudFront가 ALB와 연결될 때는 ALB의 DNS 이름을 오리진으로 설정하고, HTTPS로 트래픽을 전달합니다.
반응형
'AWS' 카테고리의 다른 글
[SAP- C02] 하이브리드 DNS 솔루션 관련 개념 정리 (0) | 2024.12.26 |
---|---|
[AWS] 계정 설정(Logical OU 구조 + Cross-Account Access 설계) (0) | 2024.11.28 |
[AWS] 스토리지 종류 별 정리 (0) | 2024.11.27 |
[AWS] 네트워크 연결 옵션(Transit Gateway, Direct Connect, PrivateLink, Site-to-Site VPN) (0) | 2024.11.27 |
[AWS] Route53 (2) | 2024.11.26 |