Amazon web services 如何在AWS函数中将JSON传递给ECS任务?

Amazon web services 如何在AWS函数中将JSON传递给ECS任务?,amazon-web-services,amazon-ecs,aws-step-functions,Amazon Web Services,Amazon Ecs,Aws Step Functions,我正在尝试创建一个工作流,其中我有一个Lambda任务,然后是一个ECS/Fargate任务 Lambda将ID作为输入,并以JSON格式输出一些数据,这些数据由ECS任务使用,ECS任务在其容器环境中运行一个Python脚本。我想在StepFunctions中执行以下流程: { id: 1234 } -> [Lambda] -> { id: 1234, data: {...} } { id: 1234, data: {...} } -> [ECS] -> { id:

我正在尝试创建一个工作流,其中我有一个Lambda任务,然后是一个ECS/Fargate任务

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

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

{ id: 1234, data: {...} } -> [ECS] -> { id: 1234, result: "bar"}
以下是ECS任务的配置示例,仅供参考:

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

以下是我到目前为止发现的东西:

  • 通过使用JSONPath选择输入的各个字段并将其设置为环境变量,我可以将JSON输入的各个字段传递给容器。但是,如果我将整个
    输入
    对象(
    $
    )分配给环境变量,那么它在运行时会失败,并出现序列化错误(
    [object]无法转换为字符串
  • 我可以创建一个中间lambda,它接受输入并将其转换为JSON字符串,该字符串存储在
    输出中的单个键值中,然后将该单个字符串键值分配给ECS任务的环境变量并对其进行解析。但是,这需要添加整个额外任务和几秒钟的运行时间+成本
以下是一些我不能做的事情:

  • bot3
    中似乎没有任何机制来获取现有ECS任务的
    输入。我可以获取未分配活动的
    输入
    ,也可以获取整个执行的输入。但是,即使我有一个任务令牌,也没有用于获取现有正在运行的任务的输入的API
  • 我无法修改我的原始Lambda以将JSON作为字符串输出。我在多个地方使用这个结果(并行任务),其他任务是lambda,它使用
    输出的特定子字段作为其
    输入
将定义为
输入的结构化JSON对象传递给任务到ECS/Fargate任务的执行容器的预期机制是什么

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

查看输入和输出处理文档:

这将有助于您决定要传递给“RunFargate任务”状态的JSON输入(来自您在问题中链接的示例)

Step函数支持ECS的“RunTask”和几个参数:

比如说,

  • 假设我的Lambda函数输出了这个JSON

    {
        "commands": [
            "foo": { "bar" },
            "some command 1",
            "some command 2"
        ]
    }
    
  • 我希望我的RunFargate任务有一个只获取所有输入的输入路径。在我的状态机中,在
    “Type”:“Task”之后,
    我将放置:

    "InputPath":"$.commands",
    
  • 然后在我的Fargate任务的
    “参数”
    中,在
    “网络配置:{….}”之后,
    我将使用JSON路径语法放置我想要的容器覆盖:。但是,我不需要JSON的所有输入,只需要
    “foo”


  • 您可以使用此处使用的语法:

    如果您没有在运行Lambda结果路径的步骤中指定,则容器的输入将是Lambda的输出,转换为:

    "Overrides": {
       "ContainerOverrides": [
          {
            "Name": "container-name",
            "Environment": [
              {
                "Name": "SOME_ENV_VAR",
                "Value.$": "$"
              },
    
    但即使这样,也仅限于存储为ENV的内容,因此您需要确保JSON实际上是一个字符串,在运行任务之前,您可以使用该字符串格式化请求:

    const formatRequest = new sfn.Pass(this, 'FormatRequest', {
        parameters: {
            'request.$': 'States.JsonToString($)'
        }
    })
    

    第一个JSON的
    命令
    数组的内容对我来说似乎无效。您可能希望将内容包装在JSON对象中。感谢您的响应。不幸的是,这仅在您希望以参数数组的形式传递命令时才起作用。我试图传递纯数据的JSON结构,我的lambda函数不知道ECS/Fargate任务试图运行的命令:事实上,我有几个ECS/Fargate任务在同一个输入JSON blob上运行不同的命令。我只想将此数据作为参数或环境变量传递给现有命令。谢谢,我曾尝试使用此解决方案,但受到限制,我的JSON内容不能是字符串。我还必须通过并行步骤将此输出发送到Lambda,并且必须将其格式化为该步骤输入的结构化JSON。实际上,我早就放弃了,并切换到了另一个工作队列,但我认为这解决了我的问题。我不确定我是否需要在每个ECS任务状态之前添加额外的Pass状态,以便在ContainerOverride环境中使用它们之前进行转换,或者我是否可以使用内联的内在函数,但这两个函数中的一个似乎可以工作。
    const formatRequest = new sfn.Pass(this, 'FormatRequest', {
        parameters: {
            'request.$': 'States.JsonToString($)'
        }
    })