Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS-发送1000';来自Lambda/Node.js的电子邮件数量_Amazon Web Services_Lambda_Amazon Sns_Amazon Ses - Fatal编程技术网

Amazon web services AWS-发送1000';来自Lambda/Node.js的电子邮件数量

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不是一条出路?

我有一个由SNS触发的“主”Lambda函数。它从数据库中提取一个收件人列表,需要根据模板向每个收件人发送一条消息,替换诸如名字之类的内容

我设置它的方式是我创建了另一个名为“email send”的Lambda函数,它订阅了“email send”主题。然后,“main”Lambda循环遍历收件人列表,并将消息发布到具有适当负载的“email send”(发件人、收件人、主题、消息)。这最终可能需要在一批中处理1000封电子邮件

这是满足我需求的好方法吗?也许Lambda/SNS不是一条出路?如果是,你会推荐什么

在这个设置中,当我的“main”函数完成运行时,我遇到了一些问题,不知何故,“sns.publish”在我的循环中没有被触发。我想是因为我不会让它结束。但我不知道如何修复它,因为它是一个循环

以下是我的Lambda函数的片段:

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()
  • 你没等那1000个电话打完

    你的代码应该做的是

  • 开始调用
    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()
  • 你没等那1000个电话打完

    你的代码应该做的是

  • 开始调用
    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不是函数,我缺少一些依赖性?