Anleitung: Erstellen eines Service unter Verwendung von Service Discovery - Amazon ECS

Anleitung: Erstellen eines Service unter Verwendung von Service Discovery

Service Discovery ist jetzt in den Assistenten zum Erstellen von Services in der Amazon-ECS-Konsole integriert. Weitere Informationen finden Sie unter Erstellen eines Amazon-ECS-Services.

Das folgende Tutorial zeigt, wie mithilfe von AWS CLI ein ECS-Service mit einer Fargate-Aufgabe, die Service Discovery verwendet, erstellt wird.

Eine Liste von AWS-Regionen, welche Service Discovery unterstützen, finden Sie unter Service Discovery.

Weitere Informationen über Regionen, die Fargate unterstützen, finden Sie unter Unterstützte Regionen für Amazon ECS auf AWS Fargate.

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, stellen Sie sicher, dass die folgenden Voraussetzungen erfüllt sind:

Schritt 1: Erstellen der Service-Discovery-Ressourcen in AWS Cloud Map

Führen Sie die folgenden Schritte aus, um Ihren Service-Discovery-Namespace und Service zur Service Discovery zu erstellen:

  1. Erstellen Sie einen privaten Namespace für die Service Discovery der Cloud Map. In diesem Beispiel wird ein Namespace mit dem Namen tutorial erstellt. Ersetzen Sie vpc-abcd1234 mit der ID eines Ihrer vorhandenen VPCs.

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

    Die Ausgabe dieses Befehls sieht wie folgt aus.

    {
        "OperationId": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e"
    }
  2. Überprüfen Sie mithilfe der OperationId aus der Ausgabe des vorherigen Schritts, ob der private Namespace erfolgreich erstellt wurde. Notieren Sie sich die Namespace-ID, da Sie sie in nachfolgenden Befehlen verwenden.

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

    Die Ausgabe sieht wie folgt aus.

    {
        "Operation": {
            "Id": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e",
            "Type": "CREATE_NAMESPACE",
            "Status": "SUCCESS",
            "CreateDate": 1519777852.502,
            "UpdateDate": 1519777856.086,
            "Targets": {
               "NAMESPACE": "ns-uejictsjen2i4eeg"
            }
        }
    }
  3. Erstellen Sie mithilfe der NAMESPACE-ID aus der Ausgabe des vorherigen Schritts einen Service zur Service Discovery. In diesem Beispiel wird ein Service mit dem Namen myapplication erstellt. Notieren Sie sich die Service-ID und den ARN, da Sie sie in nachfolgenden Befehlen verwenden.

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

    Die Ausgabe sieht wie folgt aus.

    {
        "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"
        }
    }

Schritt 2: Erstellen der Amazon ECS-Ressourcen

Führen Sie die folgenden Schritte aus, um Ihren Amazon-ECS-Cluster, die Definition der Aufgabe und den Service zu erstellen:

  1. Erstellen Sie einen Amazon-ECS-Cluster. In diesem Beispiel wird ein Cluster mit dem Namen tutorial erstellt.

    aws ecs create-cluster \ --cluster-name tutorial
  2. Registrieren Sie eine Aufgabendefinition, die mit Fargate kompatibel ist und den awsvpc-Netzwerkmodus verwendet. Dazu gehen Sie wie folgt vor:

    1. Erstellen Sie eine Datei mit dem Namen fargate-task.json mit dem Inhalt der folgenden Aufgabendefinition.

      { "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. Registrieren Sie die Aufgabendefinition mithilfe von fargate-task.json.

      aws ecs register-task-definition \ --cli-input-json file://fargate-task.json
  3. Erstellen Sie einen ECS Service, indem Sie die folgenden Schritte ausführen:

    1. Erstellen Sie eine Datei mit dem Namen ecs-service-discovery.json, die den Inhalt des ECS-Services enthält, den Sie erstellen wollen. Dieses Beispiel verwendet die Aufgabendefinition, die im vorherigen Schritt erstellt wurde. Ein awsvpcConfiguration ist erforderlich, da die Beispiel-Aufgabendefinition den awsvpc-Netzwerkmodus verwendet.

      Wenn Sie den ECS-Service erstellen, geben Sie den Fargate-Starttyp und die LATEST-Plattformversion an, die Service Discovery unterstützt. Wenn der Service zur Service Discovery in AWS Cloud Map erstellt wird, ist registryArn der zurückgegebene ARN. Die securityGroups und subnets muss zu der VPC gehören, die zum Erstellen des Cloud Map-Namespaces verwendet wird. Sie können die Sicherheitsgruppen- und Subnetz-IDs über die VPC-Konsole abrufen.

      { "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. Erstellen Sie Ihren ECS-Service mithilfe von ecs-service-discovery.json.

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

Schritt 3: Überprüfen der Service Discovery in AWS Cloud Map

Sie können überprüfen, ob alles ordnungsgemäß erstellt wurde, indem Sie Ihre Service-Discovery-Informationen abfragen. Nachdem Service Discovery konfiguriert ist, können Sie entweder AWS Cloud Map-API-Operationen verwenden oder dig von einer Instance innerhalb Ihrer VPC aufrufen. Dazu gehen Sie wie folgt vor:

  1. Listen Sie mithilfe der Service-Discovery-Service-ID die Service-Discovery-Instances auf. Notieren Sie sich die Instance-ID (fett markiert) für die Ressourcen-Bereinigung.

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

    Die Ausgabe sieht wie folgt aus.

    {
        "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. Verwenden Sie den Service-Discovery-Namespace, den Service und zusätzliche Parameter wie den ECS-Clusternamen, um Details zu den Service-Discovery-Instances abzufragen.

    aws servicediscovery discover-instances \ --namespace-name tutorial \ --service-name myapplication \ --query-parameters ECS_CLUSTER_NAME=tutorial
  3. Die DNS-Einträge, die in der von Route 53 gehosteten Zone für den Service zur Service Discovery erstellt wurden, können mit den folgenden AWS CLI-Befehlen abgefragt werden:

    1. Rufen Sie mithilfe der Namespace-ID Informationen zum Namespace ab, die die von Route 53 gehostete Zonen-ID enthalten.

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

      Die Ausgabe sieht wie folgt aus.

      {
          "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. Verwenden Sie die ID der gehosteten Route-53-Zone aus dem vorherigen Schritt (siehe fett gedruckten Text), um den Ressourcendatensatz für die gehostete Zone abzurufen.

      aws route53 list-resource-record-sets \ --hosted-zone-id Z35JQ4ZFDRYPLV
  4. Sie können den DNS auch von einer Instance innerhalb Ihrer VPC mit dig abfragen.

    dig +short myapplication.tutorial

Schritt 4: Bereinigen

Wenn Sie mit diesem Tutorial fertig sind, bereinigen Sie die zugeordneten Ressourcen, um Gebühren für ungenutzte Ressourcen zu vermeiden. Dazu gehen Sie wie folgt vor:

  1. Deregistrieren Sie die Service Discovery Service-Instances mithilfe der zuvor notierten Service-ID und Instance-ID.

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

    Die Ausgabe sieht wie folgt aus.

    {
        "OperationId": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv"
    }
  2. Überprüfen Sie mithilfe von OperationId aus der Ausgabe des vorherigen Schritts, ob die Service Discovery-Instances erfolgreich deregistriert wurden.

    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. Löschen Sie den Service zur Service Discovery unter Verwendung der Service-ID.

    aws servicediscovery delete-service \ --id srv-utcrh6wavdkggqtk
  4. Löschen Sie den Service Discovery-Namespace mithilfe der Namespace-ID.

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

    Die Ausgabe sieht wie folgt aus.

    {
        "OperationId": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj"
    }
  5. Überprüfen Sie mithilfe der OperationId aus der vorherigen Ausgabe des vorherigen Schritts, ob der Service-Discovery-Namespace erfolgreich gelöscht wurde.

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

    Die Ausgabe sieht wie folgt aus.

    {
        "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. Aktualisieren Sie die gewünschte Anzahl für den Amazon-ECS-Service auf 0. Sie müssen dies tun, um den Service im nächsten Schritt zu löschen.

    aws ecs update-service \ --cluster tutorial \ --service ecs-service-discovery \ --desired-count 0
  7. Löschen Sie den Amazon-ECS-Service.

    aws ecs delete-service \ --cluster tutorial \ --service ecs-service-discovery
  8. Löschen Sie den Amazon ECS-Cluster.

    aws ecs delete-cluster \ --cluster tutorial