【问题标题】:Unable to write to SQS queue with lambda function无法使用 lambda 函数写入 SQS 队列
【发布时间】:2020-01-10 20:24:32
【问题描述】:

我正在设置无服务器框架,以便能够将一些消息推送到 AWS SQS,并且一切正常,直到 sqs.sendMessage 逻辑,我似乎无法弄清楚发生了什么。它到达它然后就死了,没有错误或任何东西。

我在无服务器中尝试了各种配置,并尝试将所有 SQS 功能的 SQS 队列完全权限授予任何人,但都没有奏效。

无服务器.yml

service: hook
provider:
  name: aws
  runtime: nodejs10.x
  stage: ${opt:stage, 'local'}
  region: ${opt:region, 'us-east-1'}
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "sqs:SendMessage"
        - "sqs:GetQueueUrl"
      Resource:
        Fn::GetAtt: 
          - HookQueue
          - Arn 
    - Effect: "Allow"
      Action:
        - "sqs:ListQueues"
      Resource:
        Fn::GetAtt: 
          - HookQueue
          - Arn
functions:
  hookListener:
    handler: handler.hook
    events:
      - http:
          path: hook
          method: post
    environment:
      SQS_URL: 
        Ref: HookQueue

resources:
  Resources:
    HookQueue:
      Type: "AWS::SQS::Queue"
      Properties:
        QueueName: "HookQueue-${opt:stage, 'local'}"

Handler.js

'use strict';

var AWS = require('aws-sdk');
var sqs = new AWS.SQS({
    region: 'us-east-1'
});

module.exports.hook = (event, context, callback) => {
  console.log(event);

  var eBody = JSON.parse(event.body);

  var queueUrl = process.env.SQS_URL;
  console.log('SQS url is: ' + queueUrl);


  var realmID = 1234
  console.log('attempting to store: ' + realmID + ' body: ' + event.body);
  var params = {
    MessageBody: JSON.stringify({  realmID: realmID,
                    entities: event.body}),
    QueueUrl: queueUrl
  };
  console.log('got here');

  //Send message to SQS queue
  sqs.sendMessage(params, function(err, data) {
    if (err) {
        console.log('error:', "failed to send message" + err);
        callback(null, {statusCode: 500, body: 'Internal Service Error'});
    } else {
        console.log('data:' + data.MessageId);
        console.log('Sent to ' + queueUrl);
        console.log(data.MessageId);
    }
    console.log('after the send logic');
  });

  callback(null, {statusCode: 200, body: 'Success'});

};


寻找任何建议,谢谢!

【问题讨论】:

  • Lambda 函数不能“死”而没有错误。它们要么在没有错误的情况下完成执行,要么抛出错误。这些调用之一的 cloudwatch 日志显示什么?
  • 我不知道如何解释我所看到的。在我的代码中,我在 sqs.sendmessage 之前有一个 console.log 语句,它会生成该日志记录语句。然后它触发了 sendmessage 函数,之后我看不到任何控制台写入。我希望看到错误或数据日志。基于我的 SQS 队列中没有任何内容,我希望看到某种错误消息,但我没有看到任何错误消息。它直接进入“END Request ID:”
  • 好的,您的 Lambda 函数已成功完成。你从你的问题中去掉了实际的处理函数声明,这是这个难题的一个重要部分。我猜它是一个异步函数,如果是这样,那就是问题所在——如果你愿意,那么 SQS 调用需要使用 Promise 和 await,而不是回调;否则从处理程序声明中删除async
  • 我使用的是回调,而不是异步。我编辑了原帖,函数声明为:module.exports.hook = (event, context, callback) => {
  • 感谢您的更新。还有一点让我感到困惑...handler: handler.hook != quickhook

标签: node.js aws-lambda amazon-sqs serverless-framework serverless


【解决方案1】:

您应该在 lambda 中返回响应以查看结果:

var queueUrl = process.env.SQS_URL;
var realmID = 1234
var params = {
        MessageBody: JSON.stringify({  realmID: realmID,
                        entities: event.body}),
        QueueUrl: queueUrl
      };

//Send message to SQS queue
sqs.sendMessage(params, function(err, data) {
  if (err) {
    console.log('error:', "failed to send message" + err);
    callback(null, {statusCode: 500, body: 'Internal Service Error'});
  } else {
    callback(null, {statusCode: 200, body: JSON.stringify(data)});
    console.log('data:' + data.MessageId);
    console.log('Sent to ' + queueUrl);
    console.log(data.MessageId);
  }
  console.log('after the send logic');
});

此外,您不需要 Lambda 即可将消息发布到 SQS 队列。 您可以设置 API Gateway 服务代理,将请求直接映射到队列。

This plugin 让它变得非常简单(我是合作者之一),还可以为您节省 Lambda 调用的成本。

【讨论】:

  • 我的方法不仅仅是简单地写入 SQS 队列,还会发生其他事情,我只是无法通过写入 SQS 片段。但是我确实认为我将来可以使用该插件。另外,我确实在 else 之后有一个 return 声明,我只是没有将它包含在我的帖子中。
  • 您介意包含您的处理程序的完整代码,包括返回语句吗?您还可以将对sqs.sendMessage 的整个调用包装在try catch 中并记录调用sqs.sendMessage 的错误
  • 已更新。另外,我尝试将它全部包装在 try catch 中,但它没有捕获任何东西,我认为这很奇怪。我将清除我的 s3 存储桶和所有内容,并确保我的无服务器框架部署正确。
  • 你在错误的地方调用回调,它应该在sendMessage 块内,如我最初的回答所示
【解决方案2】:

是因为我在节点异步并在它完成处理之前点击回调的大脑放屁。

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多