

# 使用服务发现连接具有 DNS 名称的 Amazon ECS 服务
<a name="service-discovery"></a>

您的 Amazon ECS 服务可以选择配置为使用 Amazon ECS 服务发现。服务发现使用 AWS Cloud Map API 操作，用于托管 Amazon ECS 服务的 HTTP 和 DNS 命名空间。有关更多信息，请参阅 [AWS Cloud Map 开发人员指南](https://docs.aws.amazon.com/cloud-map/latest/dg/Welcome.html) 中的*什么是 AWS Cloud Map*。

服务发现在以下 AWS 区域可用：


| 区域名称 | 区域 | 
| --- | --- | 
|  美国东部（弗吉尼亚州北部）  |  us-east-1  | 
|  美国东部（俄亥俄州）  |  us-east-2  | 
|  美国西部（北加利福尼亚）  |  us-west-1  | 
|  美国西部（俄勒冈州）  |  us-west-2  | 
|  非洲（开普敦）  |  af-south-1  | 
|  亚太地区（香港）  |  ap-east-1  | 
|  亚太地区（台北）  |  ap-east-2  | 
|  亚太地区（孟买）  |  ap-south-1  | 
|  亚太地区（海得拉巴）  |  ap-south-2  | 
|  亚太地区（东京）  |  ap-northeast-1  | 
|  亚太地区（首尔）  |  ap-northeast-2  | 
|  亚太地区（大阪）  |  ap-northeast-3  | 
|  亚太地区（新加坡）  |  ap-southeast-1  | 
|  亚太地区（悉尼）  |  ap-southeast-2  | 
|  亚太地区（雅加达）  |  ap-southeast-3  | 
|  亚太地区（墨尔本）  |  ap-southeast-4  | 
|  亚太地区（马来西亚）  |  ap-southeast-5  | 
|  亚太地区（新西兰）  |  ap-southeast-6  | 
|  亚太地区（泰国）  |  ap-southeast-7  | 
|  加拿大（中部）  |  ca-central-1  | 
|  加拿大西部（卡尔加里）  |  ca-west-1  | 
|  中国（北京）  |  cn-north-1  | 
|  中国（宁夏）  |  cn-northwest-1  | 
|  欧洲地区（法兰克福）  |  eu-central-1  | 
|  欧洲（苏黎世）  |  eu-central-2  | 
|  欧洲地区（爱尔兰）  |  eu-west-1  | 
|  欧洲地区（伦敦）  |  eu-west-2  | 
|  欧洲地区（巴黎）  |  eu-west-3  | 
|  欧洲地区（米兰）  |  eu-south-1  | 
|  欧洲地区（斯德哥尔摩）  |  eu-north-1  | 
|  以色列（特拉维夫）  |  il-central-1  | 
|  欧洲（西班牙）  |  eu-south-2  | 
|  中东（阿联酋）  |  me-central-1  | 
|  墨西哥（中部）  |  mx-central-1  | 
|  中东（巴林）  |  me-south-1  | 
|  南美洲（圣保罗）  |  sa-east-1  | 
|  AWS GovCloud（美国东部）  |  us-gov-east-1  | 
|  AWS GovCloud（美国西部）  |  us-gov-west-1  | 

## 服务发现概念
<a name="service-discovery-concepts"></a>

服务发现包括以下组件：
+ **服务发现命名空间**：共享相同域名的服务发现服务的逻辑组，例如 `example.com`，这是您想要路由流量的位置。您可以通过调用 `aws servicediscovery create-private-dns-namespace` 命令或在 Amazon ECS 控制台中创建命名空间。您可以使用 `aws servicediscovery list-namespaces` 命令来查看有关当前账户创建的命名空间的摘要信息。有关服务发现命令的更多信息，请参阅 *`[create-private-dns-namespace](https://docs.aws.amazon.com/cli/latest/reference/servicediscovery/create-private-dns-namespace.html)`（服务发现）`[list-namespaces](https://docs.aws.amazon.com/cli/latest/reference/servicediscovery/list-namespaces.html)` 参考指南*中的 AWS Cloud Map 和 AWS CLI。
+ **服务发现服务**：存在于服务发现命名空间中，由命名空间的服务名称和 DNS 配置组成。它提供了以下核心组件：
  + **服务注册**：让您可通过 DNS 或 AWS Cloud Map API 操作查找服务，并获取一个或多个可用于连接到该服务的可用端点。
+ **服务发现实例**：存在于服务发现中并包含与服务目录中的每个 Amazon ECS 服务相关联的属性。
  + **实例属性**：将以下元数据添加为配置为使用服务发现的每个 Amazon ECS 服务的自定义属性：
    + **`AWS_INSTANCE_IPV4`** -对于 `A` 记录，为 Route 53 响应 DNS 查询而返回和 AWS Cloud Map 在发现实例详细信息时返回的 IPv4 地址，例如 `192.0.2.44`。
    + **`AWS_INSTANCE_IPV6`**：对于 `AAAA` 记录，为 Route 53 响应 DNS 查询而返回和 AWS Cloud Map 在发现实例详细信息时返回的 IPv6 地址，例如 ` 2001:0db8:85a3:0000:0000:abcd:0001:2345`。为 Amazon ECS 双堆栈服务添加了 `AWS_INSTANCE_IPv4` 和 `AWS_INSTANCE_IPv6`。对 Amazon ECS 仅 IPv6 服务仅添加了 `AWS_INSTANCE_IPv6`。
    + **`AWS_INSTANCE_PORT`** – 与服务发现服务关联的端口值。
    + **`AVAILABILITY_ZONE`** – 任务启动到的可用区。对于使用 EC2 的任务，这是容器实例存在于的可用区。对于使用 Fargate 的任务，这是弹性网络接口存在于的可用区。
    + **`REGION`** – 任务存在于的区域。
    + **`ECS_SERVICE_NAME`** – 任务属于的 Amazon ECS 服务的名称。
    + **`ECS_CLUSTER_NAME`** – 任务属于的 Amazon ECS 集群的名称。
    + **`EC2_INSTANCE_ID`**：在其上放置任务的容器实例的 ID。如果任务使用 Fargate，则不会添加此自定义属性。
    + **`ECS_TASK_DEFINITION_FAMILY`**：任务使用的任务定义系列。
    + **`ECS_TASK_SET_EXTERNAL_ID`**：如果为外部部署创建任务集并将任务集与服务发现注册表关联，`ECS_TASK_SET_EXTERNAL_ID` 属性将包含任务集的外部 ID。
+ **Amazon ECS 运行状况检查**：Amazon ECS 执行定期容器级别的运行状况检查。如果端点不传递运行状况检查，则会将其从 DNS 路由中删除并标记为不正常。

## 服务发现注意事项
<a name="service-discovery-considerations"></a>

使用服务发现时应注意以下事项：
+ Fargate 上使用平台版本1.1.0或更高版本的任务支持服务发现。有关更多信息，请参阅 [适用于 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。
+ 配置为使用服务发现的服务每个服务限制为 1,000 个任务。这是由于 Route 53 服务配额造成的。
+ Amazon ECS 控制台中的创建服务工作流程仅支持向私有 DNS 命名空间注册服务。在创建 AWS Cloud Map 私有 DNS 命名空间时，将自动创建 Route 53 私有托管区域。
+ 必须配置 VPC DNS 属性才能成功解析 DNS。有关如何配置属性的信息，请参阅 *Amazon VPC 用户指南*中 [VPC 中的 DNS 支持](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support)。
+ Amazon ECS 不支持将服务注册到共享的 AWS Cloud Map 命名空间。
+ 为服务发现服务创建的 DNS 记录将始终注册任务的私有 IP 地址，而不是公有 IP 地址，即使使用公共命名空间也是如此。
+ 服务发现要求任务指定 `awsvpc`、`bridge` 或 `host` 网络模式（不支持 `none`）。
+ 如果服务任务定义使用 `awsvpc` 网络模式，您可以为每个服务任务创建 `A` 或 `SRV` 记录的任意组合。如果您使用 `SRV` 记录，则需要端口。如果服务使用双堆栈子网，则还可以创建 `AAAA` 记录。如果服务使用仅 IPv6 子网，则无法创建 `A` 记录。
+ 如果服务任务定义使用 `bridge` 或 `host` 网络模式，则 SRV 记录是唯一受支持的 DNS 记录类型。为每个服务任务创建 SRV 记录。SRV 记录必须从任务定义中指定容器名称和容器端口组合。
+ 服务发现服务的 DNS 记录可以在 VPC 中查询。它们采用以下格式：`<service-discovery-service-name>.<service-discovery-namespace>`。
+ 在服务名称上执行 DNS 查询时，`A` 和 `AAAA` 记录会返回一组与任务对应的 IP 地址。`SRV` 记录会返回每个任务的一组 IP 地址和端口。
+ 如果您有不超过 8 条正常的记录，Route 53 会向所有 DNS 查询提供所有正常记录。
+ 如果所有记录都不正常，Route 53 会向 DNS 查询提供最多 8 条不正常的记录。
+ 您可以为负载均衡器后面的服务配置服务发现，但服务发现流量会始终路由至此任务而不会路由至负载均衡器。
+ 服务发现不支持使用 Classic Load Balancers。
+ 我们建议对服务发现服务使用由 Amazon ECS 管理的容器级别的运行状况检查。
  + **HealthCheckCustomConfig** – Amazon ECS 代表您管理运行状况检查。Amazon ECS 使用来自容器和运行状况检查的信息以及您的任务状态，通过 AWS Cloud Map 更新运行状况。在创建服务发现服务时，使用 `--health-check-custom-config` 参数来指定。有关更多信息，请参阅 *AWS Cloud Map API 参考*中的 [HealthCheckCustomConfig](https://docs.aws.amazon.com/cloud-map/latest/api/API_HealthCheckCustomConfig.html)。
+ 使用服务发现时创建的 AWS Cloud Map 资源必须手动清理。
+ 在容器运行状况检查返回值之前，任务和实例将注册为 `UNHEALTHY`。如果运行状况检查通过，则状态更新为 `HEALTHY`。如果容器运行状况检查失败，则服务发现实例将被注销。

## 服务发现定价
<a name="service-discovery-pricing"></a>

使用 Amazon ECS 服务发现的客户需要为 Route 53 资源和 AWS Cloud Map 发现 API 操作付费。这涉及到创建 Route 53 托管区域和查询服务注册表的成本。更多信息，请参阅 *AWS Cloud Map 开发人员指南*中的 [AWS Cloud Map 定价](https://docs.aws.amazon.com/cloud-map/latest/dg/cloud-map-pricing.html)。

Amazon ECS 执行容器级别的运行状况检查并将其公开到 AWS Cloud Map 自定义运行状况检查 API 操作。目前将此提供给客户没有任何额外成本。如果您为公开任务配置其他网络运行状况检查，则需要为这些运行状况检查付费。