본문 바로가기
AWS

[AWS] Lambda@Edge

by 간장공장공차장 2024. 11. 26.
반응형

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 함수 생성

  1. AWS Management Console에서 Lambda 서비스를 선택하고, 새 Lambda 함수를 생성합니다.
  2. Node.js, Python 등의 런타임을 선택합니다.
  3. 생성된 함수는 기본적으로 us-east-1 리전에 생성되어야 합니다. (Lambda@Edge는 us-east-1 리전에서만 배포할 수 있습니다.)
  4. 함수 코드를 작성합니다. 예를 들어, 요청 헤더를 수정하는 간단한 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 배포에 배포할 수 있습니다.
  1. Lambda 함수의 상단에서 Actions 버튼을 클릭하고 Deploy to Lambda@Edge를 선택합니다.
  2. 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를 함께 사용하는 구조는 일반적으로 다음과 같습니다:

  1. 클라이언트CloudFront로 HTTP/HTTPS 요청을 보냄.
  2. CloudFront는 요청을 ALB로 전달합니다. (ALB는 CloudFront의 오리진 서버로 설정됩니다.)
  3. ALB는 요청을 EC2 인스턴스ECS 서비스, 또는 Lambda 함수와 같은 백엔드 서버로 전달하여, 해당 요청을 처리하도록 합니다.
  4. ALB가 요청을 처리한 후, 응답을 CloudFront로 반환합니다.
  5. CloudFront는 엣지 로케이션에서 응답을 캐시하여, 이후의 동일한 요청에 대해 빠르게 응답할 수 있습니다. (만약 캐시가 만료되면 ALB를 통해 다시 처리)
  6. 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 트래픽 흐름

  1. CloudFront 배포 생성:
    • CloudFront를 설정할 때 ALB를 오리진으로 추가합니다. 이렇게 하면 CloudFront가 들어오는 요청을 ALB로 전달하게 됩니다.
  2. ALB 설정:
    • ALB는 CloudFront로부터 전달된 요청을 적절한 타겟 그룹으로 라우팅합니다.
    • ALB는 트래픽을 EC2 인스턴스, ECS 서비스, 또는 Lambda 함수로 전달하고, 해당 요청을 처리합니다.
  3. ALB → 백엔드 서버:
    • ALB는 트래픽을 해당 서비스로 라우팅하고, 응답을 CloudFront로 돌려보냅니다.
  4. 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로 트래픽을 전달합니다.
반응형