

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

# 了解如何将 AWS Cloud Map 服务发现与 DNS 查询和 API 调用配合使用 AWS CLI
<a name="tutorial-private-namespace-cli"></a>

本教程演示如何使用 AWS Command Line Interface (CLI) 使用 AWS Cloud Map 服务发现。您将创建一个包含两个后端服务的微服务架构，一个可使用 DNS 查询发现，另一个只能使用 API 发现。 AWS Cloud Map 

有关包含 AWS Cloud Map 控制台步骤的教程，请参阅[了解如何在 DNS 查询和 API 调用中使用 AWS Cloud Map 服务发现](tutorial-private-namespace.md)。

## 先决条件
<a name="prerequisites-private-namespace-cli"></a>

要成功完成本教程，必须满足以下先决条件。
+ 在开始之前，请完成 [设置为使用 AWS Cloud Map](setting-up-cloud-map.md) 中的步骤。
+ 如果您尚未安装 AWS Command Line Interface，请按照[安装或更新最新版本中的](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)步骤 AWS CLI进行安装。

  本教程需要命令行终端或 Shell 来运行命令。在 Linux 和 macOS 中，可使用您首选的 Shell 和程序包管理器。
**注意**  
在 Windows 中，操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令（例如 `zip`）。[安装 Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install)，获取 Ubuntu 和 Bash 与 Windows 集成的版本。
+ 本教程要求使用带有 `dig` DNS 查找实用程序命令的本地环境。

## 创建 AWS Cloud Map 命名空间
<a name="create-an-aws-cloud-map-private-namespace-cli"></a>

首先，您将创建一个公共 AWS Cloud Map 命名空间。 AWS Cloud Map 将创建同名的 Route 53 托管区域，允许通过 DNS 记录和 API 调用进行服务发现。

1. 创建公有 DNS 命名空间：

   ```
   aws servicediscovery create-public-dns-namespace \
       --name cloudmap-tutorial.com \
       --creator-request-id cloudmap-tutorial-request-1 \
       --region us-east-2
   ```

   该命令返回一个操作 ID，你可以用它来检查命名空间的创建状态：

   ```
   {
       "OperationId": "gv4g5meo7ndmeh4fqskygvk23d2fijwa-k9xmplyzd"
   }
   ```

1. 检查操作状态以确认命名空间已成功创建：

   ```
   aws servicediscovery get-operation \
       --operation-id gv4g5meo7ndmeh4fqskygvk23d2fijwa-k9xmplyzd \
       --region us-east-2
   ```

1. 操作成功后，获取命名空间 ID：

   ```
   aws servicediscovery list-namespaces \
       --region us-east-2 \
       --query "Namespaces[?Name=='cloudmap-tutorial.com'].Id" \
       --output text
   ```

   此命令返回命名空间 ID，后续步骤需要使用它：

   ```
   ns-abcd1234xmplefgh
   ```

## 创建 AWS Cloud Map 服务
<a name="create-the-aws-cloud-map-services-private-namespace-cli"></a>

现在，在你的命名空间中创建两个服务。第一项服务可以同时使用 DNS 和 API 调用发现，而第二项服务只能使用 API 调用发现。

1. 创建第一个启用 DNS 发现的服务：

   ```
   aws servicediscovery create-service \
       --name public-service \
       --namespace-id ns-abcd1234xmplefgh \
       --dns-config "RoutingPolicy=MULTIVALUE,DnsRecords=[{Type=A,TTL=300}]" \
       --region us-east-2
   ```

   该命令返回有关已创建服务的详细信息：

   ```
   {
       "Service": {
           "Id": "srv-abcd1234xmplefgh",
           "Arn": "arn:aws:servicediscovery:us-east-2:123456789012:service/srv-abcd1234xmplefgh",
           "Name": "public-service",
           "NamespaceId": "ns-abcd1234xmplefgh",
           "DnsConfig": {
               "NamespaceId": "ns-abcd1234xmplefgh",
               "RoutingPolicy": "MULTIVALUE",
               "DnsRecords": [
                   {
                       "Type": "A",
                       "TTL": 300
                   }
               ]
           },
           "CreateDate": 1673613600.000,
           "CreatorRequestId": "public-service-request"
       }
   }
   ```

1. 使用仅限 API 的发现功能创建第二个服务：

   ```
   aws servicediscovery create-service \
       --name backend-service \
       --namespace-id ns-abcd1234xmplefgh \
       --type HTTP \
       --region us-east-2
   ```

   该命令返回有关已创建服务的详细信息：

   ```
   {
       "Service": {
           "Id": "srv-ijkl5678xmplmnop",
           "Arn": "arn:aws:servicediscovery:us-east-2:123456789012:service/srv-ijkl5678xmplmnop",
           "Name": "backend-service",
           "NamespaceId": "ns-abcd1234xmplefgh",
           "Type": "HTTP",
           "CreateDate": 1673613600.000,
           "CreatorRequestId": "backend-service-request"
       }
   }
   ```

## 注册 AWS Cloud Map 服务实例
<a name="register-the-aws-cloud-map-service-instances-private-namespace-cli"></a>

接下来，为您的每项服务注册服务实例。这些实例代表将要发现的实际资源。

1. 使用 DNS 发现的地 IPv4 址注册第一个实例：

   ```
   aws servicediscovery register-instance \
       --service-id srv-abcd1234xmplefgh \
       --instance-id first \
       --attributes AWS_INSTANCE_IPV4=192.168.2.1 \
       --region us-east-2
   ```

   该命令返回一个操作 ID：

   ```
   {
       "OperationId": "4yejorelbukcjzpnr6tlmrghsjwpngf4-k9xmplyzd"
   }
   ```

1. 检查操作状态以确认实例已成功注册：

   ```
   aws servicediscovery get-operation \
       --operation-id 4yejorelbukcjzpnr6tlmrghsjwpngf4-k9xmplyzd \
       --region us-east-2
   ```

1. 使用自定义属性注册第二个实例，以便发现 API：

   ```
   aws servicediscovery register-instance \
       --service-id srv-ijkl5678xmplmnop \
       --instance-id second \
       --attributes service-name=backend \
       --region us-east-2
   ```

   该命令返回一个操作 ID：

   ```
   {
       "OperationId": "7zxcvbnmasdfghjklqwertyuiop1234-k9xmplyzd"
   }
   ```

1. 检查操作状态以确认实例已成功注册：

   ```
   aws servicediscovery get-operation \
       --operation-id 7zxcvbnmasdfghjklqwertyuiop1234-k9xmplyzd \
       --region us-east-2
   ```

## 发现 AWS Cloud Map 服务实例
<a name="discover-the-aws-cloud-map-service-instances-private-namespace-cli"></a>

现在，您已经创建并注册了服务实例，您可以使用 DNS 查询和 AWS Cloud Map API 发现服务实例，从而验证它们是否正常运行。

1. 首先，获取 Route 53 托管区域 ID：

   ```
   aws route53 list-hosted-zones-by-name \
       --dns-name cloudmap-tutorial.com \
       --query "HostedZones[0].Id" \
       --output text
   ```

   这将返回托管区域 ID：

   ```
   /hostedzone/Z1234ABCDXMPLEFGH
   ```

1. 获取您的托管区域的域名服务器：

   ```
   aws route53 get-hosted-zone \
       --id Z1234ABCDXMPLEFGH \
       --query "DelegationSet.NameServers[0]" \
       --output text
   ```

   这将返回其中一个域名服务器：

   ```
   ns-1234.awsdns-12.org
   ```

1. 使用`dig`命令查询公共服务的 DNS 记录：

   ```
   dig @ns-1234.awsdns-12.org public-service.cloudmap-tutorial.com
   ```

   输出应显示您与服务关联 IPv4 的地址：

   ```
   ;; ANSWER SECTION:
   public-service.cloudmap-tutorial.com. 300 IN A	192.168.2.1
   ```

1. 使用 AWS CLI 来发现后端服务实例：

   ```
   aws servicediscovery discover-instances \
       --namespace-name cloudmap-tutorial.com \
       --service-name backend-service \
       --region us-east-2
   ```

   输出显示您与该服务关联的属性：

   ```
   {
       "Instances": [
           {
               "InstanceId": "second",
               "NamespaceName": "cloudmap-tutorial.com",
               "ServiceName": "backend-service",
               "HealthStatus": "UNKNOWN",
               "Attributes": {
                   "service-name": "backend"
               }
           }
       ],
       "InstancesRevision": 71462688285136850
   }
   ```

## 清理资源
<a name="clean-up-the-resources-private-namespace-cli"></a>

完成本教程后，请清理资源以免产生费用。 AWS Cloud Map 要求你按相反的顺序清理它们：首先是服务实例，然后是服务，最后是命名空间。

1. 取消注册第一个服务实例：

   ```
   aws servicediscovery deregister-instance \
       --service-id srv-abcd1234xmplefgh \
       --instance-id first \
       --region us-east-2
   ```

1. 取消注册第二个服务实例：

   ```
   aws servicediscovery deregister-instance \
       --service-id srv-ijkl5678xmplmnop \
       --instance-id second \
       --region us-east-2
   ```

1. 删除公共服务：

   ```
   aws servicediscovery delete-service \
       --id srv-abcd1234xmplefgh \
       --region us-east-2
   ```

1. 删除后端服务：

   ```
   aws servicediscovery delete-service \
       --id srv-ijkl5678xmplmnop \
       --region us-east-2
   ```

1. 删除命名空间：

   ```
   aws servicediscovery delete-namespace \
       --id ns-abcd1234xmplefgh \
       --region us-east-2
   ```

1. 验证 Route 53 托管区域是否已删除：

   ```
   aws route53 list-hosted-zones-by-name \
       --dns-name cloudmap-tutorial.com
   ```