【问题标题】:AWS Lambda accessing node modules from a zip file created on a Windows machineAWS Lambda 从 Windows 机器上创建的 zip 文件访问节点模块
【发布时间】:2020-04-25 08:01:00
【问题描述】:

我正在使用 NodeJS12.x 运行时编写 AWS Lambda。这很简单。它通过邮戳发送电子邮件。我知道 SES 是一个替代方案,我选择不走这条路。

const postmark = require("postmark");
const postmarkClient = new postmark.ServerClient(process.env.POSTMARK_TOKEN);

exports.handler = function (event, context, callback) {
  postmarkClient.sendEmail({
    From: "some@email.address",
    To: "different@email.address",
    Subject: "My emails subject",
    TextBody: "My emails text body"
  });
}

上传的 zip 结构如下所示:

lambda.zip:
- node_modules/
-- postmark/
-- axios/
-- other-modules/
- index.js
- package.json

当我从我的 Windows 机器上传该 zip 并测试 lambda 时,它会在我的 CloudWatch 日志中显示此错误:

错误:找不到模块 './node_modules/postmark'\n需要堆栈:\n- /var/task/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index .js

酷。我在谷歌上搜索了一个美好的下午,除此之外,还遇到了另一个Stack Overflow answer,用于修复Linux系统中的类似问题。 Octopus 建议我通过运行这些命令来确保所有文件都是可执行的并且我拥有它们:

sudo chmod +x *.js -R
sudo chown myself.myself * -R
zip -r lambda.zip .

因此,我为 Windows 启动了值得信赖的 Linux 子系统(因为我们现在拥有它),克隆了我的存储库,运行了命令,将那个新的 zip 文件部署到我的 AWS Lambda 函数中,并进行了测试。瞧,邮戳在我的收件箱中发送了一封电子邮件。

那太好了。 Windows 再次输给 Linux。我在那辆火车上。但是我仍然在 Windows 中工作,需要在这个环境中开发和部署我的功能。

我的两个问题如下:

  1. 我需要更改哪些内容才能在我的计算机的 Windows 端复制这些 Linux 操作?
  2. 为什么需要这些操作?

【问题讨论】:

  • 比较有效的 zip 结构和无效的 zip 结构。有什么不同吗?在打包 JavaScript 源文件或 chown 文件之前,您不需要 chmod +x (至少我从来没有这样做过)。维奥拉是谁?
  • 好问题!最终,它会引导我走上正确的道路。喝了四杯酒后,我发现了我的答案:我的压缩工具在两种情况下的压缩方式都不一样(尽管 kdiff3 似乎认为两个目录在解压缩后是相同的)。在 Windows 中,我使用一个名为 jszip-cli 的 NPM 模块来压缩我的项目,而在我的 Linux 子系统上,我使用的是内置的 zip 工具。我更换了我的 Windows 端以使用 PowerShell 压缩方法,一切似乎都是犹太洁食。为了后代,这是我使用的脚本的帖子:stackoverflow.com/a/26843122/3203689

标签: node.js windows amazon-web-services aws-lambda node-modules


【解决方案1】:

事实证明,我在 Windows 上使用的压缩工具与本地工具的压缩方式不同。我正在使用一个名为 jszip-cli 的节点模块来压缩我的项目。一旦切换到下面的 PowerShell 命令(我找到了here),lambda 就开始正常工作了:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

【讨论】:

    猜你喜欢
    • 2017-08-14
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多