无法使用 Nodejs14.x ES 模块在 AWS lambda 中导入包

Lam*_*Lam 8 aws-lambda node-js-14 esmodules

我有一个层,其中 node_modules 的路径是nodejs/node14/node_modules

使用该层,我尝试在 Lambda 函数中导入一个包,例如“aws-cloudfront-sign”,如下所示:

import cfsign from 'aws-cloudfront-sign'
Run Code Online (Sandbox Code Playgroud)

我收到错误消息

Cannot find package 'aws-cloudfront-sign' imported from /var/task/signer.js\nDid you mean to import aws-cloudfront-sign/lib/cloudfrontUtil.js?
Run Code Online (Sandbox Code Playgroud)

但是如果我像这样导入包:

import cfsign from '/opt/nodejs/node14/node_modules/aws-cloudfront-sign/lib/cloudfrontUtil.js'
Run Code Online (Sandbox Code Playgroud)

它成功了。

你知道为什么吗?如何正确导入包?

hen*_*lst 10

2023 年更新:

请注意,根据问题,下面的解决方案适用于具有特定 SDK 版本的 Node 14 问题。Node 18+ 现在支持 AWS SDK v3 的导入。对于其他 Node/SDK 版本使用以下解决方案可能不起作用。

请参阅此处的 AWS 帖子以及讨论使用 Lambda 的节点运行时 14 和 16 时,ESM 从 NODE_PATH 导入不可用

结束更新


这似乎是一个错误。它发生在层和 SDK 中。Github 上有许多类似的未解决问题:

Nodejs Lambda:找不到包“aws-sdk”

使用 ES 模块和 Lambda 层时找不到包

ES6 导入在 @aws-sdk/client-iotsitewise 中不起作用

正如您所发现的,目前唯一的解决方法似乎是使用绝对路径。例如:

import { DynamoDB } from 'aws-sdk;'
Run Code Online (Sandbox Code Playgroud)

失败,而

import AWS from '/var/runtime/node_modules/aws-sdk/lib/aws.js';
const { DynamoDB } = AWS;
Run Code Online (Sandbox Code Playgroud)

将工作。

我建议您将您的声音添加到现有的未决问题中,以帮助确保它得到关注。

  • 我也遇到了这个问题,上面的解决方案只是给了我这个错误: "errorType": "Error", "errorMessage": "Cannot find module '/var/runtime/node_modules/aws-sdk/lib/aws.js ' 从 /var/task/index.mjs 导入", (6认同)