使用 Step Functions 运行 Amazon ECS 或 Fargate 任务 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Step Functions 运行 Amazon ECS 或 Fargate 任务

了解如何将 Step Functions 与 Amazon ECS 或 Fargate 集成来运行和管理任务。在 Amazon ECS 中,任务是基本的计算单位。任务由任务定义所定义,任务定义指定 Docker 容器的运行方式,包括容器映像、CPU 和内存限制、网络配置和其它参数。本页列出了可用的 Amazon ECS API 操作,并提供了有关如何使用 Step Functions 将数据传递给 Amazon ECS 任务的说明。

要了解如何在 Step Functions 中与 Amazon 服务集成,请参阅集成 服务在 Step Functions 中将参数传递给服务 API

经优化的 Amazon ECS/Fargate 集成的主要功能
  • 支持运行作业 (.sync) 集成模式。

  • ecs:runTask 可以返回 HTTP 200 响应,但有一个非空的 Failures 字段,如下所示:

    • 请求响应:返回响应,任务不会失败,任务不会失败,这与未经优化的集成相同。

    • 运行作业或任务令牌:如果遇到非空 Failures 字段,则任务会因 AmazonECS.Unknown 错误而失败。

经优化的 Amazon ECS/Fargate API

  • RunTask 使用指定的任务定义启动新任务。

Step Functions 中的参数以 PascalCase 表示

即使原生服务 API 采用 camelCase(例如 API 操作 startSyncExecution),也可以采用 PascalCase 指定参数,例如:StateMachineArn

向 Amazon ECS 任务传递数据

要了解如何在 Step Functions 中与 Amazon 服务集成,请参阅集成 服务在 Step Functions 中将参数传递给服务 API

您可以使用 overrides 覆盖容器的默认命令,并将输入传递给 Amazon ECS 任务。请参阅 ContainerOverride。在该示例中,我们使用 JsonPath 将值从 Task 状态的输入传递给 Task

下面是一个运行 Amazon ECS 任务并等待任务完成的 Task 状态。

{ "StartAt": "Run an ECS Task and wait for it to complete", "States": { "Run an ECS Task and wait for it to complete": { "Type": "Task", "Resource": "arn:aws:states:::ecs:runTask.sync", "Arguments": { "Cluster": "cluster-arn", "TaskDefinition": "job-id", "Overrides": { "ContainerOverrides": [ { "Name": "container-name", "Command": "{% $state.input.commands %}" } ] } }, "End": true } } }

Command 中的 ContainerOverrides 行将命令从状态输入传递到容器。

在前面的状态机示例中,基于以下输入,每条命令都将作为容器覆盖参数传递:

{ "commands": [ "test command 1", "test command 2", "test command 3" ] }

下面包含一个运行 Amazon ECS 任务,然后等待返回任务令牌的 Task 状态。请参阅等待具有任务令牌的回调

{ "StartAt":"Manage ECS task", "States":{ "Manage ECS task":{ "Type":"Task", "Resource":"arn:aws:states:::ecs:runTask.waitForTaskToken", "Arguments":{ "LaunchType":"FARGATE", "Cluster":"cluster-arn", "TaskDefinition":"job-id", "Overrides":{ "ContainerOverrides":[ { "Name":"container-name", "Environment":[ { "Name" : "TASK_TOKEN_ENV_VARIABLE", "Value" : "{% $states.context.Task.Token %}" } ] } ] } }, "End":true } } }

用于调用 Amazon ECS/Amazon Fargate 的 IAM 策略

以下示例模板展示了 Amazon Step Functions 如何根据状态机定义中的资源生成 IAM 策略。有关更多信息,请参阅Step Functions 如何为集成服务生成 IAM 策略探索 Step Functions 中的服务集成模式

由于在提交任务之前 TaskId 的值始终是未知的,因此 Step Functions 会创建具有更高特权的 "Resource": "*" 策略。

注意

尽管有 "*" IAM 策略,但您只能停止由 Step Functions 启动的 Amazon Elastic Container Service (Amazon ECS) 任务。

Run a Job (.sync)

静态资源

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunTask" ], "Resource": [ "arn:aws:ecs:us-east-1:123456789012:task-definition/taskDefinition:revisionNumber" ] }, { "Effect": "Allow", "Action": [ "ecs:StopTask", "ecs:DescribeTasks" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:us-east-1:123456789012:rule/StepFunctionsGetEventsForECSTaskRule" ] } ] }

动态资源

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunTask", "ecs:StopTask", "ecs:DescribeTasks" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:us-east-1:123456789012:rule/StepFunctionsGetEventsForECSTaskRule" ] } ] }
Request Response and Callback (.waitForTaskToken)

静态资源

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunTask" ], "Resource": [ "arn:aws:ecs:us-east-1:123456789012:task-definition/taskDefinition:revisionNumber" ] } ] }

动态资源

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunTask" ], "Resource": "*" } ] }

如果计划 Amazon ECS 任务需要使用任务执行角色、任务角色或任务角色覆盖,则必须将每个任务执行角色、任务角色或任务角色覆盖的 iam:PassRole 权限添加到调用实体的 CloudWatch Events IAM 角色中,本例中的实体为 Step Functions。