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

AWS: No Messages Available When Sending Message to SQS Queue from Lambda

以下内容对我不起作用的可能原因有哪些?

  1. 创建一个至少包含 id 字段的 DynamoDB table card_auth_events
  2. 创建调用 lambda 的触发器。这是 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
    }
  });
}
  1. 将 Lambda 配置为具有 AmazonSQSFullAccessAmazonDynamoDBFullAccessAmazonAppStreamFullAccess 的角色。

  2. 在 SQS 中创建队列

  3. 插入一条记录到table.

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

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

问题出在您的访问策略上。如果您使用的是 IAMFullAccess,则您所做的一切都是授予您访问和更改 IAM 策略、组、用户等的 lambda 权限。您需要授予您的 lambda 访问 SQS 的权限。如果您想全面测试 lambda,我建议使用托管策略:AWSLambdaFullAccessAmazonSQSFullAccess。这将打开 S3、Lambda、DynamoDb、SQS 和 Cloudwatch。

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

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