建立使用 Service Discovery 的 Amazon ECS 服務 - Amazon Elastic Container Service

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

建立使用 Service Discovery 的 Amazon ECS 服務

了解如何建立服務,其中包含搭配 使用服務探索的 Fargate 任務 AWS CLI。

如需 AWS 區域 支援服務探索的清單,請參閱 使用服務探索將 Amazon ECS 服務與 DNS 名稱連線

如需支援 Fargate 的區域的資訊,請參閱支援 AWS Fargate 上 Amazon ECS 的區域

注意

您可以使用雙堆疊服務端點,透過 IPv4 和 IPv6 AWS CLI從 、 SDKs 和 Amazon ECS API 與 Amazon ECS 互動。如需詳細資訊,請參閱使用 Amazon ECS 雙堆疊端點

先決條件

在您開始教學課程之前,請務必先達成以下先決條件:

步驟 1:在 中建立服務探索資源 AWS Cloud Map

請依照下列步驟建立服務探索命名空間和服務探索服務。

  1. 建立私有雲端資源服務探索命名空間。此範例會建立名為 tutorial 的命名空間。將 vpc-abcd1234 替換為您現有其中一個 VPC 的識別碼。

    aws servicediscovery create-private-dns-namespace \ --name tutorial \ --vpc vpc-abcd1234

    以下是此命令的輸出:

    {
        "OperationId": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e"
    }
  2. 使用上一步輸出的 OperationId,驗證私有命名空間是否已成功建立。請記下命名空間 ID,因為您在後續命令中使用它。

    aws servicediscovery get-operation \ --operation-id h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e

    輸出如下。

    {
        "Operation": {
            "Id": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e",
            "Type": "CREATE_NAMESPACE",
            "Status": "SUCCESS",
            "CreateDate": 1519777852.502,
            "UpdateDate": 1519777856.086,
            "Targets": {
               "NAMESPACE": "ns-uejictsjen2i4eeg"
            }
        }
    }
  3. 使用上一步輸出中的 NAMESPACE ID,建立服務探索服務。此範例會建立名為 myapplication 的服務。請記下服務 ID 和 ARN,因為您在後續命令中使用它們。

    aws servicediscovery create-service \ --name myapplication \ --dns-config "NamespaceId="ns-uejictsjen2i4eeg",DnsRecords=[{Type="A",TTL="300"}]" \ --health-check-custom-config FailureThreshold=1

    輸出如下。

    {
        "Service": {
           "Id": "srv-utcrh6wavdkggqtk",
            "Arn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk",
            "Name": "myapplication",
            "DnsConfig": {
                "NamespaceId": "ns-uejictsjen2i4eeg",
                "DnsRecords": [
                    {
                        "Type": "A",
                        "TTL": 300
                    }
                ]
            },
            "HealthCheckCustomConfig": {
                "FailureThreshold": 1
            },
            "CreatorRequestId": "e49a8797-b735-481b-a657-b74d1d6734eb"
        }
    }

步驟 2:建立 Amazon ECS 資源

請依照下列步驟建立您的 Amazon ECS 叢集、任務定義和服務。

  1. 建立 Amazon ECS 叢集 此範例會建立名稱為 tutorial 的叢集。

    aws ecs create-cluster \ --cluster-name tutorial
  2. 註冊與 Fargate 相容的任務定義,並使用 awsvpc 網路模式。請遵循下列步驟:

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

      { "family": "tutorial-task-def", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "sample-app", "image": "public.ecr.aws/docker/library/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
  3. 依照下列步驟建立 ECS 服務:

    1. 使用您要建立的 ECS 服務的內容,建立名為 ecs-service-discovery.json 的檔案。此範例使用上個步驟中建立的任務定義。需要 awsvpcConfiguration,因為任務定義範例使用 awsvpc 網路模式。

      當您建立 ECS 服務時,指定 Fargate 啟動類型以及 LATEST 支援服務探索的平台版本。在 AWS Cloud Map 中建立服務探索服務時,registryArn 是傳回的 ARN。securityGroupssubnets 必須屬於用來建立 Cloud Map 命名空間的 VPC。您可以從 Amazon VPC 主控台取得安全群組和子網路識別碼。

      { "cluster": "tutorial", "serviceName": "ecs-service-discovery", "taskDefinition": "tutorial-task-def", "serviceRegistries": [ { "registryArn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk" } ], "launchType": "FARGATE", "platformVersion": "LATEST", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-abcd1234" ], "subnets": [ "subnet-abcd1234" ] } }, "desiredCount": 1 }
    2. 使用 ecs-service-discovery.json 建立您的 ECS 服務。

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

步驟 3:在 中驗證服務探索 AWS Cloud Map

您可以查詢服務探索資訊,以確認一切都已正確建立。設定服務探索之後,您可以使用 AWS Cloud Map API 操作,或從 VPC dig 中的執行個體呼叫 。請遵循下列步驟:

  1. 使用服務探索的服務 ID,來列出服務探索執行個體。請記下執行個體 ID (以粗體標示) 以進行資源清理。

    aws servicediscovery list-instances \ --service-id srv-utcrh6wavdkggqtk

    輸出如下。

    {
        "Instances": [
            {
                "Id": "16becc26-8558-4af1-9fbd-f81be062a266",
                "Attributes": {
                    "AWS_INSTANCE_IPV4": "172.31.87.2"
                    "AWS_INSTANCE_PORT": "80", 
                    "AVAILABILITY_ZONE": "us-east-1a", 
                    "REGION": "us-east-1", 
                    "ECS_SERVICE_NAME": "ecs-service-discovery", 
                    "ECS_CLUSTER_NAME": "tutorial", 
                    "ECS_TASK_DEFINITION_FAMILY": "tutorial-task-def"
                }
            }
        ]
    }
  2. 使用服務探索命名空間、服務和其他參數如 ECS 叢集名稱,來查詢服務探索執行個體的詳細資訊。

    aws servicediscovery discover-instances \ --namespace-name tutorial \ --service-name myapplication \ --query-parameters ECS_CLUSTER_NAME=tutorial
  3. 在 Route 53 託管區域為服務探索服務建立的 DNS 記錄,可使用以下 AWS CLI 命令查詢:

    1. 使用命名空間 ID 取得命名空間的相關資訊,其中包括 Route 53 託管區域 ID。

      aws servicediscovery \ get-namespace --id ns-uejictsjen2i4eeg

      輸出如下。

      {
          "Namespace": {
              "Id": "ns-uejictsjen2i4eeg",
              "Arn": "arn:aws:servicediscovery:region:aws_account_id:namespace/ns-uejictsjen2i4eeg",
              "Name": "tutorial",
              "Type": "DNS_PRIVATE",
              "Properties": {
                   "DnsProperties": {
                      "HostedZoneId": "Z35JQ4ZFDRYPLV"
                  }
              },
              "CreateDate": 1519777852.502,
              "CreatorRequestId": "9049a1d5-25e4-4115-8625-96dbda9a6093"
          }
      }
    2. 使用上一步中的 Route 53 託管區域 ID (請參閱粗體文字),取得託管區域的資源紀錄集。

      aws route53 list-resource-record-sets \ --hosted-zone-id Z35JQ4ZFDRYPLV
  4. 您還可以使用 dig 從您的 VPC 內的執行個體查詢 DNS。

    dig +short myapplication.tutorial

步驟 4:清理

當您完成此教學課程時,清除相關聯的資源以避免未使用的資源產生費用。請遵循下列步驟:

  1. 使用您之前提到的服務 ID 和執行個體 ID,取消註冊服務探索服務執行個體。

    aws servicediscovery deregister-instance \ --service-id srv-utcrh6wavdkggqtk \ --instance-id 16becc26-8558-4af1-9fbd-f81be062a266

    輸出如下。

    {
        "OperationId": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv"
    }
  2. 使用來自上一步輸出的 OperationId,請驗證已成功取消註冊服務探索服務。

    aws servicediscovery get-operation \ --operation-id xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv
    {
      "Operation": {
            "Id": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv",
            "Type": "DEREGISTER_INSTANCE",
            "Status": "SUCCESS",
            "CreateDate": 1525984073.707,
            "UpdateDate": 1525984076.426,
            "Targets": {
                "INSTANCE": "16becc26-8558-4af1-9fbd-f81be062a266",
                "ROUTE_53_CHANGE_ID": "C5NSRG1J4I1FH",
                "SERVICE": "srv-utcrh6wavdkggqtk"
            }
        }
    }    
  3. 使用服務 ID 刪除服務探索服務。

    aws servicediscovery delete-service \ --id srv-utcrh6wavdkggqtk
  4. 使用命名空間 ID 刪除服務探索命名空間 。

    aws servicediscovery delete-namespace \ --id ns-uejictsjen2i4eeg

    輸出如下。

    {
        "OperationId": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj"
    }
  5. 使用上一步輸出的 OperationId,確認服務探索命名空間已成功刪除。

    aws servicediscovery get-operation \ --operation-id c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj

    輸出如下。

    {
        "Operation": {
            "Id": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj",
            "Type": "DELETE_NAMESPACE",
            "Status": "SUCCESS",
            "CreateDate": 1525984602.211,
            "UpdateDate": 1525984602.558,
            "Targets": {
                "NAMESPACE": "ns-rymlehshst7hhukh",
                "ROUTE_53_CHANGE_ID": "CJP2A2M86XW3O"
            }
        }
    }
  6. 將 Amazon ECS 服務所需的計數更新為 0。您必須執行此操作,才能在後續步驟中刪除服務。

    aws ecs update-service \ --cluster tutorial \ --service ecs-service-discovery \ --desired-count 0
  7. 刪除 Amazon ECS 服務:

    aws ecs delete-service \ --cluster tutorial \ --service ecs-service-discovery
  8. 刪除 Amazon ECS 叢集:

    aws ecs delete-cluster \ --cluster tutorial