まず、Datadog サーバーレスモニタリングをインストールし、メトリクス、トレース、ログの収集を開始します。インストールが完了したら、以下のトピックを参照して、モニタリングのニーズに合わせてインストールを構成します。

脅威の検出を有効にして攻撃の試みを観測する

サーバーレスアプリケーションを標的にしている攻撃者についてアラートを受け取り、素早く対応できます。

まずは、関数でトレーシングが有効になっていることを確認します。

脅威の監視を有効にするには、デプロイに次の環境変数を追加します。

environment:
  DD_SERVERLESS_APPSEC_ENABLED: true
  AWS_LAMBDA_EXEC_WRAPPER: /opt/datadog_wrapper

関数を再デプロイして呼び出します。数分後、ASM ビューに表示されます。

アプリケーションセキュリティ管理の脅威検出のアクションを見るには、既知の攻撃パターンをアプリケーションに送信します。例えば、acunetix-product という値を持つ HTTP ヘッダーを送信すると、セキュリティスキャナー攻撃の試行がトリガーされます。

curl -H 'My-ASM-Test-Header: acunetix-product' https://<YOUR_FUNCTION_URL>/<EXISTING_ROUTE>

アプリケーションを有効化し、攻撃パターンを送信してから数分後、脅威情報が Application Signals Explorer に表示されます

タグを使ったテレメトリー接続

予約タグ (envserviceversion) とカスタムタグを使用して、Datadog のテレメトリーを一緒に接続します。これらのタグを使用して、メトリクス、トレース、ログをシームレスに操作することができます。使用するインストール方法に応じて、以下の追加パラメーターを追加してください。

Datadog CLI の最新バージョンを使用していることを確認し、適切な追加引数を指定して datadog-ci lambda instrument コマンドを実行します。例えば、以下のようになります。

datadog-ci lambda instrument \
    --env dev \
    --service web \
    --version v1.2.3 \
    --extra-tags "team:avengers,project:marvel"
    # ... その他の必要な引数 (関数名など)

Datadog サーバーレスプラグインの最新バージョンを使用していることを確認し、envserviceversiontags パラメーターを使用してタグを適用します。例えば、以下のようになります。

custom:
  datadog:
    # ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
    env: dev
    service: web
    version: v1.2.3
    tags: "team:avengers,project:marvel"

デフォルトでは、envservice を定義しない場合、プラグインはサーバーレスアプリケーション定義から stageservice の値を自動的に使用します。この機能を無効にするには、enableTagsfalse に設定してください。

Datadog サーバーレスマクロの最新バージョンを使用していることを確認し、envserviceversiontags パラメーターを使用してタグを適用します。例えば、以下のようになります。

Transform:
  - AWS::Serverless-2016-10-31
  - Name: DatadogServerless
    Parameters:
      # ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
      env: dev
      service: web
      version: v1.2.3
      tags: "team:avengers,project:marvel"

Datadog サーバーレス cdk コンストラクトの最新バージョンを使用していることを確認し、envserviceversiontags パラメーターを使用してタグを適用します。例えば、以下のようになります。

const datadog = new Datadog(this, "Datadog", {
    // ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
    env: "dev",
    service: "web",
    version: "v1.2.3",
    tags: "team:avengers,project:marvel"
});
datadog.addLambdaFunctions([<LAMBDA_FUNCTIONS>]);

Datadog Lambda 拡張機能を使用して Lambda 関数からテレメトリーを収集している場合、Lambda 関数に以下の環境変数を設定します。例えば、以下のようになります。

  • DD_ENV: dev
  • DD_SERVICE: web
  • DD_VERSION: v1.2.3
  • DD_TAGS: team:avengers,project:marvel

Datadog Forwarder Lambda 関数を使って Lambda 関数からテレメトリーを収集している場合、Lambda 関数に envserviceversion および追加のタグを AWS リソースタグとして設定します。Datadog Forwarder の CloudFormation スタックで、DdFetchLambdaTags オプションが true に設定されていることを確認します。このオプションは、バージョン 3.19.0 以降、デフォルトで true に設定されています。

