在AWS Lambda中使用Node.js 14.x ES模块时无法导入包。

6

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

利用该层,在Lambda函数中尝试导入一个包,比如说'aws-cloudfront-sign':

import cfsign from 'aws-cloudfront-sign'

我收到了错误信息。
Cannot find package 'aws-cloudfront-sign' imported from /var/task/signer.js\nDid you mean to import aws-cloudfront-sign/lib/cloudfrontUtil.js?

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

import cfsign from '/opt/nodejs/node14/node_modules/aws-cloudfront-sign/lib/cloudfrontUtil.js'

它成功了。

你知道为什么吗?我该如何正确地导入这个包?

2个回答

10

2023更新:

请注意,下面的解决方案是针对使用特定SDK版本的Node 14问题而设计的。在Node 18+中,已经支持AWS SDK v3的导入。对于其他Node/SDK版本,使用下面的解决方案可能无法正常工作。

请参阅这里的AWS帖子使用Lambda的Node Runtime 14和16时,ESM从NODE_PATH导入不可用的讨论

更新结束


这似乎是一个错误。它与层和SDK有关。在Github上有许多类似的问题:

Nodejs Lambda:找不到软件包'aws-sdk'

使用ES模块和Lambda Layer时找不到软件包

{{link3:@aws-sdk/client-iotsitewise中的ES6导入不起作用}}

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

import { DynamoDB } from 'aws-sdk;'

失败,而

import AWS from '/var/runtime/node_modules/aws-sdk/lib/aws.js';
const { DynamoDB } = AWS;

会起作用。

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


1
谢谢!我已经开了一个工单来询问这个问题。希望他们能尽快解决它。 - Lam
6
我也遇到了这个问题,上面的解决方案给了我这个错误: "errorType": "Error", "errorMessage": "Cannot find module '/var/runtime/node_modules/aws-sdk/lib/aws.js' imported from /var/task/index.mjs"。 - Justin Meskan
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/var/runtime/node_modules/aws-sdk/lib/aws.js' imported from /var/task/index.mjs - jkalandarov
2023年的更新部分对我很有帮助。为了使其正常工作,我将节点16.x升级到18.x运行时。 - fsevenm
我没有理解的是,在v3中,他们将SDK分成了若干部分以帮助减少构建大小,因此您需要根据使用的服务进行导入。请查看文档:https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/introduction/ - YoniXw

0
我遇到了类似的问题。在我的Lambda函数中,我无法导入我的Dynomdb。
最后,我做了这样的处理。
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import {
  DynamoDBDocumentClient,
  PutCommand,
} from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});

const dynamo = DynamoDBDocumentClient.from(client);

这将创建一个新的客户端,您可以使用它来运行各种命令。
在此处查看文档:AWS SDK for JavaScript DynamoDB 查看这些DynamoDB的客户端文档 enter link description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接