Join the Preview!

Lambda Web Adapter는 평가판입니다.

개요

AWS Lambda Web Adapter는 개발자가 AWS Lambda에서 웹 애플리케이션을 실행할 수 있도록 지원하는 프레임워크입니다.

Datadog는 Node.js 및 Python 런타임을 위한 Lambda Web Adapter를 지원하며, 이를 통해 AWS Lambda에서 실행되는 웹 애플리케이션을 모니터링할 수 있는 솔루션을 제공합니다.

Datadog 통합 방법

Lambda Web Adapter는 Docker 이미지 또는 Zip 파일 형식으로 패키징된 Lambda 함수를 실행할 수 있습니다. 다음 단계는 두 형식 모두에서 Datadog을 사용해 Lambda Web Adapter를 계측하는 데 필요합니다:

  1. Lambda Web Adapter 및 Datadog 확장 추가
  2. 필수 Datadog 환경 변수 설정
  3. 준비 상태 엔드포인트의 트레이싱 무시(Datadog 트레이싱 사용 시에만 필요)

1. Lambda Web Adapter 및 Datadog 확장 추가

이 구성에는 Datadog Lambda 확장 v77+ 및 Lambda Web Adapter v0.9.1+가 필요합니다. 컨테이너 배포 구성의 예시는 Github에서 확인할 수 있습니다.

COPY --from=public.ecr.aws/datadog/lambda-extension:77 /opt/. /opt/
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.1 /lambda-adapter /opt/extensions/lambda-adapter

이 구성에는 Datadog Lambda 확장 v77+와 Lambda Web Adapter v25+가 필요합니다. Zip 배포 구성의 예시는 Github에서 확인할 수 있습니다.

x86용

arn:aws:lambda:${AWS::Region}:464622532012:layer:Datadog-Extension:77
arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:25

ARM용

arn:aws:lambda:${AWS::Region}:464622532012:layer:Datadog-Extension-ARM:77
arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:25

2. 필수 Datadog 환경 변수 설정

Lambda에는 명시적인 종료 메커니즘이 없기 때문에, Lambda 런타임 환경이 “frozen” 상태가 될 때 트레이스가 손실되지 않도록 가능한 한 빨리 플러시해야 합니다.

투명 트레이싱을 사용하려면 Datadog 확장이 Lambda Web Adapter보다 먼저 요청을 프록시할 수 있어야 하므로, 이를 허용하도록 AWS_LWA_LAMBDA_RUNTIME_API_PROXY를 설정해야 합니다. 포트는 사용 가능한 아무 포트나 설정할 수 있습니다.

DD_TRACE_PARTIAL_FLUSH_MIN_SPANS=1
DD_TRACE_PARTIAL_FLUSH_ENABLED=false

AWS_LWA_LAMBDA_RUNTIME_API_PROXY=127.0.0.1:9002

DD_API_KEY=$YOUR_API_KEY
DD_SERVICE=$YOUR_SERVICE_NAME

Lambda에는 명시적인 종료 메커니즘이 없기 때문에, Lambda 런타임 환경이 “frozen” 상태가 될 때 트레이스가 손실되지 않도록 가능한 한 빨리 플러시해야 합니다.

투명 트레이싱을 사용하려면 Datadog 확장이 Lambda Web Adapter보다 먼저 요청을 프록시할 수 있어야 하므로, 이를 허용하도록 AWS_LWA_LAMBDA_RUNTIME_API_PROXY를 설정해야 합니다. 포트는 사용 가능한 아무 포트나 설정할 수 있습니다.

DD_TRACE_PARTIAL_FLUSH_MIN_SPANS=1
DD_TRACE_PARTIAL_FLUSH_ENABLED=false

AWS_LWA_LAMBDA_RUNTIME_API_PROXY=127.0.0.1:9002

AWS_LAMBDA_EXEC_WRAPPER=/opt/bootstrap

DD_API_KEY=$YOUR_API_KEY
DD_SERVICE=$YOUR_SERVICE_NAME

3. 준비 상태 엔드포인트 트레이싱 무시

*이 단계는 Datadog 트레이싱을 사용하는 경우에만 필요합니다.

Lambda Web Adapter는 로드된 후 준비 점검 요청을 전송하므로, Datadog 확장은 이를 Lambda 함수를 트리거한 요청과 연결해서는 안 됩니다.

구성은 런타임에 따라 달라집니다. 준비 상태 엔드포인트가 기본값(/에서 GET)이라고 가정하면,

Node.js

const tracer = require('dd-trace').init();
tracer.use('http', {
    blocklist: ['/']
});

Python

import ddtrace

ddtrace.patch_all()
from ddtrace.trace import tracer, TraceFilter
...
class IgnoreEndpointFilter(TraceFilter):
    def __init__(self, pattern, method):
        self.pattern = re.compile(pattern)
        self.method = method

    def process_trace(self, trace):
        for span in trace:
            url = span.get_tag("http.url")
            if (
                url is not None
                and self.pattern.match(url)
                and self.method == span.get_tag("http.method")
            ):
                return None
        return trace


tracer.configure(
    trace_processors=[IgnoreEndpointFilter(r"http://127.0.0.1:8080/", "GET")]
)

Lambda Web Adapter는 로드된 후 준비 점검 요청을 전송하므로, Datadog 확장은 이를 Lambda 함수를 트리거한 요청과 연결해서는 안 됩니다.

구성은 런타임에 따라 달라집니다. 준비 상태 엔드포인트가 기본값(/에서 GET)이라고 가정하면,

NodeJs

const tracer = require('dd-trace').init();
tracer.use('http', {
    blocklist: ['/']
});

Python

import ddtrace

ddtrace.patch_all()
from ddtrace.trace import tracer, TraceFilter
...
class IgnoreEndpointFilter(TraceFilter):
    def __init__(self, pattern, method):
        self.pattern = re.compile(pattern)
        self.method = method

    def process_trace(self, trace):
        for span in trace:
            url = span.get_tag("http.url")
            if (
                url is not None
                and self.pattern.match(url)
                and self.method == span.get_tag("http.method")
            ):
                return None
        return trace


tracer.configure(
    trace_processors=[IgnoreEndpointFilter(r"http://127.0.0.1:8080/", "GET")]
)

참고 자료