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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Step Functions 运行亚马逊ECS或 Fargate 任务

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

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

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

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

    • 请求响应:返回响应,任务不会失败。这与不进行优化相同。

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

支持 Amazon ECS /Fargate APIs

中的参数 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", "Parameters": { "Cluster": "cluster-arn", "TaskDefinition": "job-id", "Overrides": { "ContainerOverrides": [ { "Name": "container-name", "Command.$": "$.commands" } ] } }, "End": true } } }

ContainerOverrides 中的 "Command.$": "$.commands" 行将命令从状态输入传递到容器。

对于上一个示例,如果执行的输入为以下内容,则每个命令都将作为容器覆盖传递。

{ "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", "Parameters":{ "LaunchType":"FARGATE", "Cluster":"cluster-arn", "TaskDefinition":"job-id", "Overrides":{ "ContainerOverrides":[ { "Name":"container-name", "Environment":[ { "Name":"TASK_TOKEN_ENV_VARIABLE", "Value.$":"$$.Task.Token" } ] } ] } }, "End":true } } }

IAM致电亚马逊的政策ECS/Amazon Fargate

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

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

注意

尽管有"*"IAM政策,但您只能停止由 Step Functions 启动的亚马逊弹性容器服务 (AmazonECS) 任务。

Run a Job (.sync)

静态资源

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunTask" ], "Resource": [ "arn:aws:ecs:[[region]]: [[accountId]]: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:[[region]]: [[accountId]]: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:[[region]]: [[accountId]]:rule/StepFunctionsGetEventsForECSTaskRule" ] } ] }
Request Response and Callback (.waitForTaskToken)

静态资源

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

动态资源

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

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