AWS:从 Lambda 向 SQS 队列发送消息时没有可用消息

cos*_*r11 4 amazon-sqs amazon-web-services node.js aws-lambda

以下内容对我不起作用的一些可能原因是什么?

  1. 创建一个card_auth_events至少包含一个id字段的 DynamoDB 表。
  2. 创建一个调用 lambda 的触发器。这是拉姆达:
 console.log('Loading publishCardAuthEvent...');

 var QUEUE_URL = 'https://sqs.us-west2.amazonaws.com/XXXXXXXXXXXX/CardAuthEvents';
 var AWS = require('aws-sdk');
 var sqs = new AWS.SQS({region : 'us-west-2'});
 var http = require('https');

 exports.handler = function(event, context) {
 event.Records.forEach(function(record) {
      console.log(record.eventID);
      console.log(record.eventName);
      console.log('DynamoDB Record: %j', record.dynamodb);
      sendToQueue(record);
 });
 context.succeed("Successfully processed " + event.Records.length + " records.");
};

function sendToQueue(message){
//Send SQS message with details of file uploaded to S3.
var params = {
  MessageBody: JSON.stringify(event),
  QueueUrl: QUEUE_URL
};

sqs.sendMessage(params, function(err,data){
  if (err) {
    console.log('error:',"Fail Send Message" + err);
    context.done('error', "ERROR Put SQS");  // ERROR with message

    } else {
      console.log('data:',data.MessageId);
      context.done(null,'');  // SUCCESS
    }
  });
}
Run Code Online (Sandbox Code Playgroud)
  1. 配置LAMBDA有一个角色AmazonSQSFullAccessAmazonDynamoDBFullAccessAmazonAppStreamFullAccess

  2. 在 SQS 中创建队列

  3. 在表中插入一条记录。

触发器被调用,但为什么消息没有放入队列???

队列中没有消息,Cloud Watch 中也没有错误。有什么我遗漏的秘密吗?

Mar*_*k B 5

我认为问题在于您正在调用您的sendToQueue()函数,然后在context.succeed()不等待生成的 SQS API 调用完成的情况下调用。这是在完成之前终止您的 Lambda 函数。

一旦你解决了这个问题,另一个问题是你context.done()在 SQS 回调内部调用,但你可能会调用sendToQueue()多次。一旦第一个 SQS API 调用返回,您的 Lambda 函数就会终止。