Wie verwende ich Amazon ECS Service Discovery mit CloudFormation?
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
- 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.
- 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.
- 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).
-
Öffnen Sie die CloudFormation-Konsole und wählen Sie dann Stack erstellen, um die Ressourcen auf der Grundlage Ihrer aktualisierten Vorlage bereitzustellen.
-
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
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 8 Monaten
- AWS OFFICIALAktualisiert vor einem Jahr