【问题标题】:AWS: No Messages Available When Sending Message to SQS Queue from LambdaAWS:从 Lambda 向 SQS 队列发送消息时没有可用消息
【发布时间】:2017-06-30 00:44:41
【问题描述】:

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

  1. 创建一个至少包含一个 id 字段的 DynamoDB 表 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. 在表中插入一条记录。

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

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

【问题讨论】:

    标签: node.js amazon-web-services amazon-sqs aws-lambda


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我还有 AWSLambdaFullAccess 以及其他 SQS 角色,但它仍然无法正常工作。我会更新问题。
      • 您是否能够在队列中插入任何内容?例如,从 CLI 运行插入或在本地运行脚本?运行的 lambda 有什么输出吗?
      • 我可以直接从 SQS 控制台向队列添加消息
      • 首先从代码开始工作。不要试图直接将 Lambda 与未经测试的代码一起使用。你只是让自己头疼。
      • 好的,谢谢。我会看看我是否可以使用 Apache Camel 将消息添加到队列中
      猜你喜欢
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 2020-02-18
      • 2019-10-09
      相关资源
      最近更新 更多