

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 了解如何使用 搭配 DNS 查詢和 API 呼叫使用 AWS Cloud Map 服務探索 AWS CLI
<a name="tutorial-private-namespace-cli"></a>

本教學課程示範如何使用 AWS Command Line Interface (CLI) 來使用 AWS Cloud Map 服務探索。您將建立具有兩個後端服務的微服務架構 – 一個可使用 DNS 查詢探索，另一個可使用 AWS Cloud Map API 探索。

如需包含 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，請依照[安裝或更新最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)中的步驟進行安裝。

  本教學課程需使用命令列終端機或 Shell 來執行命令。在 Linux 和 macOS 中，使用您偏好的 Shell 和套件管理工具。
**注意**  
在 Windows 中，作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 `zip`)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本，請[安裝適用於 Linux 的 Windows 子系統](https://learn.microsoft.com/en-us/windows/wsl/install)。
+ 本教學課程需要具有 `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，您需要此 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
   ```