如何使用当前步函数的 url 更新 AWS 步函数输入

How to update AWS step function input with url of current step function

我想捕获当前步函数的 url 并更新此 json 输入:

    {
      "log_telemetry": {
        "eventType": "telemetry",
        "operation": "start",
        "data": {
          "correlation_id": "69974248-7673-42fb-8d1d-e4e2bd3e0946",
          "start_time": "01/05/2022, 16:00:31",
          "environment": "stg",
          "step_function_url": "i want to update this string with the url"
        }
      }

我将通过连接 https://console.aws.amazon.com/states/home?region=us-east-1#/executions/details/$$.Execution.Id

来派生 url 字符串

我可以使用 Pass 步骤获取执行 ID,例如

{
  "States": {
    "Set Up Config": {
      "Type": "Pass",
      "ResultPath": "$.log_telemetry.data.step_function_url",
      "InputPath": "$$.Execution.Id",
      "Next": "Log Telemetry Start"
    },
...
}

但我不清楚如何使用字符串作为前缀。 States.Format 如果我在 Parameters 字段中使用它,则将它们连接起来,但在 Pass 步骤中将其设置为结果,它只是将其视为文字,例如

{
  "States": {
    "Set Up Config": {
      "Type": "Pass",
      "ResultPath": "$.log_telemetry.data.step_function_url",
      "Result": "States.Format('https://console.aws.amazon.com/states/home?region=us-east-1#/executions/details/{}', $$.Execution.Id)",
      "Next": "Log Telemetry Start"
    },
...
}

json 输入中的“数据”元素可以包含任意数量的字段

感谢您的帮助

我们可以在 Pass 任务中添加 step_function_url 作为原始有效负载的兄弟。 Parameters 将执行 ID 添加到输入中。输入默认作为输出传递,这就是我们想要的。

状态定义:

"PassTask": {
    "Type": "Pass",
    "Parameters": {
      "step_function_url.$": "States.Format('https://console.aws.amazon.com/states/home?region=us-east-1#/executions/details/{}', $$.Execution.Id)",
      "log_telemetry.$": "$.log_telemetry"
    },
    "Next": "MySuperNextTask"
  },

步进输出url,使用OP输入:

{
  "step_function_url": "https://console.aws.amazon.com/states/home?region=us-east-1#/executions/details/arn:aws:states:us-east-1:xxxxxxx:execution:StateMachineXXXXX-twWleHeOy2pw:ebbf738e-a2df-c6a0-f626-xxxxxxxxxx",
  "log_telemetry": {
    "eventType": "telemetry",
    "operation": "start",
    "data": {
      "correlation_id": "69974248-7673-42fb-8d1d-e4e2bd3e0946",
      "start_time": "01/05/2022, 16:00:31",
      "environment": "stg"
    }
  }
}

编辑:添加执行url而不改变输入形状

将执行 url 添加到原始负载的 data 映射需要额外的步骤。问题是 data 具有任意键值对。状态语言没有语法 data.step_function_url 的值设置为 x,但传递数据的其他键值不变 。它不能做第二部分。

很容易解决:在 Pass 之后添加一个 Lambda 任务,将 url 值合并到原始形状中。

exports.handler = async (event) => { 
    event.log_telemetry.data.step_function_url = event.step_function_url;
    return event.log_telemetry;
}

输出现在与 OP 的输入具有相同的形状。

如果其他人觉得它有用,我最终使用了 2 个传递任务来实现这个

  "States": {
    "Determine Url": {
      "Type": "Pass",
      "Parameters": {
        "value.$": "States.Format('${step_function_url_prefix}/{}', $$.Execution.Id)"
      },
      "ResultPath": "$.determine_url",
      "Next": "Update Url"
    },
    "Update Url": {
      "Type": "Pass",
      "InputPath": "$.determine_url.value",
      "ResultPath": "$.log_telemetry.data.step_function_url",
      "Next": "Log Telemetry Start"
    }
 }