在 AWS lambda 中使用 airtable.js 模块时出现问题

Problems using airtable.js module in AWS lambda

我正在尝试从 AWS lambda 函数访问 Airtable。

首先,为了测试,我在本地项目中安装了 airtable.js (npm install -s airtable),编写了一个简短的测试脚本,并使用 node test.js 执行。一切正常。

使用完全相同的核心测试代码,在适当的 node.js 函数包装器中,我在 AWS lambda 函数中尝试了 运行 相同的测试,但我的 CloudWatch 出现错误日志:

Error: Cannot find module '/var/task/node_modules/abort-controller/dist/abort-controller'. Please verify that the package.json has a valid \"main\" entry

我试过将 npm 包与部署包中的函数代码压缩在一起,还尝试从 airtable 包创建一个 lambda 层。两者都会产生相同的错误。请注意,包裹已被拾取 - 如果我尝试层方法,但删除层本身则无法找到 airtable。所以这似乎与 airtable 包如何尝试访问中止控制器有关。

为了它的价值,这里是我在我的 lambda 函数中使用的 [redacted] 测试代码:(returns 等是因为它在 API 网关调用后面运行 - 但是这不是问题的一部分,因为无论是在 lambda 控制台内测试还是通过 API)

调用,都会发生相同的错误
var AWS = require("aws-sdk");
AWS.config.update({ region: "eu-west-1", });

const Airtable = require('airtable');
const base = new Airtable({ apiKey: "xxxxx" }).base('yyyyy');

exports.handler = async(event) => {
    try {
        console.info('trying create');
        let records = await base('Base1').create([{
            "fields": {
                "Status": "Scored",
                "C1": "testing",
                "C2": "airtable",
                "C3": "api",
                "C4": "from",
                "C5": "node",
            }
        }, ]);
        console.info('completed create');
        let records_list = records.map(r => r.getId()).join(',');
        console.info(records_list);
        return ({statusCode: 200, body: JSON.stringify(records_list)});
    } catch (e) {
        console.error(e);
        return ({statusCode: 401, body: JSON.stringify(e)});
    }

}

我以前构建过许多 lambda,包括层和嵌入式包,所以我犯了大部分常见错误 - 我认为我不会在这里重复这些错误。 airtable.js 有什么特别的地方吗?

原来问题出在部署包的 zip 中 - 无论是在层中还是烘焙到 lambda 中,zip 文件似乎都丢失了一些东西。我这样做是作为我的 terraform 配置/部署的一部分,令人困惑的是它似乎与我在不同项目中成功用于 20 多个功能和 5 层的结构和设置完全相同,但这里它失败了.

所以 - 至少目前,解决方案似乎是手动压缩图层包,上传到 s3,然后让 terraform 从那里获取它。