簡體   English   中英

AWS-從Lambda / Node.js發送1000封電子郵件

[英]AWS - Sending 1000's of emails from Lambda / Node.js

我有一個由SNS觸發的“主要” Lambda函數。 它從數據庫中提取一個收件人列表,它需要根據模板向每個收件人發送一條消息,以替換名字等之類的信息。

設置的方式是我創建了另一個名為“電子郵件發送”的Lambda函數,該函數已訂閱“電子郵件發送”主題。 然后,“主” Lambda遍歷收件人列表,並將消息發布到具有適當有效負載(從,到主題,消息)的“電子郵件發送”。 最終可能需要單批處理1000封電子郵件。

這是滿足我要求的好方法嗎? 也許Lambda / SNS不是要走的路? 如果是這樣,您會推薦什么。

使用此設置,當我的“主要”功能完成運行並且以某種方式在循環中未觸發“ 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");
};

感謝您的協助。

我認為更好的方法是使用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。

重要提示:另一個建議是創建一個調用數組( functions ),然后按如下所示執行它們:

async.parallel(invocations, function(err) {
    if (err) {
        console.error(err, err.stack);
        callback(err);
    }
});

看看這個鏈接,我在其中獲得了很多有關Lambda調用的知識: https : //cloudonaut.io/integrate-sqs-and-lambda-serverless-architecture-for-asynchronous-workloads/

您的代碼正在執行此操作...

  1. 開始調用sns.publish() 1000次
  2. 返回(通過context.succeed()

您沒有等待那1000個電話結束!

您的代碼應該做的是...

  1. 開始調用sns.publish() 1000次
  2. 返回對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));
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM