【发布时间】: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