Amazon web services AWS-发送1000';来自Lambda/Node.js的电子邮件数量
我有一个由SNS触发的“主”Lambda函数。它从数据库中提取一个收件人列表,需要根据模板向每个收件人发送一条消息,替换诸如名字之类的内容 我设置它的方式是我创建了另一个名为“email send”的Lambda函数,它订阅了“email send”主题。然后,“main”Lambda循环遍历收件人列表,并将消息发布到具有适当负载的“email send”(发件人、收件人、主题、消息)。这最终可能需要在一批中处理1000封电子邮件 这是满足我需求的好方法吗?也许Lambda/SNS不是一条出路?如果是,你会推荐什么 在这个设置中,当我的“main”函数完成运行时,我遇到了一些问题,不知何故,“sns.publish”在我的循环中没有被触发。我想是因为我不会让它结束。但我不知道如何修复它,因为它是一个循环 以下是我的Lambda函数的片段:Amazon web services AWS-发送1000';来自Lambda/Node.js的电子邮件数量,amazon-web-services,lambda,amazon-sns,amazon-ses,Amazon Web Services,Lambda,Amazon Sns,Amazon Ses,我有一个由SNS触发的“主”Lambda函数。它从数据库中提取一个收件人列表,需要根据模板向每个收件人发送一条消息,替换诸如名字之类的内容 我设置它的方式是我创建了另一个名为“email send”的Lambda函数,它订阅了“email send”主题。然后,“main”Lambda循环遍历收件人列表,并将消息发布到具有适当负载的“email send”(发件人、收件人、主题、消息)。这最终可能需要在一批中处理1000封电子邮件 这是满足我需求的好方法吗?也许Lambda/SNS不是一条出路?
exports.handler = (event, context, callback) => {
// code is here to pull data into "data" array
// process records
for (var i = 0; i < data.length; i++) {
var sns = new aws.SNS();
sns.publish({
Message: JSON.stringify({ from: data[i].from, to: data[i].to, subject: subject, body: body }),
TopicArn: 'arn:aws:sns:us-west-2:XXXXXXXX:email-send'
}, function(err, data) {
if (err) {
console.log(err.stack);
} else {
console.log('SNS pushed!');
}
});
}
context.succeed("success");
};
exports.handler=(事件、上下文、回调)=>{
//这里的代码用于将数据拉入“数据”数组
//过程记录
对于(变量i=0;i
感谢您的帮助。我认为更好的方法是使用AWS Lambda API 这样,你就不需要SNS了 例如:
var lambda = new AWS.Lambda({region: AWS_REGION});
function invokeWorkerLambda(task, callback) {
var params = {
FunctionName: WORKER_LAMBDA_NAME,
InvocationType: 'Event',
Payload: JSON.stringify({.....})
};
lambda.invoke(params, function(err, data) {
if (err) {
console.error(err, err.stack);
callback(err);
} else {
callback(null, data);
}
});
}
如您所见,lambda函数的调用不需要SNS
重要提示:另一个建议是创建一个调用数组(函数
),然后按如下方式执行它们:
async.parallel(invocations, function(err) {
if (err) {
console.error(err, err.stack);
callback(err);
}
});
看看这个链接,我在这里学到了很多关于Lambda调用的知识:我认为更好的方法是使用AWS Lambda API 这样,你就不需要SNS了 例如:
var lambda = new AWS.Lambda({region: AWS_REGION});
function invokeWorkerLambda(task, callback) {
var params = {
FunctionName: WORKER_LAMBDA_NAME,
InvocationType: 'Event',
Payload: JSON.stringify({.....})
};
lambda.invoke(params, function(err, data) {
if (err) {
console.error(err, err.stack);
callback(err);
} else {
callback(null, data);
}
});
}
如您所见,lambda函数的调用不需要SNS
重要提示:另一个建议是创建一个调用数组(函数
),然后按如下方式执行它们:
async.parallel(invocations, function(err) {
if (err) {
console.error(err, err.stack);
callback(err);
}
});
看看这个链接,我在这里学到了很多关于Lambda调用的知识:您的代码正在这样做
sns.publish()
1000次context.success()
)sns.publish()
1000次sns.publish()
的调用都返回时,则return
。(context.succeed
很旧,所以我们应该改用callback()
)// Instantiate the client only once instead of data.length times
const sns = new aws.SNS();
exports.handler = (event, context, callback) => {
const snsCalls = []
for (var i = 0; i < data.length; i++) {
snsCalls.push(sns.publish({
Message: JSON.stringify({
from: data[i].from,
to: data[i].to,
subject: subject,
body: body
}),
TopicArn: 'arn:aws:sns:us-west-2:XXXXXXXX:email-send'
}).promise();
}
return Promise.all(snsCalls)
.then(() => callback(null, 'Success'))
.catch(err => callback(err));
};
//仅实例化客户端一次,而不是data.length次
const sns=新的aws.sns();
exports.handler=(事件、上下文、回调)=>{
常量snscals=[]
对于(变量i=0;i回调(null,'Success'))
.catch(err=>callback(err));
};
您的代码正在执行此操作
sns.publish()
1000次context.success()
)sns.publish()
1000次sns.publish()
的调用都返回时,则return
(context.succeed
是旧的,因此我们应该改用callback()
)// Instantiate the client only once instead of data.length times
const sns = new aws.SNS();
exports.handler = (event, context, callback) => {
const snsCalls = []
for (var i = 0; i < data.length; i++) {
snsCalls.push(sns.publish({
Message: JSON.stringify({
from: data[i].from,
to: data[i].to,
subject: subject,
body: body
}),
TopicArn: 'arn:aws:sns:us-west-2:XXXXXXXX:email-send'
}).promise();
}
return Promise.all(snsCalls)
.then(() => callback(null, 'Success'))
.catch(err => callback(err));
};
//仅实例化客户端一次,而不是data.length次
const sns=新的aws.sns();
exports.handler=(事件、上下文、回调)=>{
常量snscals=[]
对于(变量i=0;i回调(null,'Success'))
.catch(err=>callback(err));
};
您不需要SNS来调用另一个Lambda函数。只需使用AWS API来调用它。调用“email send”Lambda函数是我最初的方法。但我在循环后遇到了同样的问题。想法?您不需要SNS来调用另一个Lambda函数。只需使用AWS API来调用它。调用“email send”lambda函数是我最初的方法。但我在循环完成后遇到了同样的问题。想法?使用SNS而不是直接调用lambda的优点是SNS可以在失败时重试。使用SNS而不是直接调用lambda的优点是SNS可以在失败时重试。谢谢dashmug,但我得到了“.promise不是函数”,我缺少一些依赖性?谢谢dashmug,但我得到了。promise不是函数,我缺少一些依赖性?