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

时间:2016-01-14 18:31:23

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

以下哪些不适合我的可能原因是什么?

  1. 创建一个至少包含card_auth_events字段的DynamoDB表id
  2. 创建一个调用lambda的触发器。这是lambda:
  3.  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. 将记录插入表格。

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

      队列中没有消息,Cloud Watch中没有错误。我错过了一些秘密吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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