また、Datadog は、Lambda 関数に定義された既存の AWS リソースタグで、数分遅れで収集したテレメトリーをリッチ化することができます。

  • Datadog Lambda 拡張機能を使って Lambda 関数からテレメトリーを収集している場合、Datadog AWS インテグレーションを有効にしてください。この機能は、テレメトリーをカスタムタグでリッチ化するためのものです。Datadog の予約タグ (envserviceversion) は、対応する環境変数 (それぞれ DD_ENVDD_SERVICEDD_VERSION) で設定する必要があります。予約タグは、サーバーレス開発者向けツールと Datadog のインテグレーションで提供されるパラメーターで設定することも可能です。この機能は、コンテナイメージでデプロイされた Lambda 関数では機能しません。

  • Datadog Forwarder Lambda 関数を使って Lambda 関数からテレメトリーを収集している場合、Datadog Forwarder の CloudFormation スタックで、DdFetchLambdaTags オプションを true に設定します。このオプションは、バージョン 3.19.0 以降、デフォルトで true に設定されています。

リクエストとレスポンスのペイロードを収集する

この機能は、Python、Node.js、Go、Java、.NET でサポートされています。

Datadog は AWS Lambda 関数の JSON リクエストとレスポンスのペイロードを収集し可視化することで、サーバーレスアプリケーションへの深い洞察と Lambda 関数障害のトラブルシューティングを支援することが可能です。

この機能は、デフォルトでは無効になっています。使用するインストール方法については、以下の説明に従ってください。

Datadog CLI の最新バージョンを使用していることを確認し、追加引数 --capture-lambda-payload を指定して datadog-ci lambda instrument コマンドを実行します。例えば、以下のようになります。

datadog-ci lambda instrument \
    --capture-lambda-payload true
    # ... その他の必要な引数 (関数名など)

Datadog サーバーレスプラグインの最新バージョンを使用していることを確認し、captureLambdaPayloadtrue に設定します。例えば、以下のようになります。

custom:
  datadog:
    # ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
    captureLambdaPayload: true

Datadog サーバーレスマクロの最新バージョンを使用していることを確認し、captureLambdaPayload パラメーターを true に設定します。例えば、以下のようになります。

Transform:
  - AWS::Serverless-2016-10-31
  - Name: DatadogServerless
    Parameters:
      # ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
      captureLambdaPayload: true

Datadog サーバーレス cdk コンストラクトの最新バージョンを使用していることを確認し、captureLambdaPayload パラメーターを true に設定します。例えば、以下のようになります。

const datadog = new Datadog(this, "Datadog", {
    // ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
    captureLambdaPayload: true
});
datadog.addLambdaFunctions([<LAMBDA_FUNCTIONS>]);

Lambda 関数で環境変数 DD_CAPTURE_LAMBDA_PAYLOADtrue に設定します。

リクエストやレスポンスの JSON オブジェクト内の機密データが Datadog に送信されないようにするには、特定のパラメーターをスクラブすることが可能です。

そのためには、Lambda 関数のコードと同じフォルダに、新しいファイル datadog.yaml を追加してください。Lambda ペイロードのフィールドの難読化は、datadog.yamlapm_config 設定内の replace_tags ブロックで行うことができます。

apm_config:
  replace_tags:
    # 任意のタグに出現する "foobar" をすべて "REDACTED" に置き換えます:
    - name: "*"
      pattern: "foobar"
      repl: "REDACTED"
    # リクエストヘッダーの "auth "を空の文字列に置き換えます
    - name: "function.request.headers.auth"
      pattern: "(?s).*"
      repl: ""
    # レスポンスペイロードの "apiToken" を "****" に置き換えます
    - name: "function.response.apiToken"
      pattern: "(?s).*"
      repl: "****"

別の方法として、Lambda 関数に環境変数 DD_APM_REPLACE_TAGS を設定し、特定のフィールドを難読化することもできます。

DD_APM_REPLACE_TAGS=[
      {
        "name": "*",
        "pattern": "foobar",
        "repl": "REDACTED"
      },
      {
        "name": "function.request.headers.auth",
        "pattern": "(?s).*",
        "repl": ""
      },
      {
        "name": "function.response.apiToken",
        "pattern": "(?s).*"
        "repl": "****"
      }
]

