Wie verwende ich Amazon ECS Service Discovery mit CloudFormation?

Lesedauer: 5 Minute
0

Ich möchte Amazon Elastic Container Service (Amazon ECS) Service Discovery mit AWS CloudFormation verwenden.

Kurzbeschreibung

Mit der Amazon ECS-Konsole können Sie während der Serviceerstellung Ressourcen zur Serviceerkennung erstellen. Der Ressourcentyp AWS::ECS::Service für CloudFormation ermöglicht es Ihnen jedoch nicht, Service-Discovery-Ressourcen während der Serviceerstellung zu erstellen.

**Hinweis:**Die Amazon ECS-Konsole verwendet die Integrations-APIs CreatePrivateDNSNamespace, CreateService (AWS Cloud Map) und CreateService (Amazon ECS). In CloudFormation können Sie die Ressourcentypen AWS::ServiceDiscovery::PrivateDNSNamespace, AWS::ServiceDiscovery::Service und AWS::ECS::Service verwenden, um eine Integration in einer einzigen CloudFormation-Vorlage zu implementieren.

Behebung

  1. Erstellen Sie im Abschnitt Ressourcen Ihrer CloudFormation-Vorlage einen privaten Service Discovery-Namespace, z. B. example.com. Erstellen Sie den Namespace in einer vorhandenen Amazon Virtual Private Cloud (Amazon VPC). Sehen Sie sich die folgenden JSON- und YAML-Beispiele an:

JSON:

{
  "PrivateNamespace": {
    "Type": "AWS::ServiceDiscovery::PrivateDnsNamespace",
    "Properties": {
      "Name": "example.com",
      "Vpc": "vpc-xxxxxxx"
    }
  }
}

YAML:

PrivateNamespace:
    Type: AWS::ServiceDiscovery::PrivateDnsNamespace
    Properties:
        Name: example.com
        Vpc: vpc-xxxxxxx

**Hinweis:**Ersetzen Sie example.com durch einen Namen für Ihren Namespace. Ersetzen Sie vpc-xxxxxxx durch die ID einer VPC aus Ihrem Konto.

  1. Erstellen Sie einen Service Discovery Service mithilfe der Namespace-ID des Namespaces, den Sie in Schritt 1 erstellt haben.

Sie können den Wert der Namespace-ID mithilfe der intrinsischen Funktion Ref in Ihrer CloudFormation-Vorlage abrufen. Sehen Sie sich die folgenden JSON- und YAML-Beispiele an:

JSON:

{
  "DiscoveryService": {
    "Type": "AWS::ServiceDiscovery::Service",
    "Properties": {
      "Description": "Discovery Service for the Demo Application",
      "DnsConfig": {
        "RoutingPolicy": "MULTIVALUE",
        "DnsRecords": [
          {
            "TTL": 60,
            "Type": "A"
          },
          {
            "TTL": 60,
            "Type": "SRV"
          }
        ]
      },
      "HealthCheckCustomConfig": {
        "FailureThreshold": 1
      },
      "Name": "example-service-name",
      "NamespaceId": {
        "Ref": "PrivateNamespace"
      }
    }
  }
}

YAML:

DiscoveryService:
  Type: AWS::ServiceDiscovery::Service
  Properties:
    Description: Discovery Service for the Demo Application
    DnsConfig:
      RoutingPolicy: MULTIVALUE
      DnsRecords:
        - TTL: 60
          Type: A
        - TTL: 60
          Type: SRV
    HealthCheckCustomConfig:
      FailureThreshold: 1
    Name: example-service-name
    NamespaceId: !Ref PrivateNamespace

**Hinweis:**Ersetzen Sie example-service-name durch den Namen Ihres Dienstes.

Die Eigenschaft DnsConfig gibt die DNS-Einträge an, die automatisch in Amazon Route 53 erstellt werden. Diese DNS-Einträge werden erstellt, wenn Ihre Amazon ECS-Aufgabe beim Service Discovery Service registriert wird. DNS-Einträge vom Typ A und SRV werden unterstützt. Weitere Informationen finden Sie unter Konfiguration Ihres Dienstes für die Verwendung von Service Discovery.

**Tipp:**Es hat sich bewährt, die Eigenschaft HealthCheckCustomConfig zu verwenden, damit Amazon ECS den Zustand der Aufgabe an Service Discovery melden kann. Amazon ECS verwendet Informationen aus Container-Checks, Integritätsprüfungen und dem Aufgabenstatus, um den Status von Service Discovery mit AWS Cloud Map zu aktualisieren.

  1. Erstellen Sie einen Amazon ECS-Service, der in den Service Discovery-Namespace und Service integriert ist, den Sie in den vorherigen Schritten erstellt haben. Verwenden Sie die ServiceRegistries-Eigenschaft in der Ressource AWS:ECS::Service, um Ihre Integration zu spezifizieren. Sehen Sie sich die folgenden JSON- und YAML-Beispiele an:

