Amazon web services 如何在AWS函数中将JSON传递给ECS任务?
我正在尝试创建一个工作流,其中我有一个Lambda任务,然后是一个ECS/Fargate任务 Lambda将ID作为输入,并以JSON格式输出一些数据,这些数据由ECS任务使用,ECS任务在其容器环境中运行一个Python脚本。我想在StepFunctions中执行以下流程: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:
{ id: 1234 } -> [Lambda] -> { id: 1234, data: {...} }
{ id: 1234, data: {...} } -> [ECS] -> { id: 1234, result: "bar"}
以下是ECS任务的配置示例,仅供参考:
我无法找到任何方法将ECS任务的结构化JSON输入传递给运行该任务的容器。
以下是我到目前为止发现的东西:
- 通过使用JSONPath选择输入的各个字段并将其设置为环境变量,我可以将JSON输入的各个字段传递给容器。但是,如果我将整个
对象(输入
)分配给环境变量,那么它在运行时会失败,并出现序列化错误($
)[object]无法转换为字符串
- 我可以创建一个中间lambda,它接受输入并将其转换为JSON字符串,该字符串存储在
输出中的单个键值中,然后将该单个字符串键值分配给ECS任务的环境变量并对其进行解析。但是,这需要添加整个额外任务和几秒钟的运行时间+成本
- 在
中似乎没有任何机制来获取现有ECS任务的bot3
输入。我可以获取未分配活动的
,也可以获取整个执行的输入。但是,即使我有一个任务令牌,也没有用于获取现有正在运行的任务的输入的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($)'
}
})