node.js - AWS Lambda nodeJS 超时,不知道为什么。日志没用
问题描述
这是我不起眼的 NodeJS 函数,它在 5 分钟后超时。CloudWatch Logs 没有给我任何关于发生了什么的细节,只是它超时了。
const AWS = require('aws-sdk');
const util = require('util');
const simpleParser = require('mailparser').simpleParser;
const s3 = new AWS.S3();
exports.handler = async (event, context, callback) => {
const srcBucket = event.Records[0].s3.bucket.name;
const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
const params = {
Bucket: srcBucket,
Key: srcKey
};
console.log(params)
var data = await s3.getObject(params).promise();
console.log(data)
};
执行环境节点 12,5 分钟超时。我已经验证了正确的 s3 触发器输入,并且代码可以在我的本地 nodeJS 环境中运行。
在执行角色中,除了厨房水槽之外,我几乎添加了所有内容 - AmazonRDSFullAccess AmazonS3FullAccess CloudWatchLogsFullAccess AmazonRDSDataFullAccess AmazonVPCFullAccess AWSLambdaExecute AWSLambdaVPCAccessExecutionRole AWS 托管策略
非常感谢任何帮助,此时我失去了理智。
解决方案
因为您的 lambda 语法具有误导性。问题是,您同时使用callback
和async
。要正确使用异步,请从参数中删除回调。
exports.handler = async (event) => {
try {
const srcBucket = event.Records[0].s3.bucket.name;
const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
const params = {
Bucket: srcBucket,
Key: srcKey
};
console.log(params)
var data = await s3.getObject(params).promise();
console.log(data)
} catch (err) {
console.log(err)
}
};
AWS lambda 仍然支持回调样式处理程序。因此,您的语法不正确。但是,如果您定义了回调,则应在函数执行结束时调用回调。
由于未在函数配置的超时期限内(在本例中为 5 分钟)调用回调,因此您将获得超时。
这是回调版本。
exports.handler = async (event, context, callback) => {
try {
const srcBucket = event.Records[0].s3.bucket.name;
const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
const params = {
Bucket: srcBucket,
Key: srcKey
};
console.log(params)
var data = await s3.getObject(params).promise();
callback(null, 'completed successfully')
} catch (err) {
console.log(err)
callback(err)
}
};
希望这可以帮助。
推荐阅读
- javascript - 子组件加载时在父组件中加载 React 侧边栏
- express - 如何让 next() 在返回 Bluebird Promise 的 Express 回调中发生?
- excel - 用另一个工作表做这个宏说要做的事情
- r - 标记行,基于其他行的值
- c# - 应用程序未从 user.config 读取
- jupyter-notebook - 有没有办法自动并定期地“从磁盘重新加载笔记本”而不会在 Jupiter-lab 上弹出任何内容?
- scala - 当我将数据框写入 CSV 文件时,一些字符会像 \"\" 一样存储
- php - 尝试替换 mySQL 数据库中的数据
- reactjs - 开玩笑 - 无法使用动态导入模板字符串定位模块
- javascript - 在 async.waterfall 中使用异步函数