【发布时间】:2020-06-12 15:38:09
【问题描述】:
我有一个连接到 SeedIndicatorInformationSQS-dev-d13dfe0 lambda 的 SeedIndicatorInformationSQS-dev.fifo 队列 (FiFo)。我想在SeedIndicatorInformationSQS-dev-d13dfe0 lambda 中向EvaluationConfigSQS-dev 标准队列发送一条消息。但是没有消息被发送/接收。而如果我尝试从非 SQS 连接的 lambda(通过 AppSync)发送它,它可以工作。
SeedIndicatorInformationSQS-dev-d13dfe0 lambda 具有以下权限:
我已经检查过:
- lambda 有权发送 SQS 消息(您可以在此处看到)。
-
EvaluationConfigSQS-devstandard 队列配置正确,因为我已经成功从另一个 lambda(非 SQS)向它发送了消息。 - SQS URL 正确。
- 控制台中未显示任何错误。
- async/await 已正确放置(我尝试过使用和不使用它们)
这是尝试分派内容的SeedIndicatorInformationSQS-dev-d13dfe0lambda 的 CloudWatch 日志:成功发送到正确的 URL,JSON 解析为字符串,但什么也没有。
这是 CloudWatch 日志:您可以看到。 SeedIndicatorInformationSQS-dev-d13dfe0 成功接收到来自另一个 lambda 函数的消息并对其进行处理,但没有发送更多消息。
SeedIndicatorInformationSQS-dev-d13dfe0 内没有报告错误
但是,如果我尝试在非 SQS lambda 中发送它,它会起作用。
这是成功发送到EvaluationConfigSQS-dev 的classes-dev-eefa2af lambda(巧合的是,它触发了SeedIndicatorInfromationSQS-dev.fifo SQS。
这是EvaluationConfigSQS-dev-6da8b90 的权限(EvaluationConfigSQS-dev 标准队列触发的 lambda)
我是否需要向SeedIndicatorInformatioNSQS-dev.fifo 队列添加特殊权限?
这是被调度的 JS(我正在使用中介模式,它已成功调度,您可以在“调度 CREATED_INSTITUTION_CLASS”上方的日志中看到它。我还设法打印了 URL 并验证它实际上是对应的那个。
export async function institutionClassCreatedEventHandler(
evt: InstitutionClassCreatedEvent
) {
const json = JSON.stringify({
...evt,
type: "CLASS_CREATED",
});
sqsDispatchMessage(
"InstitutionClassCreatedEvent",
evt.tenantId + evt.subject.id,
json,
Config.SQS.evaluationConfigSQS.url,
false
);
}
这里是 sqsDispatchMessage 函数。如您所见,有一个 catch 块会在出现错误时打印我(并且它有效)。但到目前为止,还没有记录到错误。
export async function sqsDispatchMessage(
eventName: string,
uniqueId: string,
jsonObjStringifiedToSend: string,
sqsURL: string,
isFifoQueue: boolean = true
) {
try {
await sqs
.sendMessage({
MessageAttributes: {
EventName: {
DataType: "String",
StringValue: eventName,
},
},
...(isFifoQueue && { MessageGroupId: eventName }),
MessageBody: jsonObjStringifiedToSend,
QueueUrl: sqsURL,
...(isFifoQueue && { MessageDeduplicationId: uniqueId }),
})
.promise();
} catch (e) {
console.error(`Error While Sending the ${eventName}`);
console.error(e.message);
console.log(jsonObjStringifiedToSend);
}
}
有什么想法吗?甚至可能吗?
【问题讨论】:
-
顺便说一句,不涉及 VPC
-
查看发布的代码 sn-ps,我认为这可能是异步调用未正确等待的情况。为 AWS 开发工具包启用详细日志记录,以检查是否实际进行了 SQS
sendMessageAPI 调用并收到响应。 -
@Paradigm 就是这样!我的问题在于我实施的中介者模式。对于基于事件的调度,我从不等待实现!都修好了!!!非常感谢!!
标签: amazon-web-services aws-lambda amazon-sqs