4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS CDK - Dynamic require of "xxx" is not supported エラー対応

Posted at

内容

AWS CDKのLambda実装で@aws-lambda-powertools/loggerを使用した際、
以下エラーが発生したため対応方法メモ

{
    "errorType": "Error",
    "errorMessage": "Dynamic require of \"node:crypto\" is not supported",
    "stack": [
        "Error: Dynamic require of \"node:crypto\" is not supported",
        "    at file:///var/task/index.mjs:1:383",
        "    at file:///var/task/index.mjs:13:15027",
        "    at file:///var/task/index.mjs:1:499",
        "    at file:///var/task/index.mjs:13:23037",
        "    at file:///var/task/index.mjs:1:499",
        "    at file:///var/task/index.mjs:15:1062",
        "    at async file:///var/task/index.mjs:15:1026"
    ]
}

開発環境

  • aws-cdk: v2 (2.66.1)
  • aws-sdk: v3 (3.348.0)
  • Lambdaランタイム: Nodejs.18.x
  • @aws-lambda-powertools/logger: 1.9.0

原因

ESM、CJS関連は複雑なため詳細には理解できていないが、ESMとCJSが混在する場合は注意が必要
混在する場合、import、requireの可/不可が存在する
LambdaランタイムにNodejs.18.xを使用する場合ESMとなり、
CJSパッケージは数多く存在するため、どうしても混在することが多い
今回、TypeScript 4.7 と Native Node.js ESMに記載されているように、
ESMからCJSの Dynamic Importrequire ができないためエラーとなった

cryptoに記載されているように、
自身で実装するESMのコードから crypto をimportする場合、以下のように await でimport可能
(今回は、@aws-lambda-powertools/logger 内でrequireされている crypto でエラーとなっているため不可)

const { createHmac } = await import('node:crypto');

ESM、CJS関連参考

対策

以下2つの方法でエラーの解消ができた

1. require を使えるようにする

How to fix "Dynamic require of "os" is not supported"にあるように、
banner を指定することで、バンドル後のmjsファイルの先頭に
import { createRequire } from 'module';const require = createRequire(import.meta.url);
を組み込み
require を使えるようにする

CDKの場合、
NodejsFunctionのパラメータ bundlingbannerを指定する

    const bundling = {
      banner: "import { createRequire } from 'module';const require = createRequire(import.meta.url);",
      minify: true,
      sourceMap: true,
      tsconfig: path.join(__dirname, '../../tsconfig.json'),
      format: OutputFormat.ESM,
    };

2. @aws-lambda-powertools/logger をバンドルしない

NodejsFunctionのパラメータ bundlingnodeModules にパッケージを指定し、バンドル対象外にする

    const bundling = {
      minify: false,
      sourceMap: true,
      tsconfig: path.join(__dirname, '../../tsconfig.json'),
      format: OutputFormat.ESM,
      nodeModules: ['@aws-lambda-powertools/logger'],
    };
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?