概要

Datadog のトレーシングライブラリ (dd-trace) は、条件付きインポートの使用やその他の問題により、Webpack などのバンドラーと互換性がないことが知られています。Webpack は dd-trace をビルドできませんが、アプリケーションは、ビルド済みの Datadog Lambda レイヤーによって提供される dd-trace および datadog-lambda-js ライブラリを引き続き使用できます。以下の手順に従ってください。

Webpack

  1. Node.js のインストール手順に従い、Node.js の Datadog Lambda レイヤーが Lambda 関数に追加されていることを確認します。

  2. package.json とビルドプロセスから datadog-lambda-jsdd-trace を削除します。

  3. externals として datadog-lambda-jsdd-trace をマークします。これは、Datadog Lambda レイヤーによって提供される Lambda ランタイムですでに利用可能であるため、依存関係としてのビルドをスキップするようにバンドラーに指示します。

    webpack.config.js

    var nodeExternals = require("webpack-node-externals");
    
    module.exports = {
      // use webpack-node-externals to exclude all node dependencies.
      // You can manually set the externals too.
      externals: [nodeExternals(), "dd-trace", "datadog-lambda-js"],
    };
    
  4. serverless-webpack を使用していて、オプション includeModulesfalse 以外の値を設定している場合、serverless-webpack は自動的に node_modules 以下に外部モジュールをパックします。そのため、datadog-lambda-jsdd-trace を強制的に除外する必要があります。serverless-webpack を使用しない場合、または serverless.yml に includeModules オプションがない場合は、このステップをスキップしてください。

    serverless.yml

    custom:
      webpack:
        # Note: You only need the following if you already have the includeModules option configured
        includeModules:
          # ... your existing configuration for includeModules
          forceExclude:
            - dd-trace
            - datadog-lambda-js
        packagerOptions:
          scripts:
            # optional, only needed when they are included as transitive dependencies 
            - rm -rf node_modules/datadog-lambda-js node_modules/dd-trace
    

esbuild

  1. Node.js のインストール手順に従い、Node.js の Datadog Lambda レイヤーが Lambda 関数に追加されていることを確認します。

  2. package.json とビルドプロセスから datadog-lambda-jsdd-trace を削除します。

  3. externals として datadog-lambda-jsdd-trace をマークします。これは、Datadog Lambda レイヤーによって提供される Lambda ランタイムですでに利用可能であるため、依存関係としてのビルドをスキップするようにバンドラーに指示します。

  4. Esbuild サポートのページの手順に従って、Datadog の Esbuild プラグインを使用します。これにより、バンドルされた依存関係のインスツルメンテーションが可能になります。

    esbuild.config.js (esbuild-config を使用している場合)

    {
      "external": ["dd-trace", "datadog-lambda-js"],
    }
    

    serverless.yml (serverless-esbuild を使用している場合)

    custom:
      esbuild:
        exclude: ["dd-trace", "datadog-lambda-js", "aws-sdk"] # aws-sdk is needed because it is the default value for `exclude`
    

その他の参考資料