使用由Amplify CLI创建的ES模块在AWS Lambda中。

3
根据AWS博客的说法,从Nodejs14运行时开始支持在Lambda中使用ES模块。
公告 - https://aws.amazon.com/about-aws/whats-new/2022/01/aws-lambda-es-modules-top-level-await-node-js-14/ 示例 - https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/ 我已经检查了Lambda函数运行时是Node14(并尝试切换到Node18没有任何区别)- 我通过Lambda控制台检查了一次我推送代码后的设置,并检查了当Amplify配置更改时版本是否更改为18。
我不会详细介绍我如何到达这里,除了我需要使用一个编写为ESM语法的npm包。
作为一种合理的检查方法和最小可重现的示例,我使用Amplify CLI生成了一个新的简单hello world函数,然后使用amplify mock function test --event src/event.json运行它并确认它可以正常运行。但当我将package.json更改为"type":"module"时,出现了以下错误:
  stack: 'Error: Could not load lambda handler function due to Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /[redacted]/amplify/backend/function/test/src/index.js\n' +
    'require() of ES modules is not supported.\n' +
    'require() of /[redacted]/amplify/backend/function/test/src/index.js from /snapshot/repo/build/node_modules/amplify-nodejs-function-runtime-provider/lib/utils/execute.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.\n' 

无论我是从amplify mock function CLI、Lambda控制台还是通过访问链接到Lambda函数的API网关来运行该函数,我都会遇到相同的错误。

除了上面链接的博客文章之外,我找不到任何其他关于在Lambda中使用ES模块的提及或示例。

如果您想自己尝试:

  1. 安装amplify cli
  2. amplify init
  3. amplify add function并将其命名为test,选择Nodejs,Hello World模板
  4. amplify mock function test --event src/event.json,它将正常工作
  5. 更改amplify/backend/function/test/src/package.json以包括"type":"module"`
  6. amplify mock function test --event src/event.json,它将失败

可选地,您可以将应用程序推送到AWS并通过Lambda控制台测试lambda,您应该获得相同的结果。

相关问题:

  • https://github.com/aws-amplify/amplify-cli/issues/10437:同样的问题是由于导入的模块是ESM,通过更新该模块的版本提供了CJS支持来解决的。
  • https://github.com/aws-amplify/amplify-cli/issues/5691:这与根项目是ESM(在package.json中类型为module)有关,并通过amplify hooks对package.json进行了猴子补丁,但并未解决导入ESM包的问题。底部有一条评论声称在amplify CLI 10.2.3中已经修复了此问题,但可能仅解决了根包问题,而没有解决我遇到的lambda子项目问题。
  • https://github.com/aws-amplify/amplify-cli/issues/10432:涉及使用“mock function”,但问题与模拟或部署的函数有关。所述步骤是继续从TypeScript生成CJS输出,将TS代码转换为ESM样式的导入/导出。因为amplify运行的代码是CJS,如果尝试导入ESM包,则会失败。

Amplify CLI 的版本是多少? - morganney
你看到这个相关问题了吗:https://github.com/aws-amplify/amplify-cli/issues/10432 - morganney
@morganney CLI v10.6.1。该问题涉及“模拟函数”的使用,但问题与模拟或部署的函数有关。所述步骤是关于在 TypeScript 中继续生成 CJS 输出,同时 TS 代码使用 ESM 样式的导入/导出。因为 amplify 运行的代码是 CJS,如果您尝试导入 ESM 包,则会失败。我没有看到这个问题,但它并不确认或否认我在我的 OP 中概述的官方说明。 - Dave Meehan
我已经更新了原帖,提到了Amplify存储库中现有的问题,这些问题与但并未提供解决方案。 - Dave Meehan
1个回答

0

这里描述了两个不同的问题。第一个问题是关于 'libphonenumebr-js' 的,根据 Github 的票据,在包的最新版本中已经修复了该问题。

第二个问题是 amplify mock 不支持 ES 导入,这真是太遗憾了。同样的方式,如果启用了 lambda 层,则也不支持它们。因此,您需要先部署到 AWS,然后在那里测试您的更改。

在 lambda 控制台中,如果 package.json 没有设置为 type module,则会出现 'require() of ES modules is not supported.\n' 错误。


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