JSON:

{
  "EcsService": {
    "Type": "AWS::ECS::Service",
    "Properties": {
      "Cluster": "awsExampleCluster",
      "DesiredCount": 4,
      "LaunchType": "FARGATE",
      "NetworkConfiguration": {
        "AwsvpcConfiguration": {
          "SecurityGroups": [
            "sg-xxxxxxx"
          ],
          "Subnets": [
            "subnet-xxxxxxx"
          ]
        }
      },
      "ServiceName": "awsExampleService",
      "TaskDefinition": "awsExampleTaskDefinition",
      "ServiceRegistries": [
        {
          "RegistryArn": {
            "Fn::GetAtt": [
              "DiscoveryService",
              "Arn"
            ]
          },
          "Port": 80
        }
      ]
    }
  }
}

YAML:

EcsService:
  Type: AWS::ECS::Service
  Properties:
    Cluster: awsExampleCluster
    DesiredCount: 4
    LaunchType: FARGATE
    NetworkConfiguration:
      AwsvpcConfiguration:
        SecurityGroups:
          - sg-xxxxxxx
        Subnets:
          - subnet-xxxxxxx
    ServiceName: awsExampleService
    TaskDefinition: awsExampleTaskDefinition
    ServiceRegistries:
      - RegistryArn: !GetAtt DiscoveryService.Arn
        Port: 80

**Hinweis:**Ersetzen Sie AWSExampleCluster durch Ihren Cluster. Ersetzen Sie AWSExampleService durch Ihren Service. Ersetzen Sie AWSExampleTaskDefinition durch Ihre Aufgabendefinition. Ersetzen Sie sg-xxxxxxx durch Ihre Sicherheitsgruppen-ID. Ersetzen Sie subnet-xxxxxxx durch Ihre Subnetz-ID.

Verwenden Sie für RegistryArn den Amazon Resource Name (ARN) des Service Discovery Service, den Sie in Ihren Amazon ECS-Service integrieren möchten. Verwenden Sie die intrinsische Funktion Fn::getAtt, um diesen Wert aus Ihrer CloudFormation-Vorlage abzurufen.

Wenn Sie den awsvpc-Modus verwenden, setzen Sie den Wert entweder auf Port oder auf eine Kombination aus ContainerPort und ContainerName (wie in der Aufgabendefinition angegeben). Wenn Sie den Host- oder Bridge-Modus verwenden, setzen Sie den Wert auf ContainerPort oder ContainerName (wie in der Aufgabendefinition angegeben).

  1. Öffnen Sie die CloudFormation-Konsole und wählen Sie dann Stack erstellen, um die Ressourcen auf der Grundlage Ihrer aktualisierten Vorlage bereitzustellen.

  2. Führen Sie die folgenden Befehle aus, um zu überprüfen, ob Ihre Aufgaben von Ihrer VPC aus gelöst werden können:

$ dig awsExampleService.awsExampleNamespace. +short
$ dig srv awsExampleService.awsExampleNamespace. +short
$ curl awsExampleService.awsExampleNamespace. -I

**Hinweis:**Der Wert von AWSExampleService ist der Name Ihrer AWS::ECS::Service-Ressource. Der Wert von AWSExampleNameSpace ist der Name Ihrer AWS::ServiceDiscovery::PrivateDNSNamespace-Ressource.

Die Befehle geben eine Ausgabe zurück, die der folgenden ähnelt:

Für $ dig awsExampleService.awsExampleNamespace. +short:

172.31.182.0
172.31.160.124
172.31.137.81
172.31.149.244

Für $ dig srv awsExampleService.awsExampleNamespace. +short:

1 1 80 ffe95d27ea8d4f7aba0dfed87297fc5a.awsExampleService.awsExampleNamespace.
1 1 80 44a17fa781974a93bb563bc1826a8697.awsExampleService.awsExampleNamespace.
1 1 80 d640ecb3d283421bb2d1318caf4b0d66.awsExampleService.awsExampleNamespace.
1 1 80 65aff6fff33144b2ad79d283ab52cfe9.awsExampleService.awsExampleNamespace.

Für $ curl awsExampleService.awsExampleNamespace. -I:

HTTP/1.1 200 OK
Server: nginx/1.15.12
Date: Wed, 15 May 2019 02:25:19 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 16 Apr 2019 13:08:19 GMT
Connection: keep-alive
ETag: "5cb5d3c3-264"
Accept-Ranges: bytes

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren