Wie verwende ich AWS Cloud Map, um kontoübergreifende Service Discovery für ECS-Services einzurichten?

Lesedauer: 5 Minute
0

Ich möchte AWS Cloud Map verwenden, um kontoübergreifende Service-Discovery für meine Amazon Elastic Container Service (Amazon ECS) -Services einzurichten.

Kurze Beschreibung

Durch die Erstellung eines privaten Namespaces in AWS Cloud Map wird auch eine gehostete Amazon Route 53-Zone erstellt. Da die Route 53-Hostzone mit einer Amazon Virtual Private Cloud (Amazon VPC) verknüpft ist, sind DNS-Einträge auffindbar. Daher können andere AWS-Konten und Amazon VPCs den Amazon ECS-Service nicht über DNS erkennen.

Voraussetzungen:

  • Zwei Amazon-VPCs in denselben oder unterschiedlichen Konten mit den erforderlichen Subnetzen, Sicherheitsgruppen und sich nicht überschneidendem CIDR.
  • Beide Amazon-VPCs verwenden AmazonProvidedDNS, wobei die Attribute enableDNSHostNames und enableDNSSupport aktiviert sind.
  • Ein Amazon ECS-Cluster.
  • Die neueste Version der AWS-Befehlszeilenschnittstelle (AWS CLI) wurde mit den entsprechenden Berechtigungen installiert und konfiguriert.

**Hinweis:**Wenn Sie beim Ausführen von AWS CLI Fehler erhalten, vergewissern Sie sich, dass Sie eine aktuelle Version der AWS-CLI ausführen.

Auflösung

**Wichtig:**In den folgenden Schritten werden Beispiele für die Amazon Ziel-VPC, die Amazon Quell-VPC und den Amazon ECS-Cluster verwendet. Ersetzen Sie in der AWS-CLI die Beispiel-Werte durch Ihre Werte.

  • Der Beispiel-Cluster für einen Amazon ECS-Cluster befindet sich in AWS-Konto 1.
  • Das Beispielziel Amazon VPC example-target-vpc hostet die Amazon ECS-Aufgabe und befindet sich in AWS-Konto 1.
  • Die Beispielquelle Amazon VPC example-source-vpc führt die DNS-Abfrage durch und befindet sich in AWS-Konto 2.

Einen Namespace und einen AWS Cloud Map-Service erstellen

1.Konfigurieren Sie Ihre AWS-CLI mit den Anmeldeinformationen von Konto 1.

2.Erstellen Sie einen privaten AWS Cloud Map Service Discovery-Namespace in Konto 1:

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

**Hinweis:**Der vorherige Befehl erstellt einen Namespace mit dem Namen example-namespace und gibt OperationID als Ausgabe in JSON zurück.

3.Verwenden Sie die OperationID, um den Status des Namespaces und der Namespace-ID zu überprüfen:

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

4.Suchen Sie die Hosting-Zonen-ID, die dem Namespace zugeordnet ist:

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

5.Verwenden Sie die Namespace-ID, um einen AWS Cloud Map-Service zu erstellen:

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

**Hinweis:**Der vorherige Befehl erstellt einen AWS Cloud Map-Service mit dem Namen example-myservice und gibt einen Service-ARN als Ausgabe zurück.

Registrieren Sie eine Aufgabendefinition, die den awsvpc-Netzwerkmodus verwendet.

Registrieren Sie eine Aufgabendefinition, die mit AWS Fargate kompatibel ist und den awsvpc-Netzwerkmodus verwendet:

1.Erstellen Sie eine Datei mit dem Namen fargate-task.json mit dem folgenden Inhalt der 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.Verwenden Sie die Datei fargate-task.json, um die Aufgabendefinition zu registrieren:

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

Erstellen Sie einen Amazon ECS-Service

1.Erstellen Sie eine Datei mit dem Namen ecs-service-discovery.json und fügen Sie den Inhalt des Amazon ECS-Service hinzu, den Sie erstellen:

  • Geben Sie LaunchType als FARGATE an.
  • Geben Sie PlatformVersion als neueste Version an.
  • Stellen Sie sicher, dass die Parameter SecurityGroups und Subnets zur Datei example-target-vpc gehören. Sie können die Sicherheitsgruppen- und Subnetz-IDs von Ihrer Amazon VPC-Konsole abrufen.

**Hinweis:**Da die Aufgabendefinition den awsvpc-Netzwerkmodus verwendet, ist eine AWSVPC-Konfiguration erforderlich.

Beispiel für eine JSON-Datei:

{
    "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.Verwenden Sie die Datei ecs-service-discovery.json, um Ihren Amazon ECS-Service zu erstellen:

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

3.Bestätigen Sie, ob die Serviceaufgabe als Instanz im AWS Cloud Map-Service registriert ist:

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

**Hinweis:**Ihr Amazon ECS-Service ist jetzt in example-target-vpc auffindbar.

Ordnen Sie die Amazon-Quell-VPC der Route 53-Hostzone zu

  1. Wenn sich die Amazon-VPCs in verschiedenen Konten befinden, reichen Sie eine Autorisierungsanfrage für die Amazon VPC Association an Konto 2 ein:
$ aws route53 create-vpc-association-authorization --hosted-zone-id <example-HoztedZoneId>  --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

2.Konfigurieren Sie awscli mit den Anmeldeinformationen von Konto 2 und verknüpfen Sie die example-source-vpc in Konto 2 mit der gehosteten Zone in Konto 1:

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

3.Prüfen Sie, ob die example-source-vpc zur gehosteten Zone hinzugefügt wurde:

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

4.Stellen Sie sicher, dass der Amazon ECS-Service über DNS in example-source-vpc auffindbar ist. Fragen Sie das DNS von einer Amazon Elastic Compute Cloud (Amazon EC2) -Instance mit example-source-vpc ab:

$ dig +short example-service.example-namespace

**Hinweis:**Im vorherigen Befehl ist example-service.example-namespace der DNS-Name. Ersetzen Sie ihn durch Ihren AWS Cloud Map-Service und Namespace.

Einrichten Amazon VPC-Peering

1.Verwenden Sie Amazon VPC-Peering, um example-target-vpc mit example-source-vpc zu verbinden.

2.Aktualisieren Sie die Routentabellen.

3.Aktualisieren Sie die Sicherheitsgruppen.

**Hinweis:**Nachdem Sie Amazon VPC-Peering mit den Routing-Tabellen und Sicherheitsgruppen eingerichtet haben, können Ressourcen in example-source-vpc eine Verbindung zu Amazon ECS-Aufgaben in example-target-vpc herstellen.

Wenn bei der Einrichtung von Amazon VPC-Peering Probleme auftreten, lesen Sie die folgenden Artikel im AWS Knowledge Center:

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr