如何将 JSON 传递到 AWS StepFunction 中的 ECS 任务?

psi*_*gen 5 amazon-web-services amazon-ecs aws-step-functions

我正在尝试创建一个AWS StepFunctions工作流程,其中有一个Lambda任务,后跟一个ECS/Fargate任务。

Lambda 将 ID 作为输入,并以 JSON 形式输出一些数据,供 ECS 任务使用,该任务在其容器环境中运行 Python 脚本。我想在 StepFunctions 中执行以下流程:

{ id: 1234 } -> [Lambda] -> { id: 1234, data: {...} }

{ id: 1234, data: {...} } -> [ECS] -> { id: 1234, result: "bar"}
Run Code Online (Sandbox Code Playgroud)

作为参考,以下是 ECS 任务的示例配置: https://docs.aws.amazon.com/step-functions/latest/dg/sample-project-container-task-notification.html

我无法找到任何方法将inputECS 任务的结构化 JSON 传递到运行该任务的容器。

以下是我迄今为止发现的内容:

  • 我可以使用 JSONPath 选择输入的各个字段并将它们设置为环境变量,从而将 JSON 输入的各个字段传递到容器。但是,如果我将整个input对象 ( $) 分配给环境变量,则它会在运行时失败并出现序列化错误 ( [Object] cannot be converted to a string)。
  • 我可以创建一个中间 lambda,它接受输入并将其转换为 JSON 字符串,该字符串存储在 中的单个键值中output,然后将此单个字符串键值分配给 ECS Task 的环境变量并解析它。然而,这需要添加整个额外的任务和几秒钟的运行时间+成本。

以下是一些我不能做的事情:

  • 似乎没有任何机制可以boto3获取input现有的 ECS 任务。我可以获取未分配input活动的输入,也可以获取整个执行的输入。但是,即使我有任务令牌,也没有 API 可以仅获取现有正在运行的任务的输入。
  • 我无法修改原始 Lambda 以将 JSON 作为字符串输出。我在多个地方使用此结果(并行任务),其他任务是 Lambda,它们使用 的特定子字段作为outputinput.

将定义为任务的结构化 JSON 对象传递input到 ECS/Fargate 任务的执行容器的预期机制是什么?

小智 0

将定义为任务输入的结构化 JSON 对象传递到 ECS/Fargate 任务的执行容器的预期机制是什么?

查看输入和输出处理文档:https://docs.aws.amazon.com/step-functions/latest/dg/concepts-input-output-filtering.html

这将帮助您决定要将哪些 JSON 输入传递到“运行 Fargate 任务”状态(来自您问题中链接的示例)

Step Functions 支持 ECS 的“RunTask”和几个参数:https://docs.aws.amazon.com/step-functions/latest/dg/connect-ecs.html

例如,

  1. 假设我的 Lambda 函数输出此 JSON

    {
        "commands": [
            "foo": { "bar" },
            "some command 1",
            "some command 2"
        ]
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我希望我的运行 Fargate 任务有一个仅获取所有输入的输入路径。在我的状态机中,"Type": "Task",我将输入:

    "InputPath":"$.commands",
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后,在我"Parameters"的 Fargate 任务中"NetworkConfigurations:{....},",我将使用 JSON 路径语法放置我想要的容器覆盖:https://github.com/json-path/JsonPath。但是,我不需要 JSON 中的所有输入,只需要以下值"foo"

    "Overrides": {
        "ContainerOverrides": [
            {
                "Name": "container-name",
                "Command.$": "$.commands.foo"
            }
        ]
    }
    
    Run Code Online (Sandbox Code Playgroud)

您可以使用此处使用的语法:https ://docs.aws.amazon.com/step-functions/latest/dg/connect-ecs.html