通过 SQS lambda 发送 SQS 消息
Posted
技术标签:
【中文标题】通过 SQS lambda 发送 SQS 消息【英文标题】:Sending an SQS message via an SQS lambda 【发布时间】: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-dev
standard 队列配置正确,因为我已经成功从另一个 lambda(非 SQS)向它发送了消息。
SQS URL 正确。
控制台中未显示任何错误。
async/await 已正确放置(我尝试过使用和不使用它们)
这是尝试分派内容的SeedIndicatorInformationSQS-dev-d13dfe0
lambda 的 CloudWatch 日志:成功发送到正确的 URL,JSON 解析为字符串,但什么也没有。
这是 CloudWatch 日志:您可以看到。 SeedIndicatorInformationSQS-dev-d13dfe0
成功接收到来自另一个 lambda 函数的消息并对其进行处理,但没有发送更多消息。
SeedIndicatorInformationSQS-dev-d13dfe0
内没有报告错误
EvaluationConfigSQS-dev
内没有日志
但是,如果我尝试在非 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 开发工具包启用详细日志记录,以检查是否实际进行了 SQSsendMessage
API 调用并收到响应。
@Paradigm 就是这样!我的问题在于我实施的中介者模式。对于基于事件的调度,我从不等待实现!都修好了!!!非常感谢!!
【参考方案1】:
问题出在我的调度员上:
以前是这样的:
export async function dispatchOfEvents(
type,
evtArgs,
: MediatorEvents): Promise<void>
logTime(type);
(events as any)[type].forEach((evt: Function) =>
evt(evtArgs);
);
我改成:
export async function dispatchOfEvents(
type,
evtArgs,
: MediatorEvents): Promise<void>
logTime(type);
const evts: Promise<any>[] = [];
for (const evt of (events as any)[type])
evts.push(evt(evtArgs));
await Promise.all(evts);
【讨论】:
以上是关于通过 SQS lambda 发送 SQS 消息的主要内容,如果未能解决你的问题,请参考以下文章
带有graphql和sqs的lambda在nodejs中向sqs发送2条消息?
在 SQS 消息触发的 Lambda 上跟踪 AWS API Gateway request_id