

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

# 使用 Step Functions 运行 Amazon ECS 或 Fargate 任务
<a name="connect-ecs"></a>

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

要了解如何在 Step Functions 中与AWS服务集成，请参阅[集成 服务](integrate-services.md)和[在 Step Functions 中将参数传递给服务 API](connect-parameters.md)。

**优化 Amazon ECS/Fargate 集成的关键功能**  
支持[运行作业 (.sync)](connect-to-resource.md#connect-sync) 集成模式。
`ecs:runTask` 可以返回 HTTP 200 响应，但有一个非空的 `Failures` 字段，如下所示：  
**请求响应**：返回响应，任务不会失败，任务不会失败，这与未经优化的集成相同。
**运行作业或任务令牌**：如果遇到非空 `Failures` 字段，则任务会因 `AmazonECS.Unknown` 错误而失败。

## 优化 Amazon ECS/Fargate APIs
<a name="connect-ecs-api"></a>
+ [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html) 使用指定的任务定义启动新任务。

**中的Step Functions参数表示为 PascalCase**  
即使原生服务 API 在 camelCase 中（例如 API 操作）`startSyncExecution`，您也可以在中指定参数 PascalCase，例如:。`StateMachineArn`

## 向 Amazon ECS 任务传递数据
<a name="connect-ecs-pass-to"></a>

要了解如何在 Step Functions 中与AWS服务集成，请参阅[集成 服务](integrate-services.md)和[在 Step Functions 中将参数传递给服务 API](connect-parameters.md)。

您可以使用 `overrides` 覆盖容器的默认命令，并将输入传递给 Amazon ECS 任务。请参阅 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerOverride.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerOverride.html)。在示例中，我们习惯 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
    }
  }
}
```

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

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

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

下面包含一个运行 Amazon ECS 任务，然后等待返回任务令牌的 `Task` 状态。请参阅[等待具有任务令牌的回调](connect-to-resource.md#connect-wait-token)。

```
{  
   "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/AWS Fargate 的 IAM 策略
<a name="ecs-iam"></a>

以下示例模板展示了如何根据状态机定义中的资源AWS Step Functions生成 IAM 策略。有关更多信息，请参阅[Step Functions 如何为集成服务生成 IAM 策略](service-integration-iam-templates.md)和[探索 Step Functions 中的服务集成模式](connect-to-resource.md)。

由于在提交任务之前 `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:{{region}}:
{{account-id}}: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}}:
{{account-id}}: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}}:
{{account-id}}:rule/StepFunctionsGetEventsForECSTaskRule"
            ]
        }
    ]
}
```

------
#### [ Request Response and Callback (.waitForTaskToken) ]

*静态资源*

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

*动态资源*

****  

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

------

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