如何使用 AWS Cloud Map 為 ECS 服務設定跨帳戶服務探索?

4 分的閱讀內容
0

我想使用 AWS Cloud Map 為我的 Amazon Elastic Container Service (Amazon ECS) 服務設定跨帳戶服務探索。

簡短描述

在 AWS Cloud Map 中建立私有命名空間,也會建立 Amazon Route 53 託管區域。由於 Route 53 託管區域與 Amazon Virtual Private Cloud (Amazon VPC) 相關聯,您可以探索 DNS 記錄。所以,其他 AWS 帳戶和 Amazon VPC 無法透過 DNS 探索 Amazon ECS 服務。

先決條件:

  • 兩個 Amazon VPC 位於相同或不同帳戶中,其中包含必要的子網路、安全群組和非重疊的 CIDR。
  • 兩個 Amazon VPC 都使用 AmazonProvidedDNS,並已啟用 enableDnsHostnamesenableDnsSupport 屬性。
  • 一個 Amazon ECS 叢集。
  • 已安裝 AWS Command Line Interface (AWS CLI) 的最新版本,並已設定適當的權限。

**注意:**如果您在執行 AWS CLI 時收到錯誤訊息,請確認您執行的是最新版本的 AWS CLI

解決方法

**重要事項:**以下步驟使用目標 Amazon VPC、來源 Amazon VPC 和 Amazon ECS 叢集的範例。在 AWS CLI 中,以您的值取代 example (範例) 值。

  • 範例 Amazon ECS 叢集 example-cluster 位於 AWS 帳戶 1 中。
  • 範例目標 Amazon VPC example-target-vpc 託管 Amazon ECS 任務,位於 AWS 帳戶 1 中。
  • 範例來源 Amazon VPC example-source-vpc 執行 DNS 查詢,位於 AWS 帳戶 2 中。

建立命名空間和 AWS Cloud Map 服務

1.    使用帳戶 1 的憑證設定您的 AWS CLI。

2.    在帳戶 1 中建立私有 AWS Cloud Map 服務探索命名空間:

$ aws servicediscovery create-private-dns-namespace --name example-namespace  --vpc example-target-vpc

**注意:**前述命令會建立名稱為 example-namespace 的命名空間,並以 JSON 格式傳回 OperationID 作為輸出。

3.    使用 OperationID 來檢查命名空間和命名空間 ID 的狀態:

$ aws servicediscovery get-operation --operation-id <example-OperationId> --query 'Operation.{Status: Status, NamespaceID: Targets.NAMESPACE}'

4.    尋找與該命名空間相關連的託管區域 ID:

$ aws servicediscovery get-namespace --id <example-NamespaceID> --query 'Namespace.Properties.DnsProperties.{HoztedZoneId: HostedZoneId}'

5.    使用該命名空間 ID 建立 AWS Cloud Map 服務:

$ aws servicediscovery create-service \
    --name myservice \
    --namespace-id  <example-NamespaceID> \
    --dns-config "NamespaceId=<example-NamespaceID>,RoutingPolicy=MULTIVALUE,DnsRecords=[{Type=A,TTL=60}]"

**注意:**前述命令會建立名稱為 example-myservice 的 AWS Cloud Map 服務,並傳回服務 ARN 作為輸出。

註冊使用 awsvpc 網路模式的任務定義

註冊與 AWS Fargate 相容的任務定義,並使用 awsvpc 網路模式:

1.    使用下列任務定義內容建立名稱為 fargate-task.json 的檔案:

{
    "family": "tutorial-task-def",
        "networkMode": "awsvpc",
        "containerDefinitions": [
            {
                "name": "sample-app",
                "image": "httpd:2.4",
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp"
                    }
                ],
                "essential": true,
                "entryPoint": [
                    "sh",
                    "-c"
                ],
                "command": [
                    "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
                ]
            }
        ],
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "256",
        "memory": "512"
}

2.    使用 fargate-task.json 檔案來註冊任務定義:

$ aws ecs register-task-definition --cli-input-json file://fargate-task.json

建議一個 Amazon ECS 服務

1.    建立名稱為 ecs-service-discovery.json, 的檔案,並包含您正在建立的 Amazon ECS 服務的內容:

  • launchType 指定為 FARGATE
  • platformVersion 指定為最新版本。
  • 請確認 securityGroupssubnets 參數屬於 example-target-vpc。您可以從 Amazon VPC 主控台取得安全群組 ID 和子網路 ID。

**注意:**因為該任務定義使用 awsvpc 網路模式,所以需要 awsvpcConfiguration

範例 JSON 檔案:

{
    "cluster": "example-cluster",
    "serviceName": "ecs-service-discovery",
    "taskDefinition": "tutorial-task-def",
    "serviceRegistries": [
       {
          "registryArn": "<Cloudmap service ARN>"
       }
    ],
    "launchType": "FARGATE",
    "platformVersion": "example-latest-version",
    "networkConfiguration": {
       "awsvpcConfiguration": {
          "assignPublicIp": "ENABLED",
          "securityGroups": [ "example-target-vpc-sg" ],
          "subnets": [ "example-target-vpc-subnet" ]
       }
    },
    "desiredCount": 1
}

2.    使用 ecs-service-discovery.json 檔案來建立您的 Amazon ECS 服務:

$ aws ecs create-service --cli-input-json file://ecs-service-discovery.json

3.    確認服務任務是否已在 AWS Cloud Map 服務中註冊為執行個體:

$ aws servicediscovery list-instances --service-id <example-cloud-map-service-id>

**注意:**您的 Amazon ECS 服務現在可在 example-target-vpc 中找到。

將來源 Amazon VPC 與 Route 53 託管區域產生關聯

1.    如果 Amazon VPC 位於不同帳戶,請向帳戶 2 提交 Amazon VPC 關聯授權請求:

$ aws route53 create-vpc-association-authorization --hosted-zone-id <example-HoztedZoneId>  --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

2.    使用帳戶 2 的憑證設定 awscli,並將帳戶 2 中的 example-source-vpc 與帳戶 1 的託管區域產生關聯:

$ aws route53 associate-vpc-with-hosted-zone --hosted-zone-id <example-HoztedZoneId> --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

3.    檢查 example-source-vpc 是否已新增至託管區域:

aws route53 get-hosted-zone --id <example-HoztedZoneId> --query 'VPCs'

4.    檢查是否可在 example-source-vpc中透過 DNS 找到 Amazon ECS 服務。使用 example-source-vpc從 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體查詢 DNS:

$ dig +short example-service.example-namespace

**注意:**在前述命令中,example-service.example-namespace 是 DNS 名稱。請將其替換為您的 AWS Cloud Map 服務和命名空間。

設定 Amazon VPC 對等互連

1.    使用 Amazon VPC 對等互連 連結 example-target-vpcexample-source-vpc

2.    更新路由表

3.    更新安全群組

**注意:**在您使用路由表和安全群組設定 Amazon VPC 對等互連後,example-source-vpc 中的資源可以連線至 example-target-vpc 中的 Amazon ECS 任務。

如果您在設定 Amazon VPC 對等互連時遇到問題,請參閱以下的 AWS 知識中心文章:

AWS 官方
AWS 官方已更新 1 年前