我正在使用一个简单的AWS Lambda函数,该函数应该将一些消息发布到SNS主题。
我的电子邮件地址已订阅该主题,并且已确认订阅。
该主题与我的lambda函数位于同一区域。
该功能与关联了两个策略的IAM角色相关联:
政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "arn:aws:sns:eu-west-1:XXXXXXXXXXXX:YYYYYYYYYYYYYYYYYYY"
}
]
}
这是我在Cloud9上开发的功能代码。
const AWS = require("aws-sdk");
const sns = new AWS.SNS({region:'eu-west-1'});
exports.handler = async (event, context, callback) => {
const apiResponse = new Promise((resolve, reject) => {
setTimeout(() => resolve(['one', 'two', 'three']), 500)
});
const messages = await apiResponse;
const promises = [];
messages.forEach(txt => {
promises.push(sns.publish({
Message: txt,
Subject: txt,
TopicArn: 'arn:aws:sns:eu-west-1:xxxxxxxxxxxx:MyWebsiteContactForm'
}).promise());
});
console.log(promises);
Promise.all(promises,
function (values) {
console.log(values);
callback(null, values);
},
function(err) {
console.error(Error(err));
callback(Error(err));
}
);
};
执行此代码的结果只是预期的输出,但从未在Promise.all()
内记录任何内容。
[ Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ]
这就像Lambda在解决承诺之前终止一样,但是我不知道为什么。我按照建议的here使用了Promise.all()
预先感谢
答案 0 :(得分:1)
由于您在处理程序上使用了async
关键字,因此lambda将等待它并退出。您的async
函数不包含任何await
,因此它将立即运行。
要解决此问题,您可以:
async
关键字,这样Lambda将等待calllback
调用,或者; Promise.all()
使用await,如下所示:const AWS = require("aws-sdk");
const sns = new AWS.SNS({region:'eu-west-1'});
exports.handler = async (event, context) => {
const promises = [];
['one', 'two', 'three'].forEach(txt => {
promises.push(sns.publish({
Message: txt,
Subject: txt,
TopicArn: 'arn:aws:sns:eu-west-1:XXXXXXXXXXXX:YYYYYYYYYYYYYYYYYYY'
}).promise());
});
console.log(promises);
try {
let values = await Promise.all(promises);
// do any transformations here
return values;
} catch (err) {
console.error(err);
// deal with errors here or re-throw the error if you need that
// the lambda function results in error too.
throw(err);
// Or
return "something went wrong";
}
};
有关更多详细信息,请参见https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html