首页 > 解决方案 > Step 函数中 ECS 任务的输入和输出

问题描述

之前曾使用 AWS step 函数处理 lambda 编排。这一直运作良好。设置每个 lambda 的 result_path 会将参数传递给后续 lambda。

但是,我现在需要运行一个 Fargate 任务,然后将来自该 Fargate 任务的参数传递给后续的 lambda。我创建了一个 python 脚本,作为容器定义中的入口点。显然,在 lambda 函数中,handler(event, context)它充当入口点,并通过定义一个return {"return_object": "hello_world"}很容易将一个长参数传递给状态机的下一个状态。

不过,就我而言,我有一个任务定义,其中包含从这个 Dockerfile 创建的容器定义:

FROM python:3.7-slim

COPY my_script.py /my_script.py
RUN ln -s /python/my_script.py /usr/bin/my_script && \
chmod +x /python/my_script.py

ENTRYPOINT ["my_script"]

因此,我能够调用状态机,它会按预期执行 my_script。但是如何从这个 python 脚本中获取输出并将其传递给状态机中的另一个状态呢?

我找到了一些关于如何传递输入的文档,但没有传递输出的例子。

标签: amazon-web-servicesamazon-ecsaws-fargateaws-step-functionsaws-state-machine

解决方案


要从 ECS/Fargate 任务中获取输出,我认为您必须使用任务令牌集成而不是通常推荐用于 Fargate 任务的运行作业(同步)。您可以将令牌作为容器覆盖 ( "TASK_TOKEN": "$$.Task.Token") 传递。然后在你的图像中,你需要一些这样的逻辑:

client = boto3.client('stepfunctions')
client.send_task_success(
    taskToken=os.environ["TASK_TOKEN"],
    output=output
)

把它传回去。


推荐阅读