本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
了解如何将 AWS Cloud Map 服务发现与 DNS 查询和 API 调用配合使用 AWS CLI
本教程演示如何使用 AWS Command Line Interface (CLI) 使用 AWS Cloud Map 服务发现。您将创建一个包含两个后端服务的微服务架构,一个可使用 DNS 查询发现,另一个只能使用 API 发现。 AWS Cloud Map
有关包含 AWS Cloud Map 控制台步骤的教程,请参阅了解如何在 DNS 查询和 API 调用中使用 AWS Cloud Map 服务发现。
先决条件
要成功完成本教程,必须满足以下先决条件。
-
在开始之前,请完成 设置为使用 AWS Cloud Map 中的步骤。
-
如果您尚未安装 AWS Command Line Interface,请按照安装或更新最新版本中的步骤 AWS CLI进行安装。
本教程需要命令行终端或 Shell 来运行命令。在 Linux 和 macOS 中,可使用您首选的 Shell 和程序包管理器。
注意
在 Windows 中,操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令(例如
zip
)。安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。 本教程要求使用带有
dig
DNS 查找实用程序命令的本地环境。
创建 AWS Cloud Map 命名空间
首先,您将创建一个公共 AWS Cloud Map 命名空间。 AWS Cloud Map 将创建同名的 Route 53 托管区域,允许通过 DNS 记录和 API 调用进行服务发现。
-
创建公有 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" }
-
检查操作状态以确认命名空间已成功创建:
aws servicediscovery get-operation \ --operation-id gv4g5meo7ndmeh4fqskygvk23d2fijwa-k9xmplyzd \ --region us-east-2
-
操作成功后,获取命名空间 ID:
aws servicediscovery list-namespaces \ --region us-east-2 \ --query "Namespaces[?Name=='cloudmap-tutorial.com'].Id" \ --output text
此命令返回命名空间 ID,后续步骤需要使用它:
ns-abcd1234xmplefgh
创建 AWS Cloud Map 服务
现在,在你的命名空间中创建两个服务。第一项服务可以同时使用 DNS 和 API 调用发现,而第二项服务只能使用 API 调用发现。
-
创建第一个启用 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" } }
-
使用仅限 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 服务实例
接下来,为您的每项服务注册服务实例。这些实例代表将要发现的实际资源。
-
使用 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" }
-
检查操作状态以确认实例已成功注册:
aws servicediscovery get-operation \ --operation-id 4yejorelbukcjzpnr6tlmrghsjwpngf4-k9xmplyzd \ --region us-east-2
-
使用自定义属性注册第二个实例,以便发现 API:
aws servicediscovery register-instance \ --service-id srv-ijkl5678xmplmnop \ --instance-id second \ --attributes service-name=backend \ --region us-east-2
该命令返回一个操作 ID:
{ "OperationId": "7zxcvbnmasdfghjklqwertyuiop1234-k9xmplyzd" }
-
检查操作状态以确认实例已成功注册:
aws servicediscovery get-operation \ --operation-id 7zxcvbnmasdfghjklqwertyuiop1234-k9xmplyzd \ --region us-east-2
发现 AWS Cloud Map 服务实例
现在,您已经创建并注册了服务实例,您可以使用 DNS 查询和 AWS Cloud Map API 发现服务实例,从而验证它们是否正常运行。
-
首先,获取 Route 53 托管区域 ID:
aws route53 list-hosted-zones-by-name \ --dns-name cloudmap-tutorial.com \ --query "HostedZones[0].Id" \ --output text
这将返回托管区域 ID:
/hostedzone/Z1234ABCDXMPLEFGH
-
获取您的托管区域的域名服务器:
aws route53 get-hosted-zone \ --id Z1234ABCDXMPLEFGH \ --query "DelegationSet.NameServers[0]" \ --output text
这将返回其中一个域名服务器:
ns-1234.awsdns-12.org
-
使用
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
-
使用 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 }
清理资源
完成本教程后,请清理资源以免产生费用。 AWS Cloud Map 要求你按相反的顺序清理它们:首先是服务实例,然后是服务,最后是命名空间。
-
取消注册第一个服务实例:
aws servicediscovery deregister-instance \ --service-id srv-abcd1234xmplefgh \ --instance-id first \ --region us-east-2
-
取消注册第二个服务实例:
aws servicediscovery deregister-instance \ --service-id srv-ijkl5678xmplmnop \ --instance-id second \ --region us-east-2
-
删除公共服务:
aws servicediscovery delete-service \ --id srv-abcd1234xmplefgh \ --region us-east-2
-
删除后端服务:
aws servicediscovery delete-service \ --id srv-ijkl5678xmplmnop \ --region us-east-2
-
删除命名空间:
aws servicediscovery delete-namespace \ --id ns-abcd1234xmplefgh \ --region us-east-2
-
验证 Route 53 托管区域是否已删除:
aws route53 list-hosted-zones-by-name \ --dns-name cloudmap-tutorial.com