4

我在单个 template.yaml 中定义了多个 lambda 函数。这些函数有一些通用代码,但没有发布模块。我以为我可以把这些常见的东西变成一个版本化的层。用一个目录来大意如下:

  • 项目
    • LambdaFunc1
      • 包.json
      • 节点模块
      • func1.js
    • LambdaFunc2
      • 包.json
      • 节点模块
      • func2.js
    • 普通的东西
      • 包.json
      • 我的common.js
    • 模板.yaml
    • 节点模块

测试后,我将 common-stuff 复制到 Projects/node_modules 目录中,我的其他 LambdaFuncs 解析 require('common-stuff') 基于 Node 向上移动未找到模块的目录结构。

为了让 SAM 进行构建/打包/部署,我注意到 SAM 并没有触及常见的东西,而是使用其他两个 Lambda 函数创建了一个 .aws-sam/build 结构。我必须为 SAM 的 CodeURI 创建一个结构来压缩。

使用我的 package.json 和 my-common.js 打包/common-stuff/packaged/nodejs/node_modules/common-stuff/。我的 package.json 使用名称:“common-stuff”,主要:“my-common.js”

没有其他文件 - nodejs 下没有任何文件,因为我只是打包模块。在我看来,这就是 Layers 的原因。我已经通过下载 Layer zip 文件验证了 SAM 打包了一个包含 nodejs/node_modules/common-stuff/... 的 zip 文件。

在 Lambda 函数模板 def 中,我添加了允许“lambda:GetLayerVersion”的权限。当我在控制台中查看 Lambda 函数时,我会看到此权限以及其他权限。

有趣的是,aws lambda get-layer-version-policy --layer-name MyLayer --version-number 8 --output text 返回没有附加策略的错误。我的猜测是因为我直接将它添加到函数中,正如我在 Lambda 函数中看到的那样,它具有正确的 Allow/GetLayerVersion。

这似乎满足了我所读到的内容,但是 Node 没有找到该模块。CloudWatch 日志只是说它找不到模块,与权限或语法无关。此外,这些功能一直有效,直到我添加了 Layer 方法。

'sam local start-api' 也不起作用,同样的错误。当我查看 Windows 10 默认层缓存目录 C:\Users\me\AppData\Roaming\AWS SAM\ 时,有一个空的 layers-pkg 目录。

我还缺少其他魔法吗?是否有更好的方法在 Node Lambda 函数之间共享通用代码?

我无法判断 AWS 是否无法获取层,或者 zip 结构错误,或者 require('common-stuff') 不同(希望不是)。

斯科特

4

0 回答 0