サーバーレスモニタリングの構成

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

メトリクス

ログ管理

APM

その他

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

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

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

この機能は現在、Python、Node.js、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 リソースからメトリクスを収集する

Datadog Lambda 拡張メトリクスのリアルタイム収集に加え、Datadog は API GatewayAppSyncSQS などの AWS マネージドリソースに対するメトリクスを収集し、サーバーレスアプリケーション全体の監視を支援することが可能です。また、メトリクスは対応する AWS リソースタグでリッチ化されます。

これらのメトリクスを収集するには、Datadog AWS インテグレーションを設定します。

非 Lambda リソースからログを収集する

AWS Lambda 関数以外のマネージドリソースで生成されたログは、サーバーレスアプリケーションの問題の根本的な原因を特定するのに役立ちます。Datadog では、お使いの環境の以下の AWS マネージドリソースからログを収集することをお勧めします。

  • API: API Gateway、AppSync、ALB
  • キューとストリーム: SQS、SNS、Kinesis
  • データストア: DynamoDB、S3、RDS

非 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 に設定します。

ログ収集の構成

ログから情報をフィルタリングまたはスクラブする

STARTEND のログを除外するには、環境変数 DD_LOGS_CONFIG_PROCESSING_RULES[{"type": "exclude_at_match", "name": "exclude_start_and_end_logs", "pattern": "(START|END) RequestId"}] に設定します。また、プロジェクトのルートディレクトリに datadog.yaml ファイルを追加して、以下の内容を記述することも可能です。

logs_config:
  processing_rules:
    - type: exclude_at_match
      name: exclude_start_and_end_logs
      pattern: (START|END) RequestId

Datadog では、REPORT ログを残すことを推奨しています。これは、サーバーレス関数のビューで呼び出しリストを生成するために使用されるからです。

Datadog に送信する前に他のログをスクラブまたはフィルタリングするには、高度なログ収集を参照してください。

ログ収集の無効化

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

Datadog Forwarder Lambda 関数を使用したログ収集を停止したい場合は、自身の Lambda 関数の CloudWatch ロググループからサブスクリプションフィルターを削除します。

Datadog Lambda 拡張機能を使用してログの収集を停止したい場合は、使用するインストール方法に応じて以下の手順に従ってください。

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

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

トレース収集の構成

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

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

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

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

トレース収集の無効化

Datadog Lambda 拡張機能によるトレース収集は、デフォルトで有効になっています。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}.* が使用されます。

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

この機能は、Go と Java でサポートされています。

Datadog ソースコードインテグレーションでは、GitHub で Lambda 関数のソースコードにテレメトリー (スタックトレースなど) をリンクさせることができます。以下の手順で機能を有効化してください。: ダーティでもリモートより先でもない、ローカルの Git リポジトリからデプロイする必要があります。

datadog-ci lambda instrument--source-code-integration true で実行すると、現在のローカルディレクトリの Git メタデータが自動的に送信され、Lambda 関数に必要なタグが追加されます。

: Git のメタデータをアップロードするためには、環境変数 DATADOG_API_KEYdatadog-ci に設定する必要があります。DATADOG_API_KEY は、テレメトリーを送信する Lambda 関数にも設定されますが、 DATADOG_API_KEY_SECRET_ARN も定義されている場合は、DATADOG_API_KEY より優先的に設定されます。

# ... その他の必要な環境変数 (DATADOG_SITE など)

# 必須、git メタデータをアップロードするため
export DATADOG_API_KEY=<DATADOG_API_KEY>

# オプション、未定義の場合は DATADOG_API_KEY が使用されます
export DATADOG_API_KEY_SECRET_ARN=<DATADOG_API_KEY_SECRET_ARN>

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

enableSourceCodeIntegrationtrue に設定すると、Datadog サーバーレスプラグインは自動的に現在のローカルディレクトリの Git メタデータを送信し、Lambda 関数に必要なタグを追加します。

: Git のメタデータをアップロードするためには、プラグインに apiKey パラメーターを設定する必要があります。また、テレメトリーを送信する Lambda 関数にも apiKey が設定されますが、apiKeySecretArn も定義されている場合は apiKey よりも優先されます。

custom:
  datadog:
    # ... その他の必要なパラメーター (Datadog のサイトなど)
    apiKey: <apiKey> # required, to upload git metadata
    apiKeySecretArn: <apiKeySecretArn> # オプション、未定義の場合は apiKey が使用されます
    enableSourceCodeIntegration: true # default is true

初期化関数を次のように変更し、CDK スタックに gitHash の値を渡します。

async function main() {
  // パッケージマネージャーで @datadog/datadog-ci を追加することを確認します
  const datadogCi = require("@datadog/datadog-ci");
  const gitHash = await datadogCi.gitMetadata.uploadGitCommitHash('{Datadog_API_Key}', '<SITE>')

  const app = new cdk.App();
  // ExampleStack のコンストラクタにハッシュを渡します
  new ExampleStack(app, "ExampleStack", {}, gitHash);
}

スタックのコンストラクタで、オプションの gitHash パラメーターを追加して、addGitCommitMetadata() を呼び出します。

export class ExampleStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps, gitHash?: string) {
    ...
    ...
    datadog.addGitCommitMetadata([<YOUR_FUNCTIONS>], gitHash)
  }
}
  1. Lambda 関数に環境変数 DD_TAGS="git.commit.sha:<GIT_COMMIT_SHA>,git.repository_url=<REPOSITORY_URL>" を設定します
  2. CI パイプラインで datadog-ci git-metadata upload を実行し、Git メタデータをアップロードします
  3. オプションで、GitHub アプリをインストールすると、インラインでソースコードのスニペットを表示することができます。

カスタムメトリクスの送信

カスタムメトリクスの送信により、カスタムビジネスロジックを監視することができます。

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

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

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

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 を最新の拡張機能バージョンに設定します。最新の拡張機能バージョンは 23 です。
  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 パラメーターを最新の拡張機能バージョンに設定します。最新の拡張機能バージョンは 23 です。
  3. 必要なパラメーター siteapiKeySecretArn を設定します。
  4. forwarderArn パラメーターを削除します。
  5. Lambda のロググループに Forwarder を自動的にサブスクライブするように Datadog AWS インテグレーションを構成した場合、その地域の Lambda 関数を_すべて_移行した後にそれを無効にしてください。
  1. datadog-cdk-constructs または datadog-cdk-constructs-v2 を最新バージョンにアップグレードします。
  2. extensionLayerVersion パラメーターを最新の拡張機能バージョンに設定します。最新の拡張機能バージョンは 23 です。
  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 関数を_すべて_移行した後にそれを無効にしてください。

トラブルシューティング

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

その他の参考資料