非 Lambda リソースからトレースを収集する

この機能は現在、Python、Node.js、Java、.NET でサポートされています。

Datadog は、Lambda 関数をトリガーする AWS マネージドリソースの受信 Lambda イベントに基づいて APM スパンを推測することができます。これは、AWS マネージドリソース間の関係を視覚化し、サーバーレスアプリケーションにおけるパフォーマンス問題を特定するのに役立ちます。追加の製品詳細をご覧ください。

現在、以下のリソースがサポートされています。

  • API ゲートウェイ (REST API、HTTP API、WebSocket)
  • 関数 URL
  • SQS
  • SNS (SQS 経由で配信される SNS メッセージもサポートされています)
  • Kinesis Streams (データが JSON 文字列または base64 エンコードされた JSON 文字列の場合)
  • EventBridge (カスタムイベント。Details は JSON 文字列)
  • S3
  • DynamoDB

この機能を無効にするには、DD_TRACE_MANAGED_SERVICESfalse に設定します。

DD_SERVICE_MAPPING

DD_SERVICE_MAPPING は Lambda 以外のアップストリームのサービス名を名前変更する環境変数です。これは old-service:new-service のペアで動作します。

構文

DD_SERVICE_MAPPING=key1:value1,key2:value2

この変数を操作する方法は 2 つあります。

タイプのすべてのサービス名を変更

AWS Lambda インテグレーションに関連するすべてのアップストリームサービスの名前を変更するには、これらの識別子を使用します。

AWS Lambda インテグレーションDD_SERVICE_MAPPING Value
lambda_api_gateway"lambda_api_gateway:newServiceName"
lambda_sns"lambda_sns:newServiceName"
lambda_sqs"lambda_sqs:newServiceName"
lambda_s3"lambda_s3:newServiceName"
lambda_eventbridge"lambda_eventbridge:newServiceName"
lambda_kinesis"lambda_kinesis:newServiceName"
lambda_dynamodb"lambda_dynamodb:newServiceName"
lambda_url"lambda_url:newServiceName"

特定のサービス名を変更

より詳細なアプローチは、これらのサービス固有の識別子を使用します。

サービス識別子DD_SERVICE_MAPPING Value
API GatewayAPI ID"r3pmxmplak:newServiceName"
SNSトピック名"ExampleTopic:newServiceName"
SQSキュー名"MyQueue:newServiceName"
S3バケット名"example-bucket:newServiceName"
EventBridgeイベントソース"eventbridge.custom.event.sender:newServiceName"
Kinesisストリーム名"MyStream:newServiceName"
DynamoDBテーブル名"ExampleTableWithStream:newServiceName"
Lambda URLAPI ID"a8hyhsshac:newServiceName"

例と説明

コマンド説明
DD_SERVICE_MAPPING="lambda_api_gateway:new-service-name"全ての lambda_api_gateway アップストリームサービスの名前を new-service-name に変更します
DD_SERVICE_MAPPING="08se3mvh28:new-service-name"特定のアップストリームサービス 08se3mvh28.execute-api.eu-west-1.amazonaws.com の名前を new-service-name に変更します

ダウンストリームサービスの名前の変更については、トレーサーの構成ドキュメントDD_SERVICE_MAPPING を参照してください。

Datadog トレーサーの構成

Datadog APM クライアントによって自動的にインスツルメントされるライブラリやフレームワークについては、APM の互換性要件を参照してください。カスタムアプリケーションをインスツルメントするには、Datadog の APM ガイドのカスタムインスツルメンテーションを参照してください。

APM スパンを取り込む際のサンプリングレートの選択

サーバーレス関数の APM トレース呼び出しのサンプリングレートを管理するには、関数上で DD_TRACE_SAMPLE_RATE 環境変数を 0.000 (Lambda 関数呼び出しのトレースなし) と 1.000 (Lambda 関数呼び出しのすべてトレース) の間の値に設定します。

メトリクスは、アプリケーションの 100% のトラフィックに基づいて計算され、どのようなサンプリング構成であっても正確な値を維持します。

