

# 使用共享 AWS Cloud Map 命名空间的 Amazon ECS Service Connect
<a name="service-connect-shared-namespaces"></a>

Amazon ECS Service Connect 支持在同一 AWS 区域内的多个 AWS 账户之间使用共享 AWS Cloud Map 命名空间。此功能使您能够创建分布式应用程序，其中运行在不同 AWS 账户中的服务可以通过 Service Connect 发现彼此并相互通信。共享命名空间使用 AWS Resource Access Manager（AWS RAM）进行管理，它允许安全的跨账户资源共享。有关共享命名空间的更多信息，请参阅《AWS Cloud Map 开发人员指南》**中的 [Cross-account AWS Cloud Map namespace sharing](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)。

**重要**  
您必须使用 `AWSRAMPermissionCloudMapECSFullPermission` 托管权限来共享命名空间，Service Connect 才能与命名空间正常协作。

当您将共享 AWS Cloud Map 命名空间与 Service Connect 结合使用时，来自多个 AWS 账户的服务可以参与同一个服务命​​名空间。这对于拥有多个 AWS 账户、需要跨账户边界维护服务间通信同时确保安全性和隔离的组织来说特别有用。

**注意**  
要与不同 VPC 中的服务进行通信，您需要配置 VPC 间连接。这可以使用 VPC 对等连接来实现。有关更多信息，请参阅《Amazon Virtual Private Cloud VPC 对等连接指南》**中的[创建或删除 VPC 对等连接](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html)。

# 将共享的 AWS Cloud Map 命名空间与 Amazon ECS Service Connect 结合使用
<a name="service-connect-shared-namespaces-setup"></a>

为 Service Connect 设置共享的 AWS Cloud Map 命名空间涉及以下步骤：命名空间所有者创建命名空间，所有者通过 AWS Resource Access Manager（AWS RAM）共享命名空间，使用者接受资源共享，以及使用者配置 Service Connect 以使用共享命名空间。

## 步骤 1：创建 AWS Cloud Map 命名空间
<a name="service-connect-shared-namespaces-create"></a>

命名空间所有者创建一个将与其他账户共享的 AWS Cloud Map 命名空间。

**使用 AWS 管理控制台创建要共享的命名空间**

1. 打开 AWS Cloud Map 控制台，地址：[https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)。

1. 选择**创建命名空间**。

1. 输入**命名空间名称**。所有参与账户的服务都将使用此名称。

1. 对于**命名空间类型**，请为您的使用案例选择合适的类型：
   + **API 调用** ‐ 用于服务发现的 HTTP 命名空间，没有 DNS 功能。
   + **VPC 中的 API 调用和 DNS 查询** ‐ 用于服务发现的私有 DNS 命名空间，具有 VPC 中的私有 DNS 查询。
   + **API 调用和公有 DNS 查询** ‐ 用于服务发现的公有 DNS 命名空间，具有公有 DNS 查询。

1.  选择**创建命名空间**。

## 步骤 2：使用 AWS RAM 共享命名空间
<a name="service-connect-shared-namespaces-share"></a>

命名空间所有者使用 AWS RAM 与其他 AWS 账户共享命名空间。

**使用 AWS RAM 控制台共享命名空间**

1. 打开 AWS RAM 控制台（[https://console.aws.amazon.com/ram/](https://console.aws.amazon.com/ram/)）。

1. 选择**创建资源共享**。

1. 对于**名称**，键入资源共享的描述性名称。

1. 在**资源**部分：

   1. 对于**资源类型**，选择 **Cloud Map 命名空间**。

   1. 选择您在上一步中创建的命名空间。

1. 在**托管权限**部分，指定 **AWSRAMPermissionCloudMapECSFullPermission**。
**重要**  
您必须使用 `AWSRAMPermissionCloudMapECSFullPermission` 托管权限来共享命名空间，Service Connect 才能与命名空间正常协作。

1. 在**主体**部分，指定要与其共享命名空间的 AWS 账户。您可以输入账户 ID 或组织单元 ID。

1. 选择**创建资源共享**。

## 步骤 3：接受资源共享
<a name="service-connect-shared-namespaces-accept"></a>

命名空间使用者账户必须接受资源共享邀请才能使用共享命名空间。

**使用 AWS RAM 控制台接受资源共享邀请**

1. 在使用者账户中，打开 AWS RAM 控制台，网址为 [https://console.aws.amazon.com/ram/](https://console.aws.amazon.com/ram/)。

1. 在导航窗格中，选择**与我共享**，然后选择**资源共享**。

1. 选择资源共享邀请，然后选择**接受资源共享**。

1. 接受后，请记下资源详细信息中的共享命名空间 ARN。配置 Service Connect 服务时，您将使用此 ARN。

## 步骤 4：为 Amazon ECS 服务配置共享命名空间
<a name="service-connect-shared-namespaces-configure"></a>

接受共享命名空间后，命名空间使用者可以将 Amazon ECS 服务配置为使用共享命名空间。该配置与使用常规命名空间类似，但您必须指定命名空间 ARN 而不是名称。有关详细的服务创建过程，请参阅 [创建 Amazon ECS 滚动更新部署](create-service-console-v2.md)。

**使用AWS 管理控制台创建具有共享命名空间的服务**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在**集群**页面上，选择要在其中创建服务的集群。

1. 在**服务**下，选择**创建**。

1. 根据工作负载填写其他详细信息后，请在 **Service Connect** 部分中选择**使用 Service Connect**。

1. 对于**命名空间**，输入共享命名空间的完整 ARN。

   ARN 格式为：`arn:aws:servicediscovery:region:account-id:namespace/namespace-id`。

1. 根据需要为服务类型（客户端或客户端-服务器）配置剩余 Service Connect 设置。

1. 完成服务创建过程。

您还可以使用 AWS CLI 或 AWS SDK，通过在 `serviceConnectConfiguration` 的 `namespace` 参数中指定共享命名空间 ARN 来配置服务。

```
aws ecs create-service \
    --cluster my-cluster \
    --service-name my-service \
    --task-definition my-task-def \
    --service-connect-configuration '{
        "enabled": true,
        "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-abcdef1234567890",
        "services": [{
            "portName": "web",
            "discoveryName": "my-service",
            "clientAliases": [{
                "port": 80,
                "dnsName": "my-service"
            }]
        }]
    }'
```

## 注意事项
<a name="service-connect-shared-namespaces-considerations"></a>

在将共享 AWS Cloud Map 命名空间与 Service Connect 结合使用时，请注意以下事项：
+ AWS RAM 必须在要使用共享命名空间的 AWS 区域可用。
+ 共享命名空间必须与您的 Amazon ECS 服务和集群位于同一 AWS 区域。
+ 在为 Service Connect 配置共享命名空间时，您必须使用命名空间 ARN，而不是 ID。
+ 所有命名空间类型均受支持：HTTP、私有 DNS 和公有 DNS 命名空间。
+ 如果撤消对共享命名空间的访问，则需要与该命名空间交互的 Amazon ECS 操作（例如 `CreateService`、`UpdateService` 和 `ListServicesByNamespace`）将失败。有关排查共享命名空间权限问题的更多信息，请参阅 [排查将 Amazon ECS Service Connect 与共享的 AWS Cloud Map 命名空间结合使用时出现的问题](service-connect-shared-namespaces-troubleshooting.md)。
+ 对于在共享私有 DNS 命名空间中使用 DNS 查询的服务发现：
  + 命名空间所有者需要使用与命名空间关联的私有托管区的 ID 以及使用者的 VPC 调用 `create-vpc-association-authorization`。

    ```
    aws route53 create-vpc-association-authorization --hosted-zone-id Z1234567890ABC --vpc VPCRegion=us-east-1,VPCId=vpc-12345678
    ```
  + 命名空间使用者需要使用私有托管区的 ID 调用 `associate-vpc-with-hosted-zone`。

    ```
    aws route53 associate-vpc-with-hosted-zone --hosted-zone-id Z1234567890ABC --vpc VPCRegion=us-east-1,VPCId=vpc-12345678
    ```
+ 仅命名空间所有者可以管理资源共享。
+ 命名空间使用者可以在共享命名空间内创建和管理服务，但不能修改命名空间本身。
+ 无论哪个账户创建服务，发现名称在共享命名空间内都必须是唯一的。
+ 共享命名空间中的服务可以发现并连接到有权访问该命名空间的其他 AWS 账户中的服务。
+ 在为 Service Connect 启用 TLS 并使用共享命名空间时，AWS 私有 CA 证书颁发机构（CA）的作用域限定为该命名空间。当对共享命名空间的访问被撤销时，对 CA 的访问也会停止。
+ 在使用共享命名空间时，命名空间所有者和使用者默认情况下无法访问跨账户 Amazon CloudWatch 指标。目标指标仅发布到拥有客户端服务的账户。拥有客户端服务的账户无法访问拥有客户端-服务器服务的账户接收到的指标，反之亦然。要允许跨账户访问指标，请设置 CloudWatch 跨账户可观测性。有关配置跨账户可观测性的更多信息，请参阅《Amazon CloudWatch 用户指南》**中的 [CloudWatch 跨账户可观测性](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html)。有关 Service Connect 的 CloudWatch 指标的更多信息，请参阅 [Amazon ECS CloudWatch 指标](available-metrics.md)。

# 排查将 Amazon ECS Service Connect 与共享的 AWS Cloud Map 命名空间结合使用时出现的问题
<a name="service-connect-shared-namespaces-troubleshooting"></a>

请使用以下信息排查共享 AWS Cloud Map 命名空间和 Service Connect 的问题。有关查找错误消息的更多信息，请参阅 [Amazon ECS 故障排除](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/troubleshooting.html)。

由于缺少权限或者如果命名空间的访问被撤销，会出现与权限问题相关的错误消息。

**重要**  
您必须使用 `AWSRAMPermissionCloudMapECSFullPermission` 托管权限来共享命名空间，Service Connect 才能与命名空间正常协作。

错误消息会以以下格式之一显示：

An error occurred (ClientException) when calling the <OperationName> operation: User: arn:aws:iam::<account-id>:user/<user-name> is not authorized to perform: <ActionName> on resource: <ResourceArn> because no resource-based policy allows the <ActionName> action（调用 <OperationName> 操作时发生错误 (ClientException)：用户 arn:aws:iam::<account-id>:user/<user-name> 无权对资源 <ResourceArn> 执行 <ActionName>，因为没有任何基于资源的策略允许执行 <ActionName> 操作）

以下情况可能会导致出现此格式的错误消息：

**集群创建或更新失败**  
当 Amazon ECS 操作（例如 `CreateCluster` 或 `UpdateCluster`）因缺少 AWS Cloud Map 权限而失败时，就会出现这些问题。这些操作需要以下 AWS Cloud Map 操作的权限：  
+ `servicediscovery:GetNamespace`
确保使用者账户已接受资源共享邀请，并且在 Service Connect 配置中使用正确的命名空间 ARN。

**服务创建或更新失败**  
当 Amazon ECS 操作（例如 `CreateService` 或 `UpdateService`）因缺少 AWS Cloud Map 权限而失败时，就会出现这些问题。这些操作需要以下 AWS Cloud Map 操作的权限：  
+ `servicediscovery:CreateService`
+ `servicediscovery:GetNamespace`
+ `servicediscovery:GetOperation`（用于创建新的 AWS Cloud Map 服务）
+ `servicediscovery:GetService`（当 AWS Cloud Map 服务已存在时）
确保使用者账户已接受资源共享邀请，并且在 Service Connect 配置中使用正确的命名空间 ARN。

**`ListServicesByNamespace` 操作失败**  
当 Amazon ECS `ListServicesByNamespace` 操作失败时，会出现此问题。此操作需要以下 AWS Cloud Map 操作的权限：  
+ `servicediscovery:GetNamespace`
要解决此问题，请执行以下操作：  
+ 验证使用者账户是否具有 `servicediscovery:GetNamespace` 权限。
+ 调用 API 时使用命名空间 ARN，而不是名称。
+ 确保资源共享处于活动状态并且已接受邀请。

User: <iam-user> is not authorized to perform: <ActionName> on resource: <ResourceArn> with an explicit deny in an identity-based policy.（用户 <iam-user> 无权对资源 <ResourceArn> 执行 <ActionName>，因为基于身份的策略中存在明确拒绝。）

以下情况可能会导致出现此格式的错误消息：

**服务删除失败并停滞在 `DRAINING` 状态**  
如果对命名空间的访问被撤销，则当 Amazon ECS `DeleteService` 操作因缺少 `servicediscovery:DeleteService` 权限而失败时，会出现此问题。该服务最初可能看似已成功删除，但会停滞在 `DRAINING` 状态。错误消息会显示为 Amazon ECS 服务事件。  
要解决此问题，命名空间所有者必须与使用者账户共享命名空间，以允许完成服务删除。

**服务中的任务运行失败**  
当任务因缺少权限而启动失败时，会出现此问题。错误消息显示为任务停止错误。有关更多信息，请参阅 [解决 Amazon ECS 已停止任务错误](resolve-stopped-errors.md)。  
运行任务需要以下 AWS Cloud Map 操作：  
+ `servicediscovery:GetOperation`
+ `servicediscovery:RegisterInstance`
确保使用者账户拥有所需的权限，并且可以访问共享命名空间。

**任务无法干净地停止或者停滞在 `DEACTIVATING` 或 `DEPROVISIONING` 状态**  
当任务在关闭期间因缺少权限而无法从 AWS Cloud Map 服务注销时，会出现此问题。错误作为 `statusReason` 显示在任务附加中，可以使用 `DescribeTasks` API 进行检索。有关更多信息，请参阅《Amazon Elastic Container Service API 参考》**中的 [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html)。  
停止任务需要以下 AWS Cloud Map 操作：  
+ `servicediscovery:DeregisterInstance`
+ `servicediscovery:GetOperation`
如果对共享命名空间的访问被撤销，则任务可能会保持 `DEACTIVATING` 或 `DEPROVISIONING` 状态，直到命名空间访问恢复。请请求命名空间所有者恢复对命名空间的访问。