Datadog 포워더(Forwarder)를 사용해 파이썬(Python) 서버리스 애플리케이션 계측

개요

Datadog 서버리스 신규 사용자인 경우 대신 Datadog 람다 확장을 사용해 람다 함수를 계측하기 위한 지침을 따르세요. 람다에서 즉시 사용할 수 있는 기능을 제공하기 전 Datadog 포워더를 사용해 Datadog 서버리스를 설정한 경우 이 가이드를 따라 인스턴스를 유지관리하세요.

전제 조건

Datadog 포워더(Forwarder) 람다 함수는 AWS 람다 트레이스, 향상된 메트릭, 커스텀 메트릭 및 로그를 수집하는 데 필요합니다.

설정

Datadog CLI는 기존 Lambda 함수의 설정을 변경하여, 새롭게 배포할 필요 없이 계측하도록 해줍니다. 가장 빠르게 시작하는 방법은 Datadog의 서버리스 모니터링을 이용하는 것입니다.

또한 CI/CD 파이프라인에 명령을 추가하여 모든 서버리스 응용프로그램에 대한 계측을 활성화할 수 있습니다. Datadog CLI 명령에 의해 변경된 내용이 재정의되지 않도록 일반 서버리스 응용 프로그램 배포 명령을 실행합니다.

설치

NPM 또는 Yarn과 함께 Datadog CLI를 설치합니다:

# NPM
npm install -g @datadog/datadog-ci

# Yarn
yarn global add @datadog/datadog-ci

계측

기능을 계측하려면 AWS 증명서과 함께 다음 명령을 실행합니다.

datadog-ci lambda instrument -f <functionname> -f <another_functionname> -r <aws_region> -v <layer_version> --forwarder <forwarder_arn>

플레이스홀더 채우기:

  • <functionname><another_functionname>를 람다 함수 이름으로 대체합니다.
  • <aws_region>을 AWS 리전 이름으로 대체합니다.
  • 원하는 버전의 Datadog 람다 라이브러리로 <layer_version>을 대체합니다. 최신 버전은 103입니다.
  • <forwarder_arn>을 포워더(Forwarder) ARN으로 대체합니다(포워더(Forwarder) 설명서 참조).

예를 들면 다음과 같습니다.

datadog-ci lambda instrument -f my-function -f another-function -r us-east-1 -v 103 --forwarder "arn:aws:lambda:us-east-1:000000000000:function:datadog-forwarder"

람다 함수가 코드 서명을 사용하도록 설정된 경우 Datadog CLI를 사용하여 계측하려면 먼저 Datadog의 서명 프로파일 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가해야 합니다.

람다 함수가 코드 서명에 사용되도록 설정한 경우 Datadog 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가해야만 Datadog CLI을 사용해 계측할 수 있습니다.

자세한 내용 및 추가 파라미터는 CLI 설명서에서 확인할 수 있습니다.

Datadog 서버리스 플러그인은 자동으로 레이어를 사용해 Datadog 람다 라이브러리를 함수에 추가하고 함수를 설정하여 Datadog 포워더를 통해 Datadog에 메트릭, 트레이스와 로그를 전송합니다.

람다 기능/함수가 코드 서명을 사용하도록 구성된 경우 Datadog 서버리스 플러그인을 설치하기 전에 함수의 코드 서명 설정에 Datadog의 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 추가해야 합니다.

람다 기능/함수가 코드 서명을 사용하도록 구성된 경우 Datadog 서버리스 플러그인을 설치하기 전에 기능/함수의 코드 서명 설정에 Datadog의 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 추가해야 합니다.

Datadog Serverless Plugin을 설치하고 설정하려면 다음 절차를 따라주세요.

  1. Datadog Serverless Plugin을 설치합니다.
    yarn add --dev serverless-plugin-datadog
    
  2. serverless.yml에 다음을 추가합니다:
    plugins:
      - serverless-plugin-datadog
    
  3. serverless.yml에서 다음 섹션도 추가합니다:
    custom:
      datadog:
        forwarderArn: # The Datadog Forwarder ARN goes here.
    
    Datadog Forwarder ARN 또는 설치에 대한 자세한 내용은 여기를 참조하세요. 자세한 설정은 플러그인 설명서을 참조하세요.

Datadog CloudFormation 매크로는 레이어를 사용하여 Datadog 람다 라이브러리를 함수에 추가하기 위해 SAM 응용프로그램 템플릿을 자동으로 변환하고, Datadog 포워더(Forwarder)를 통해 메트릭, 트레이스 및 로그를 Datadog로 전송하도록 함수를 구성합니다.

설치

AWS 자격 증명을 사용해 다음 명령을 실행하여 CloudFormation 스택을 구축합니다. 해당 스택은 매크로 AWS 리소스를 설치합니다. 계정에서 주어진 지역에 대해 1회만 매크로를 설치하면 됩니다. create-stackupdate-stack으로 대체하여 최신 버전으로 매크로를 업데이트합니다.

aws cloudformation create-stack \
--stack-name datadog-serverless-macro \
--template-url https://datadog-cloudformation-template.s3.amazonaws.com/aws/serverless-macro/latest.yml \
--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_IAM

매크로가 배포되어 사용할 준비가 되었습니다.

계측

함수를 계측하려면 AWS::Serverless가 SAM용으로 변환된 이후 Transform 섹션의 template.yml에 다음을 추가합니다.

Transform:
  - AWS::Serverless-2016-10-31
  - Name: DatadogServerless
    Parameters:
      pythonLayerVersion: "103"
      stackName: !Ref "AWS::StackName"
      forwarderArn: "<FORWARDER_ARN>"
      service: "<SERVICE>" # Optional
      env: "<ENV>" # Optional

플레이스홀더 채우기:

  • <FORWARDER_ARN>를 포워더(Forwarder) ARN으로 대체합니다(포워더(Forwarder) 설명서 참조).
  • <SERVICE><ENV>를 서비스와 환경값으로 대체합니다.

