首页 > 解决方案 > AWS Step Functions SendSQSMessage:动态 MessageGroupId

问题描述

我正在使用 AWS CDK 创建一个状态机,该状态机将消息发送到 fifo 队列并等待来自 lambda worker 的回调以继续执行。

我希望发送到 fifo 队列的消息有一个动态 MessageGroupId 分配给它们,这样我就可以控制处理消息的 lambda 工作人员的数量。我能想到的拥有动态 MessageGroupId 的唯一方法是使用 JsonPath 在步进函数输入上引用一些参数,但是我没有遇到任何关于它的文档。我使用 JsonPath 动态传递 MessageGroupId 的初始测试失败了,只是传递了字符串“$.MessageGroupId”,有效地为每条消息提供了相同的消息组 id,从而为一个 lambda 工作人员。

  1. 从步进函数发送时,是否可以将消息组 ID 动态分配给 sqs 消息?
  2. 如果是这样,怎么做?

标签: amazon-web-servicesamazon-cloudformationaws-cdkaws-step-functions

解决方案


在 AWS Support 的帮助下,我设法通过使用上下文对象或从初始输入传递一个 ID 并使用$.

这是一个例子:

{
  "Comment": "Generate unique MessageGroupId",
  "StartAt": "Start",
  "States": {
    "Start": {
      "Type": "Task",
      "TimeoutSeconds": 60,
      "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
      "Parameters": {
        "QueueUrl": "<YOUR_QUEUE_URL>",
        "MessageBody": {
          "Input.$": "$",
          "TaskToken.$": "$$.Task.Token"
        },
        "MessageGroupId.$": "$$.Execution.Id"
      },
      "ResultPath": "$",
      "End": true
    }
  }
}

我的问题是我试图MessageGroupId这样:

"MessageGroupId": "$$.Execution.Id"

我应该在哪里做:

"MessageGroupId.$": "$$.Execution.Id"

附加.$将解析表达式"$$.Execution.Id",而不是按字面意思输入 string "$$.Execution.Id"


推荐阅读