【问题标题】:Amplify: how to require/import custom function from lambda layer?放大:如何从 lambda 层要求/导入自定义函数?
【发布时间】:2020-07-10 11:22:40
【问题描述】:

我有一个 Amplify 项目,我想在其中使用 lambda 层。层和 lambda 已使用 Amplify CLI 进行配置。

Lambda 层命名为“common”。该文件是./amplify/backend/function/common/opt/param.js。它导出一个函数:

const getValue = async (name) => {
...
}
module.exports = getValue;

在我的 lambda 函数中,我想使用上面的辅助函数。但是,我不知道如何导入它。我试过了:

const getValue = require('param');
const getValue = require('./param');
const getValue = require('/opt/param');
const getValue = require('./opt/param');

但他们都失败了,错误如下:

"errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module '/opt/param'

还请注意,我在推送层后更新了 lambda,并将其连接到最新的层版本。所以代码应该可用于 lambda。

【问题讨论】:

    标签: javascript amazon-web-services aws-lambda aws-lambda-layers


    【解决方案1】:

    你可以把这个放在你的package.json:

    {
        ...
        "dependencies": {
            ...
            "layer": "file:../../opt/"
        }
    }
    

    然后你安装包。

    const { ... } = require('layer/...');
    

    【讨论】:

    • 这是包含图层的最可靠且不那么“神奇”的方式。完成此操作后,您将需要运行 amplify function build -y 来填充使用该层的所有函数中的资产。这也解决了@user20358 提出的关于在一个函数中使用多个层的评论。为此,您需要做的就是为您的其他层添加另一个条目,例如"layer2": "file:../../Layer2Folder/"
    • 我确实发现了一个有趣的“问题”,这至少对我来说不是,跟上你的图层的新变化。运行amplify function build -y 一次,然后在其自己的文件夹中更新图层后,您需要手动删除生成的资产,然后运行重建。这可以通过 npm 脚本自动执行,但很烦人。
    【解决方案2】:

    我只是在寻找更好的解释/解决方案(或者如果它可能是一个错误?)但是如果你将模块放在 amplify 生成的默认 opt/ 目录中,它会显示在这里: const getValue = require('/opt/opt/param');

    【讨论】:

    • 太棒了!我的 lambda 层代码确实在 opt/ 目录中,我可以确认此答案的路径有效。使用 /opt/opt/ 感觉很奇怪,所以在 Amplify 中支持新的 lambda 层也可能是错误。
    • 将此作为错误报告 (github.com/aws-amplify/amplify-js/issues/6297) 提交以查看是否有意。至少应该改进文档以阐明用途。
    • 该错误已在 amplify-cli 4.25.0 上得到修复。因此,从那个版本开始,正确的方式再次合乎逻辑:require('/opt/param');
    • 是否有与 python 等效的方法来做到这一点?使用语句from opt.<module-name> import myClass 会给出未找到模块的错误
    【解决方案3】:

    (也添加一个答案,以便此重要信息不会隐藏在评论部分)。

    这是 Amplify CLI 中的一个错误。它已在 4.25.0 版本中修复。

    导入层代码(位于opt/ 目录)的正确方法现在又合乎逻辑了:

    require('/opt/<module-name>')

    【讨论】:

    • 这个有python版本吗?
    • 如果有多个层,每个层都有一个opt文件夹,你如何区分它们?如果您想在两个 opt 文件夹中包含同名文件怎么办?
    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多