トレースデータは非常に反復性が高いため、高スループットのサービスでは、通常、すべてのリクエストを収集する必要はありません。十分重要な問題は、常に複数のトレースで症状を示すはずです。取り込み制御は、予算の範囲内で、問題のトラブルシューティングに必要な可視性を確保するのに役立ちます。

取り込みのためのデフォルトのサンプリングメカニズムはヘッドベースサンプリングと呼ばれています。トレースを維持するか削除するかの決定は、トレースの一番最初、ルートスパンの開始時に行われます。この決定は、HTTP リクエストヘッダーなどのリクエストコンテキストの一部として、他のサービスに伝搬されます。この判断はトレースの最初に行われ、その後トレースのすべての部分に伝えられるため、ルートサービスのサンプリングレートを構成しないと有効になりません。

Datadog がスパンを取り込んだ後、Datadog インテリジェント保持フィルターはトレースの一定割合をインデックス化し、アプリケーションの健全性を監視するのに役立てることができます。また、カスタムの保持フィルターを定義して、組織の目標をサポートするために長く保存しておきたいトレースデータのインデックスを作成することも可能です。

Datadog Trace Pipeline の詳細についてはこちらをご覧ください。

トレースから機密情報をフィルタリングまたはスクラブする

Datadog に送信する前にトレースをフィルタリングするには、APM で不要なリソースを無視するを参照してください。

データセキュリティのためにトレース属性をスクラブするには、データセキュリティのための Datadog Agent またはトレーサーの構成を参照してください。

トレース収集の有効化/無効化

Datadog Lambda 拡張機能によるトレース収集は、デフォルトで有効になっています。

Lambda 関数のトレース収集を開始したい場合は、以下の構成を適用します。

datadog-ci lambda instrument \
    --tracing true
    # ... その他の必要な引数 (関数名など)
custom:
  datadog:
    # ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
    enableDDTracing: true
Transform:
  - AWS::Serverless-2016-10-31
  - Name: DatadogServerless
    Parameters:
      # ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
      enableDDTracing: true
const datadog = new Datadog(this, "Datadog", {
    // ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
    enableDatadogTracing: true
});
datadog.addLambdaFunctions([<LAMBDA_FUNCTIONS>]);

Lambda 関数で環境変数 DD_TRACE_ENABLEDtrue に設定します。

トレース収集の無効化

Lambda 関数のトレース収集を停止したい場合は、以下の構成を適用します。

datadog-ci lambda instrument \
    --tracing false
    # ... その他の必要な引数 (関数名など)
custom:
  datadog:
    # ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
    enableDDTracing: false
Transform:
  - AWS::Serverless-2016-10-31
  - Name: DatadogServerless
    Parameters:
      # ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
      enableDDTracing: false
const datadog = new Datadog(this, "Datadog", {
    // ... その他の必要なパラメーター (Datadog のサイトや API キーなど)
    enableDatadogTracing: false
});
datadog.addLambdaFunctions([<LAMBDA_FUNCTIONS>]);

Lambda 関数で環境変数 DD_TRACE_ENABLEDfalse に設定します。

ログとトレースの接続

Lambda 拡張機能を使ってトレースやログを収集している場合、Datadog は自動的に AWS Lambda のリクエスト ID を aws.lambda スパンの request_id タグの下に追加します。さらに、同じリクエストの Lambda ログは、lambda.request_id 属性の下に追加されます。Datadog のトレースビューとログビューは、AWS Lambda のリクエスト ID を使用して接続されます。

Forwarder Lambda 関数を使用してトレースとログを収集している場合、dd.trace_id は自動的にログに挿入されます (環境変数 DD_LOGS_INJECTION で有効になります)。Datadog のトレースとログのビューは、Datadog のトレース ID を使用して接続されています。この機能は一般的なランタイムとロガーを使用しているほとんどのアプリケーションでサポートされています (ランタイムによるサポートを参照)。

