在将消息发送到SQS之前完成AWS Lambda

阿维拉姆·弗伯格

我正在AWS上运行“ Node.JS” lambda,它将消息发送到SQS。由于某些原因,SQS回调函数每两次调用仅执行一次看起来,运行lambda的线程完成了运行(因为它不是对SQS的同步调用,也无法返回Future),因此lambda不会“保持活动状态”以使回调得以执行。

如何解决此问题并使lambda等待SQS回调执行?

这是我的lambda代码:

exports.handler = async (event, context) => {

// Set the region
AWS.config.update({region: 'us-east-1'});

// Create an SQS service object
var sqs = new AWS.SQS({apiVersion: '2012-11-05'});
const SQS_QUEUE_URL = process.env.SQS_QUEUE_URL;

var params = {
    MessageGroupId: "cv",
    MessageDeduplicationId: key,
    MessageBody: "My Message",
    QueueUrl: SQS_QUEUE_URL
};

console.log(`Sending notification via SQS: ${SQS_QUEUE_URL}.`);
sqs.sendMessage(params, function(err, data) {   //<-- This function get called about one time every 4 lambda calls
    if (err) {
        console.log("Error", err);
        context.done('error', "ERROR Put SQS");  
    } else {
        console.log("Success", data.MessageId);
        context.done(null,'');  
    }
});

};
弗拉迪斯拉夫·乌申科

您应该坚持基于回调的方法,或者承诺基于方法的方法。我建议您使用后者:

exports.handler = async (event, context) => {

  // Set the region
  AWS.config.update({region: 'us-east-1'});

  // Create an SQS service object
  var sqs = new AWS.SQS({apiVersion: '2012-11-05'});
  const SQS_QUEUE_URL = process.env.SQS_QUEUE_URL;

  var params = {
      MessageGroupId: "cv",
      MessageDeduplicationId: key,
      MessageBody: "My Message",
      QueueUrl: SQS_QUEUE_URL
  };

  console.log(`Sending notification via SQS: ${SQS_QUEUE_URL}.`);
  try {
      await sqs.sendMessage(params).promise(); // since your handler returns a promise, lambda will only resolve after sqs responded with either failure or success
  } catch (err) {
    // do something here
  }
};

PS在lambda环境中实例化处理程序中的aws类不是一个好主意,因为它会增加冷启动时间。最好将new AWS.SQS(...)动作也移出处理程序AWS.config.update(),因为这些动作将在处理程序的每次调用时执行,但是您实际上只需要执行一次即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用AWS Lambda Python API将消息发送到AWS SQS队列超时

Lambda无法将消息发送到SQS

使用 SQS 队列的 lambda 函数如何将消息发送到死信队列?

将数据从AWS Lambda发送到SQS队列时重置连接

将消息发送到具有2个SQS订阅的SNS主题,每个订阅都有一个lambda触发器,将导致空队列

如何通过 aws 网关将数据发送到 aws lambda?

将消息从AWS Lambda推送到Kafka

使用python中的AWS Lambda将发布请求发送到外部API

将带有正文的请求发送到AWS Lambda

如何将事件从 EventBridge 发送到 Lambda

lambda 客户端调用函数并从 MQ 读取 json 消息并发送到 AWS Kinesis

使用触发的 Lambda 函数将 MQTT 消息发送到另一个 IoT 主题?

有没有一种方法可以将消息bak发送到调用Fargate任务的lambda

使用Javascript从浏览器调用AWS Lambda,如何将输入值发送到函数?

AWS-SSM 自动化文档:是否可以将 StringList 输出作为负载发送到 Lambda?

aws sqs lambda:消息不再出现

用于捕获 AWS MQ 的 AWS 云监视日志并发送到 kinesis 的 Python Lambda 函数

有什么方法可以在特定条件下从AWS lambda函数内部将事件消息显式发送到死信队列?

无法将消息从API网关发送到FIFO SQS

AWS Lambda“在完成请求之前退出流程”

AWS Lambda似乎在完成之前退出

是否有任何关于发送到 Lambda 的 AWS Gateway 事件的官方文档?

将消息放回AWS SQS上,以处理由Lambda处理但内部失败的消息

如何编写Lambda处理程序以将数据发送到Elasticsearch

无法使用Designer Vew将数据从Lambda发送到SNS

实体框架lambda扩展方法在什么时候将查询发送到数据库?

如何通过Boto3将图像字节发送到Lambda?

如何将简单的GET发送到URL并在Lambda中查看响应?

如何使用ClusterIP服务将Lambda的GET / POST请求发送到Pod