

# 将多个目标组注册到 Amazon ECS 服务
<a name="register-multiple-targetgroups"></a>

当您在服务定义中指定多个目标组时，Amazon ECS 服务可以为来自多个负载均衡器的流量提供服务并公开多个负载平衡端口。

要创建一个指定多个目标组的服务，您必须使用 Amazon ECS API、开发工具包、AWS CLI 或 CloudFormation 模板创建该服务。在创建服务后，您可以使用 AWS 管理控制台查看服务以及注册到服务的目标组。您必须使用 `[UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html)` 修改现有服务的负载均衡器配置。

可以使用以下格式在服务定义中指定多个目标组。有关服务定义的完整语法，请参阅[服务定义模板](sd-template.md)。

```
"loadBalancers":[
   {  
      "targetGroupArn":"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/target_group_name_1/1234567890123456",
      "containerName":"container_name",
      "containerPort":container_port
   },
   {  
      "targetGroupArn":"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/target_group_name_2/6543210987654321",
      "containerName":"container_name",
      "containerPort":container_port
   }
]
```

## 注意事项
<a name="multiple-targetgroups-considerations"></a>

在服务定义中指定多个目标组时，应注意以下事项：
+ 对于使用应用程序负载均衡器或网络负载均衡器的服务，附加到一个服务的目标组不能超过五个。
+ 仅在以下条件下，才支持在服务定义中指定多个目标组：
  + 服务必须使用应用程序负载均衡器或网络负载均衡器。
  + 该服务必须使用（`ECS`）部署控制器类型。这可以是 Amazon ECS 本机/蓝绿部署，也可以是滚动更新部署。
+ 包含使用 Fargate 和 EC2 启动类型的任务的服务支持多个目标组。
+ 当您创建一个指定多个目标组的服务时，必须创建 Amazon ECS 服务相关角色。通过省略 API 请求中的 `role` 参数或 CloudFormation 中的 `Role` 属性来创建角色。有关更多信息，请参阅 [对 Amazon ECS 使用服务相关角色](using-service-linked-roles.md)。

## 示例服务定义
<a name="multiple-targetgroups-examples"></a>

下面是一些在服务定义中指定多个目标组的示例使用案例。有关服务定义的完整语法，请参阅[服务定义模板](sd-template.md)。

### 为内部和外部流量使用独立的负载均衡器
<a name="multiple-targetgroups-example1"></a>

在以下使用案例中，服务对相同的容器和端口使用两个独立的负载均衡器，一个用于内部流量，另一个用于面向互联网的流量。

```
"loadBalancers":[
   //Internal ELB
   {  
      "targetGroupArn":"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/target_group_name_1/1234567890123456",
      "containerName":"nginx",
      "containerPort":8080
   },
   //Internet-facing ELB
   {  
      "targetGroupArn":"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/target_group_name_2/6543210987654321",
      "containerName":"nginx",
      "containerPort":8080
   }
]
```

### 从同一容器公开多个端口
<a name="multiple-targetgroups-example1"></a>

在以下使用案例中，服务使用一个负载均衡器，但从同一容器公开多个端口。例如，Jenkins 容器可能会为 Jenkins Web 接口公开端口 8080，为 API 公开端口 50000。

```
"loadBalancers":[
   {  
      "targetGroupArn":"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/target_group_name_1/1234567890123456",
      "containerName":"jenkins",
      "containerPort":8080
   },
   {  
      "targetGroupArn":"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/target_group_name_2/6543210987654321",
      "containerName":"jenkins",
      "containerPort":50000
   }
]
```

### 从多个容器公开端口
<a name="multiple-targetgroups-example3"></a>

在以下使用案例中，服务使用一个负载均衡器和两个目标组从单独的容器公开端口。

```
"loadBalancers":[
   {  
      "targetGroupArn":"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/target_group_name_1/1234567890123456",
      "containerName":"webserver",
      "containerPort":80
   },
   {  
      "targetGroupArn":"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/target_group_name_2/6543210987654321",
      "containerName":"database",
      "containerPort":3306
   }
]
```