サポートされていないランタイムまたはカスタムロガーを使用している場合は、以下の手順に従ってください。

  • JSON でログを記録する場合、dd-trace を使用して Datadog のトレース ID を取得し、それをログの dd.trace_id フィールドに追加する必要があります。
    {
      "message": "This is a log",
      "dd": {
        "trace_id": "4887065908816661012"
      }
      // ... the rest of your log
    }
    
  • 平文でログを記録する場合、以下を行う必要があります。
    1. dd-trace を使用して Datadog のトレース ID を取得し、ログに追加します。
    2. デフォルトの Lambda ログパイプラインを複製します (読み取り専用)。
    3. 複製したパイプラインを有効にし、デフォルトのパイプラインを無効にします。
    4. 複製したパイプラインの Grok パーサールールを更新して、Datadog トレース ID を dd.trace_id 属性にパースするようにします。例えば、[INFO] dd.trace_id=4887065908816661012 My log messageのようなログには、ルール my_rule \[%{word:level}\]\s+dd.trace_id=%{word:dd.trace_id}.* が使用されます。

ソースコードにエラーをリンクする

Datadog ソースコードインテグレーションを使用すると、テレメトリー (スタックトレースなど) を Git リポジトリ内の Lambda 関数のソースコードにリンクできます。

サーバーレスアプリケーションでソースコードインテグレーションを設定する手順については、ビルドアーティファクトに Git 情報を埋め込むセクションを参照してください。

プロファイリングデータの収集 (公開ベータ版)

Datadog の Continuous Profiler は Python バージョン 4.62.0 とレイヤーバージョン 62 以前でベータ版が利用可能です。このオプション機能は DD_PROFILING_ENABLED 環境変数を true に設定することで有効になります。

Continuous Profiler は、実行中のすべての Python コードの CPU とヒープのスナップショットを定期的に取得するスレッドを生成することで動作します。これにはプロファイラー自身も含まれる場合があります。プロファイラー自身を無視したい場合は、 DD_PROFILING_IGNORE_PROFILERtrue に設定します。

Datadog Lambda 拡張機能は、Datadog にデータを送信するために公衆インターネットにアクセスする必要があります。Lambda 関数が公衆インターネットにアクセスできない VPC にデプロイされている場合、datadoghq.com Datadog サイト には AWS PrivateLink 経由でデータを送信し、それ以外のサイトにはプロキシ経由でデータを送信することができます。

Datadog Forwarder を使用している場合は、こちらの手順に従ってください。

複数の Datadog 組織にテレメトリーを送信する

複数の組織にデータを送信したい場合は、平文の API キー、AWS Secrets Manager、または AWS KMS を使用してデュアルシッピングを有効にすることができます。

Lambda 関数に次の環境変数を設定することで、平文の API キーを使用してデュアルシッピングを有効にすることができます。

# メトリクスでデュアルシッピングを有効にします
DD_ADDITIONAL_ENDPOINTS={"https://app.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://app.datadoghq.eu": ["<your_api_key_4>"]}
# APM (トレース) でデュアルシッピングを有効にします
DD_APM_ADDITIONAL_ENDPOINTS={"https://trace.agent.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://trace.agent.datadoghq.eu": ["<your_api_key_4>"]}
# APM (プロファイリング) でデュアルシッピングを有効にします
DD_APM_PROFILING_ADDITIONAL_ENDPOINTS={"https://trace.agent.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://trace.agent.datadoghq.eu": ["<your_api_key_4>"]}
# ログでデュアルシッピングを有効にします
DD_LOGS_CONFIG_FORCE_USE_HTTP=true
DD_LOGS_CONFIG_ADDITIONAL_ENDPOINTS=[{"api_key": "<your_api_key_2>", "Host": "agent-http-intake.logs.datadoghq.com", "Port": 443, "is_reliable": true}]

Datadog 拡張機能は、_SECRET_ARN のプレフィックスが付いた任意の環境変数について、AWS Secrets Manager の値の自動取得をサポートしています。これを利用することで、環境変数を Secrets Manager に安全に格納し、Datadog でのデュアルシッピングを可能にすることができます。

  1. Lambda 関数に環境変数 DD_LOGS_CONFIG_FORCE_USE_HTTP を設定します。
  2. Lambda 関数の IAM ロールの権限に secretsmanager:GetSecretValue の権限を追加します。
  3. Secrets Manager に、メトリクスのデュアルシッピング用の環境変数を格納するための新しいシークレットを作成します。その内容は、{"https://app.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://app.datadoghq.eu": ["<your_api_key_4>"]}と似た内容になります。
  4. Lambda 関数の環境変数 DD_ADDITIONAL_ENDPOINTS_SECRET_ARN に上記シークレットの ARN を設定します。
  5. Secrets Manager に、APM (トレース) のデュアルシッピング用の環境変数を格納するための新しいシークレットを作成します。その内容は、{"https://trace.agent.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://trace.agent.datadoghq.eu": ["<your_api_key_4>"]}似た内容になります。
  6. Lambda 関数の環境変数 DD_APM_ADDITIONAL_ENDPOINTS_SECRET_ARN に上記シークレットの ARN と同じ値を設定します。
  7. Secrets Manager に、APM (プロファイリング) のデュアルシッピング用の環境変数を格納するための新しいシークレットを作成します。その内容は、{"https://trace.agent.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://trace.agent.datadoghq.eu": ["<your_api_key_4>"]}似た内容になります。
  8. Lambda 関数の環境変数 DD_APM_PROFILING_ADDITIONAL_ENDPOINTS_SECRET_ARN に上記シークレットの ARN と同じ値を設定します。
  9. Secrets Manager に、ログのデュアルシッピング用の環境変数を格納するための新しいシークレットを作成します。その内容は、[{"api_key": "<your_api_key_2>", "Host": "agent-http-intake.logs.datadoghq.com", "Port": 443, "is_reliable": true}]似た内容になります。
  10. Lambda 関数の環境変数 DD_LOGS_CONFIG_ADDITIONAL_ENDPOINTS_SECRET_ARN に上記シークレットの ARN と同じ値を設定します。

Datadog 拡張機能は、_KMS_ENCRYPTED のプレフィックスが付いた任意の環境変数について、AWS KMS の値の自動復号化をサポートしています。これを利用することで、環境変数を KMS に安全に格納し、Datadog でのデュアルシッピングを可能にすることができます。

  1. Lambda 関数に環境変数 DD_LOGS_CONFIG_FORCE_USE_HTTP=true を設定します。
  2. Lambda 関数の IAM ロールの権限に kms:GenerateDataKeykms:Decrypt の権限を追加します。
  3. メトリクスのデュアルシッピングの場合は、KMS を使用して{"https://app.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://app.datadoghq.eu": ["<your_api_key_4>"]} を暗号化し、DD_ADDITIONAL_ENDPOINTS_KMS_ENCRYPTED 環境変数にその値を設定します。
  4. トレースのデュアルシッピングの場合は、KMS を使用して {"https://trace.agent.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://trace.agent.datadoghq.eu": ["<your_api_key_4>"]} を暗号化し、DD_APM_ADDITIONAL_KMS_ENCRYPTED 環境変数にその値を設定します。
  5. プロファイリングのデュアルシッピングの場合は、KMS を使用して {"https://trace.agent.datadoghq.com": ["<your_api_key_2>", "<your_api_key_3>"], "https://trace.agent.datadoghq.eu": ["<your_api_key_4>"]} を暗号化し、DD_APM_PROFILING_ADDITIONAL_ENDPOINTS_KMS_ENCRYPTED 環境変数にその値を設定します。
  6. ログのデュアルシッピングの場合は、KMS を使用して [{"api_key": "<your_api_key_2>", "Host": "agent-http-intake.logs.datadoghq.com", "Port": 443, "is_reliable": true}] を暗号化し、DD_LOGS_CONFIG_ADDITIONAL_ENDPOINTS_KMS_ENCRYPTED 環境変数にその値を設定します。

より高度な使用方法については、デュアルシッピングガイドを参照してください。

AWS リソース上でトレースコンテキストを伝播させる

Datadog は、発信する AWS SDK のリクエストにトレースコンテキストを自動的に挿入し、Lambda イベントからトレースコンテキストを抽出します。これにより、Datadog は分散サービス上でリクエストやトランザクションをトレースすることができます。サーバーレスのトレース伝播を参照してください。

X-Ray と Datadog のトレースをマージする

AWS X-Ray は、AppSync や Step Functions などの特定の AWS マネージドサービスを通じたトレースをサポートしていますが、Datadog APM ではネイティブにサポートされていません。Datadog X-Ray インテグレーションを有効にし、X-Ray トレースを Datadog ネイティブトレースとマージすることが可能です。追加詳細を参照してください。

AWS Lambda のコード署名を有効にする

AWS Lambda のコード署名により、信頼できるコードのみを Lambda 関数から AWS へデプロイすることができます。関数でコード署名を有効にすると、デプロイメントのすべてのコードが信頼できるソースにより署名されていることが AWS で検証されます。このソースは、コード署名コンフィギュレーションで定義します。

Lambda 関数がコード署名を使用するように構成されている場合、Datadog が公開する Lambda レイヤーを使用して Lambda 関数をデプロイする前に、関数のコード署名構成に Datadog の Signing Profile ARN を追加する必要があります。

Datadog の Signing Profile ARN:

arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc

arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc

Datadog Lambda 拡張機能に移行する

Datadog は、Forwarder Lambda 関数または Lambda 拡張機能を使用して、Lambda 関数から監視データを収集することができます。Datadog は、新規インストールには Lambda 拡張機能を推奨しています。迷っている場合は、Datadog Lambda 拡張機能への移行を決定するを参照してください。

移行するには、Datadog Lambda 拡張機能を使ったインストール手順Datadog Forwarder を使った手順を比較してみてください。ご参考までに、主な相違点を以下にまとめます。

: Datadog では、まず開発用とステージング用のアプリケーションを移行し、本番用のアプリケーションを 1 つずつ移行していくことを推奨しています。

  1. datadog/datadog-ci を最新バージョンにアップグレードする
  2. 引数 --layer-version を更新し、ランタイムの最新バージョンに設定します。
  3. 引数 --extension-version を最新の拡張機能バージョンに設定します。最新の拡張機能バージョンは 66 です。
  4. 必要な環境変数 DATADOG_SITEDATADOG_API_KEY_SECRET_ARN を設定します。
  5. 引数 --forwarder を削除します。
  6. Lambda のロググループに Forwarder を自動的にサブスクライブするように Datadog AWS インテグレーションを構成した場合、その地域の Lambda 関数を_すべて_移行した後にそれを無効にしてください。
  1. serverless-plugin-datadog を最新バージョンにアップグレードしてください。これにより、addExtensionfalse に設定しない限り、Datadog Lambda 拡張機能がデフォルトでインストールされます。
  2. 必要なパラメーター siteapiKeySecretArn を設定します。
  3. Lambda のリソースタグとして envserviceversion パラメーターを設定していた場合は、それらを設定します。このプラグインは、拡張機能を使用する際に、代わりに DD_ENV などの Datadog で予約された環境変数を通して自動的にそれらを設定します。
  4. ただし、Lambda 以外のリソースからログを収集するために Forwarder を保持し、subscribeToApiGatewayLogssubscribeToHttpApiLogssubscribeToWebsocketLogstrue に設定している場合は、forwarderArn パラメーターは削除してください。
  5. Lambda のロググループに Forwarder を自動的にサブスクライブするように Datadog AWS インテグレーションを構成した場合、その地域の Lambda 関数を_すべて_移行した後にそれを無効にしてください。
  1. datadog-serverless-macro CloudFormation スタックを更新して、最新バージョンを取得します。
  2. extensionLayerVersion パラメーターを最新の拡張機能バージョンに設定します。最新の拡張機能バージョンは 66 です。
  3. 必要なパラメーター siteapiKeySecretArn を設定します。
  4. forwarderArn パラメーターを削除します。
  5. Lambda のロググループに Forwarder を自動的にサブスクライブするように Datadog AWS インテグレーションを構成した場合、その地域の Lambda 関数を_すべて_移行した後にそれを無効にしてください。
  1. datadog-cdk-constructs または datadog-cdk-constructs-v2 を最新バージョンにアップグレードします。
  2. extensionLayerVersion パラメーターを最新の拡張機能バージョンに設定します。最新の拡張機能バージョンは 66 です。
  3. 必要なパラメーター siteapiKeySecretArn を設定します。
  4. Lambda のリソースタグとして envserviceversion パラメーターを設定していた場合は、それらを設定します。このコンストラクトは、拡張機能を使用する際に、代わりに DD_ENV などの Datadog で予約された環境変数を通して自動的にそれらを設定します。
  5. forwarderArn パラメーターを削除します。
  6. Lambda のロググループに Forwarder を自動的にサブスクライブするように Datadog AWS インテグレーションを構成した場合、その地域の Lambda 関数を_すべて_移行した後にそれを無効にしてください。
  1. ランタイム用の Datadog Lambda ライブラリレイヤーを最新バージョンにアップグレードします。
  2. 最新バージョンの Datadog Lambda 拡張機能をインストールします。
  3. 必要な環境変数 DD_SITEDD_API_KEY_SECRET_ARN を設定します。
  4. 環境変数 DD_ENVDD_SERVICEDD_VERSION を Lambda のリソースタグとして設定したことがある場合は、それを設定します。
  5. Lambda 関数のロググループから Datadog Forwarder にログをストリーミングするサブスクリプションフィルターを削除します。
  6. Lambda のロググループに Forwarder を自動的にサブスクライブするように Datadog AWS インテグレーションを構成した場合、その地域の Lambda 関数を_すべて_移行した後にそれを無効にしてください。

