在 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 从那里获取它。
我正在尝试从 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 从那里获取它。