通过 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-devstandard 队列配置正确,因为我已经成功从另一个 lambda(非 SQS)向它发送了消息。 SQS URL 正确。 控制台中未显示任何错误。 async/await 已正确放置(我尝试过使用和不使用它们)

这是尝试分派内容的SeedIndicatorInformationSQS-dev-d13dfe0lambda 的 CloudWatch 日志:成功发送到正确的 URL,JSON 解析为字符串,但什么也没有。

这是 CloudWatch 日志:您可以看到。 SeedIndicatorInformationSQS-dev-d13dfe0 成功接收到来自另一个 lambda 函数的消息并对其进行处理,但没有发送更多消息。

SeedIndicatorInformationSQS-dev-d13dfe0 内没有报告错误

EvaluationConfigSQS-dev 内没有日志

但是,如果我尝试在非 SQS lambda 中发送它,它会起作用。

收到的事件:

这是成功发送到EvaluationConfigSQS-devclasses-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 sendMessage 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?

在 SQS 消息触发的 Lambda 上跟踪 AWS API Gateway request_id

使用 AWS 无服务器和 NodeJS 在接收器 lambda 处未接收到来自 SQS 的所有消息

确保对数据库和 SQS 的调用都成功

从 AWS Lambda 读取 SQS 队列