Datadog Lambda 拡張機能を使用した x86 から arm64 への移行

Datadog 拡張機能は、x86 と arm64 の両方のバリアントで利用可能なコンパイル済みバイナリです。CDK、Serverless Framework、SAM などのデプロイメントツールを使用して x86 Lambda 関数を arm64 (または arm64 から x86) に移行する場合、サービスインテグレーション (API Gateway、SNS、Kinesis など) が Lambda 関数のバージョンまたはエイリアスを使用するように構成されていることを確認してください。そうしないと、デプロイメント中に関数が約 10 秒間利用できなくなる可能性があります。

この現象が起きるのは、x86 から arm64 への Lambda 関数の移行が、updateFunctionupdateFunctionConfiguration という並列で実行される 2 つの API 呼び出しで構成されているからです。これらの呼び出し中に短時間のずれが生じ、Lambda の updateFunction の呼び出しが完了して新しいアーキテクチャを使用するようコードが更新されても、 updateFunctionConfiguration の呼び出しがまだ完了せず、拡張機能で引き続き古いアーキテクチャを使用する構成が残ってしまいます。

Layer のバージョンを利用できない場合、Datadog では、アーキテクチャの移行プロセス中に Datadog Forwarder の構成を行うことを推奨しています。

ローカルテスト用の Datadog Lambda 拡張機能の構成

Datadog Lambda 拡張機能をインストールして、Lambda 関数のコンテナイメージをローカルでテストするには、ローカルのテスト環境で DD_LOCAL_TESTtrue に設定する必要があります。そうしないと、拡張機能は AWS Extensions API からのレスポンスを待ち、呼び出しをブロックします。

OpenTelemetry API を使用した AWS Lambda のインスツルメンテーション

Datadog Lambda 拡張機能のインストール時に含まれる Datadog トレーシングライブラリは、OpenTelemetry でインスツルメンテーションされたコードで生成されたスパンとトレースを受け入れ、テレメトリーを処理し、Datadog に送信します。

このアプローチは、例えば、コードが既に OpenTelemetry API でインスツルメントされている場合に使用できます。また、OpenTelemetry API を使用してベンダーニュートラルなコードでインスツルメントしつつ、Datadog トレーシングライブラリの利点を享受したい場合にも適しています。

AWS Lambda を OpenTelemetry API でインスツルメントするには、環境変数 DD_TRACE_OTEL_ENABLEDtrue に設定してください。詳細は OpenTelemetry API を使ったカスタムインスツルメンテーションを参照してください。

トラブルシューティング

インストール時の構成に問題がある場合は、環境変数 DD_LOG_LEVELdebug に設定すると、デバッグ用のログが出力されます。その他のトラブルシューティングのヒントについては、サーバーレスモニタリングのトラブルシューティングガイドを参照してください。

その他の参考資料