람다 함수가 코드 서명을 사용하도록 구성된 경우 매크로를 사용려면 먼저 Datadog의 서명 프로필 ARN(`arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc``)을 함수의 코드 서명 설정에 추가해야 합니다.

람다 기능/함수가 코드 서명을 사용하도록 설정된 경우 매크로를 사용하려면 먼저 Datadog의 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 기능/함수의 코드 서명 설정에 추가해야 합니다.

자세한 정보와 추가 파라미터는 매크로 설명서에서 확인할 수 있습니다.

Datadog CloudFormation 매크로]1는 자동으로 AWS CDK에서 생성된 CloudFormation 템플릿을 변환하고 레이어를 사용해 Datadog 람바 라이브러리를 함수에 추가합니다. 그리고 함수를 설정하여 Datadog 포워더를 사용해 Datadog에 메트릭, 트레이스와 로그를 전송합니다.

설치

AWS 자격 증명을 사용해 다음 명령을 실행하여 CloudFormation 스택을 구축합니다. 해당 스택은 매크로 AWS 리소스를 설치합니다. 계정에서 주어진 지역에 대해 1회만 매크로를 설치하면 됩니다. create-stackupdate-stack으로 대체하여 최신 버전으로 매크로를 업데이트합니다.

aws cloudformation create-stack \
--stack-name datadog-serverless-macro \
--template-url https://datadog-cloudformation-template.s3.amazonaws.com/aws/serverless-macro/latest.yml \
--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_IAM

매크로가 배포되어 사용할 준비가 되었습니다.

계측

함수를 계측하려면 DatadogServerless 변환과 CfnMapping를 AWS CDK 앱의 Stack 개체에 추가합니다. 파이썬에서 아래 샘플 코드를 참조하세요(다른 언어 사용 시에도 유사함).

from aws_cdk import core

class CdkStack(core.Stack):
  def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
    super().__init__(scope, id, **kwargs)
    self.add_transform("DatadogServerless")

    mapping = core.CfnMapping(self, "Datadog",
      mapping={
        "Parameters": {
          "pythonLayerVersion": "103",
          "forwarderArn": "<FORWARDER_ARN>",
          "stackName": self.stackName,
          "service": "<SERVICE>",  # Optional
          "env": "<ENV>",  # Optional
        }
      })

플레이스홀더 채우기:

  • <FORWARDER_ARN>를 포워더(Forwarder) ARN으로 대체합니다(포워더(Forwarder) 설명서 참조).
  • <SERVICE><ENV>를 서비스와 환경값으로 대체합니다.

람바 함수가 코드 서명을 사용하도록 설정된 경우 Datadog 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가한 다음 매크로를 사용해야 합니다.

자세한 정보와 추가 파라미터는 매크로 설명서에서 확인할 수 있습니다.

설정 업데이트

  1. zappa_settings.json에 다음 설정을 추가하세요.
    {
        "dev": {
            "layers": ["arn:aws:lambda:<AWS_REGION>:464622532012:layer:Datadog-<RUNTIME>:<VERSION>"],
            "lambda_handler": "datadog_lambda.handler.handler",
            "aws_environment_variables": {
                "DD_LAMBDA_HANDLER": "handler.lambda_handler",
                "DD_TRACE_ENABLED": "true",
                "DD_FLUSH_TO_LOG": "true",
            },
        }
    }
    
  2. 레이어 ARN에서 자리표시자 <AWS_REGION>, <RUNTIME>, <VERSION>을 적합한 값으로 대체하세요. 사용 가능한 RUNTIME 옵션은 Python312입니다. 최신 VERSIONPython38`, `Python39`, `Python310`, `Python311`, `Python312입니다. 예시:
    # For regular regions
    arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Python312:103
    
    # For us-gov regions
    arn:aws-us-gov:lambda:us-gov-east-1:002406178527:layer:Datadog-Python312:103
    
  3. 람바 함수가 코드 서명을 사용하도록 설정된 경우 Datadog 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가하세요.

  1. zappa_settings.json에 다음 설정을 추가하세요.
    {
        "dev": {
            "layers": ["arn:aws:lambda:<AWS_REGION>:417141415827:layer:Datadog-<RUNTIME>:<VERSION>"],
            "lambda_handler": "datadog_lambda.handler.handler",
            "aws_environment_variables": {
                "DD_LAMBDA_HANDLER": "handler.lambda_handler",
                "DD_TRACE_ENABLED": "true",
                "DD_FLUSH_TO_LOG": "true",
            },
        }
    }
    
  2. 레이어 ARN에서 자리표시자 <AWS_REGION>, <RUNTIME>, <VERSION>을 적합한 값으로 대체하세요. 사용 가능한 RUNTIME 옵션은 Python38, Python39, Python310, Python311, Python312입니다. 최신 VERSION103입니다. 예시:
    # For regular regions
    arn:aws:lambda:us-east-1:417141415827:layer:Datadog-Python312:103
    
    # For us-gov regions
    arn:aws-us-gov:lambda:us-gov-east-1:002406178527:layer:Datadog-Python312:103
    
  3. 람바 함수가 코드 서명을 사용하도록 설정된 경우 Datadog 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가하세요.

구독

Datadog 포워더 람바 함수를 각 함수의 로그 그룹에 보내 Datadog에 메트릭, 트레이스와 로그를 전송합니다.

  1. 설치하지 않은 경우 Datadog 포워더를 설치합니다.
  2. 함수의 로그 그룹에 Datadog 포워더를 보냅니다.

프로젝트 업데이트

  1. config.json에서 환경 변수 DD_TRACE_ENABLEDDD_FLUSH_TO_LOG"true"로 설정하세요.
    {
      "version": "2.0",
      "app_name": "hello-chalice",
      "stages": {
        "dev": {
          "api_gateway_stage": "api",
          "environment_variables": {
            "DD_TRACE_ENABLED": "true",
            "DD_FLUSH_TO_LOG": "true"
          }
        }
      }
    }
    
  2. datadog_lambdarequirements.txt에 추가합니다.
  3. app.py에서 미들웨어datadog_lambda_wrapper를 등록합니다.
    from chalice import Chalice, ConvertToMiddleware
    from datadog_lambda.wrapper import datadog_lambda_wrapper
    
    app = Chalice(app_name='hello-chalice')
    
    app.register_middleware(ConvertToMiddleware(datadog_lambda_wrapper))
    
    @app.route('/')
    def index():
        return {'hello': 'world'}
    

  1. 람바 함수가 코드 서명을 사용하도록 설정된 경우 Datadog 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가하세요.

  1. 람바 함수가 코드 서명을 사용하도록 설정된 경우 Datadog 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가하세요.

구독

Datadog 포워더 람다 함수를 각 함수의 로그 그룹에 보내 Datadog에 메트릭, 트레이스와 로그를 전송합니다.

  1. 설치하지 않은 경우 [Datadog 포워더를 설치][2]합니다.
  2. 함수 로그 그룹에서 Datadog Forwarder를 구독하세요.

설치

람다 함수를 컨테이너 이미지로 구축하는 경우 레이어로 Datadog 람다 라이브러리를 사용할 수 없습니다. 이미지 내 함수의 종속 항목으로 Datadog 람다 라이브러리를 설치해야 합니다.

pip install datadog-lambda

datadog-lambda 패키지의 부 버전은 항상 레이어 버전과 일치해야 하니 참고하세요. 예를 들어 datadog-lambda v0.5.0는 레이어 버전 5 콘텐츠와 일치해야 합니다.

설정하다

기능/함수를 설정하기 위해 다음 단계를 따르세요:

  1. 이미지의 CMD 값을 datadog_lambda.handler.handler로 설정하세요. AWS에서 설정하거나 Dockerfile에서 직접 설정할 수 있습니다. 양쪽에서 설정한 경우 AWS에서 설정한 값이 Dockerfile 값을 덮어쓰니 참고하세요.
  2. AWS에서 다음 환경 변수를 설정하세요:
  • myfunc.handler와 같이 DD_LAMBDA_HANDLER를 원래 핸들러로 설정합니다.
  • DD_TRACE_ENABLEDtrue로 설정합니다.
  • DD_FLUSH_TO_LOGtrue로 설정합니다.
  1. 필요에 따라 적절한 값을 사용하여 기능/함수에 serviceenv태그를 추가합니다.

구독

Datadog 포워더(Forwarder) 람다 함수를 각 함수의 로그 그룹에 등록하여 메트릭, 트레이스 및 로그를 Datadog로 전송합니다.

  1. Datadog 포워더(Forwarder)를 설치하지 않았을 경우 설치.
  2. Datadog 포워더(Forwarder)를 기능/함수의 로그 그룹에 등록합니다.

설치

Datadog 람다 라이브러리를 레이어로 설치하거나(권장) 파이썬 패키지로 설치할 수 있습니다.

datadog-lambda 패키지의 부 버전은 항상 레이어 버전과 일치해야 하니 참고하세요. 예를 들어 datadog-lambda v0.5.0는 레이어 버전 5 콘텐츠와 일치해야 합니다.

레이어 사용

다음 형식에 맞추어 ARN을 사용해 Lambda 함수의 레이어를 설정합니다.

# For us,us3,us5 and eu regions
arn:aws:lambda:<AWS_REGION>:464622532012:layer:Datadog-<RUNTIME>:<VERSION>

# For us-gov regions
arn:aws-us-gov:lambda:<AWS_REGION>:002406178527:layer:Datadog-<RUNTIME>:<VERSION>

# For us-gov regions
arn:aws-us-gov:lambda:<AWS_REGION>:417141415827:layer:Datadog-<RUNTIME>:<VERSION>

사용 가능한 RUNTIME 옵션은 Python38, Python39, Python310, Python311, Python312입니다. 최신 VERSION103입니다. 예시:

arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Python312:103

람다 함수가 코드 서명을 사용하도록 설정된 경우 Datadog 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가한 다음 레이어로 Datadog 람다 라이브러리를 추가할 수 있습니다.

람다 함수가 코드 서명을 사용하도록 설정된 경우 Datadog 서명 프로필 ARN(arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc)을 함수의 코드 서명 설정에 추가한 다음 레이어로 Datadog 람다 라이브러리를 추가할 수 있습니다.

패키지 사용하기

datadog-lambda와 종속 항목을 로컬에서 함수 프로젝트 폴더에 설치합니다. 참고: datadog-lambdaddtrace에 따라 다릅니다. 해당 항목은 네이티브 확장을 사용하므로 리눅스(Linux) 환경에서 설치하고 컴파일해야 합니다. 예를 들어 서버리스 프레임워크에 dockerizePip, AWS SAM에 –use-container를 사용할 수 있습니다. 자세한 정보는 함수 구축 패키지에 종속 항목을 추가하는 방법를 참조하세요.

pip install datadog-lambda -t ./

최신 릴리스를 참조하세요.

설정하다

기능/함수를 설정하기 위해 다음 단계를 따르세요:

  1. 함수 핸들러를 datadog_lambda.handler.handler로 설정하세요.
  2. 환경 변수DD_LAMBDA_HANDLERmyfunc.handler와 같이 기존 핸들러로 설정합니다.
  3. 환경 변수 DD_TRACE_ENABLEDtrue로 설정합니다.
  4. 환경 변수 DD_FLUSH_TO_LOGtrue로 설정합니다.
  5. 필요에 따라 적절한 값을 가진 serviceenv태그를 기능/함수에 추가합니다.

구독

Datadog 포워더 람바 함수를 각 함수의 로그 그룹에 보내 Datadog에 메트릭, 트레이스와 로그를 전송합니다.

  1. 설치하지 않은 경우 Datadog 포워더를 설치하세요.
  2. 함수의 로그 그룹에 Datadog 포워더를 보내세요.

태그

부수적인 옵션이긴 하나 Datadog는 통합 서비스 태깅 설명서에 따라 env,serviceversion태그를 사용하여 서버리스 애플리케이션에 태그를 지정할 것을 권장합니다.

탐색

위의 단계에 따라 기능/함수을 설정한 후 서버리스 홈페이지에서 메트릭, 로그 및 트레이스를 확인합니다.

커스텀 비즈니스 로직 모니터링

커스텀 메트릭 또는 스팬(span)을 제출하려면 아래 샘플 코드를 참조하세요:

import time
from ddtrace import tracer
from datadog_lambda.metric import lambda_metric

def lambda_handler(event, context):
    # add custom tags to the lambda function span,
    # does NOT work when X-Ray tracing is enabled
    current_span = tracer.current_span()
    if current_span:
        current_span.set_tag('customer.id', '123456')

    # submit a custom span
    with tracer.trace("hello.world"):
        print('Hello, World!')

    # submit a custom metric
    lambda_metric(
        metric_name='coffee_house.order_value',
        value=12.45,
        timestamp=int(time.time()), # optional, must be within last 20 mins
        tags=['product:latte', 'order:online']
    )

    return {
        'statusCode': 200,
        'body': get_message()
    }

# trace a function
@tracer.wrap()
def get_message():
    return 'Hello from serverless!'

커스텀 메트릭 제출에 대한 자세한 정보는 여기를 참조하세요. 커스텀 계측에 대한 추가 정보는 커스텀 계측에 대한 Datadog APM 설명서를 참조하세요.

참고 자료

추가 유용한 문서, 링크 및 기사: