Comment utiliser la découverte de service Amazon ECS avec AWS CloudFormation ?

Date de la dernière mise à jour : 08/04/2020

Je veux utiliser la découverte de service Amazon Elastic Container (Amazon ECS) avec AWS CloudFormation.

Brève description

Contrairement à la console Amazon ECS, le type de ressource AWS::ECS::Service pour AWS CloudFormation ne crée pas de ressources de découverte de service lors de la création du service. Il diffère de la console Amazon ECS qui permet de créer des ressources de découverte de service pendant la création d'un service.

Remarque : la console Amazon ECS utilise les API d'intégration CreatePrivateDnsNamespace, CreateService (AWS Cloud Map) et CreateService (Amazon ECS). Dans AWS CloudFormation, vous pouvez utiliser les types de ressources AWS::ServiceDiscovery::PrivateDnsNamespace, AWS::ServiceDiscovery::Service et AWS::ECS::Service pour mettre en œuvre une intégration dans un seul modèle AWS CloudFormation.

Résolution

1.    Dans votre modèle AWS CloudFormation, dans la section Ressources, créez un espace de noms de découverte de service privé (par exemple, exemple.com) dans un Amazon Virtual Private Cloud (Amazon VPC) existant. Consultez les exemples JSON et YAML suivants.

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

Remarque : Remplacez exemple.com par un nom pour votre espace de noms. Remplacez vpc xxxxxxx par l'ID d'un VPC de votre compte.

2.    Créez un service de découverte de service à l'aide de l'ID de l'espace de noms que vous avez créé à l'étape 1.

Vous pouvez obtenir la valeur de l'ID de l'espace de noms en utilisant la fonction intrinsèque Ref dans votre modèle AWS CloudFormation. Consultez les exemples JSON et YAML suivants.

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

Remarque : remplacez exemple-nom-service par le nom de votre service.

La propriété DnsConfig spécifie les enregistrements DNS qui sont créés automatiquement dans Amazon Route 53 lorsque votre tâche Amazon ECS est enregistrée dans le service de découverte de service.

Remarque : Les enregistrements DNS de types A et SRV sont pris en charge.

Conseil : Une bonne pratique consiste à utiliser la propriété HealthCheckCustomConfig pour permettre à Amazon ECS d'indiquer l'état de la tâche à la découverte de service. Amazon ECS utilise les informations des vérifications de conteneur, des vérifications d'état et d'état de la tâche pour mettre à jour l'état de la découverte de service avec AWS Cloud Map.

3.    Pour créer un service Amazon ECS qui s'intègre à l'espace de noms de découverte de service et au service que vous avez créés dans les étapes précédentes, spécifiez l'intégration en utilisant la propriété ServiceRegistries dans la ressource AWS:ECS::Service. Consultez les exemples JSON et YAML suivants.

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

Remarque : remplacez awsExampleCluster par votre cluster, awsExampleService par votre service, awsExampleTaskDefinition par votre définition de tâche, sg-xxxxxxx par l’ID de votre groupe de sécurité et subnet-xxxxxxx par l’ID de votre sous-réseau.

Pour la propriété RegistryArn, affectez-lui le nom Amazon Resource Name (ARN) du service de découverte de service à intégrer dans votre Amazon ECS service. Utilisez la fonction intrinsèque Fn::GetAtt pour obtenir cette valeur de votre modèle AWS CloudFormation.

Si vous utilisez le mode awsvpc, définissez la valeur sur Port ou une combinaison ContainerPort et ContainerName (tel que spécifié dans la définition de tâche). Si vous utilisez le mode host ou bridge, définissez la valeur sur ContainerPort ou ContainerName (tel que spécifié dans la définition de tâche).

4.    Ouvrez la console AWS CloudFormation, puis choisissez Créer une pile pour déployer les ressources en fonction de votre modèle mis à jour.

5.    Pour vérifier que vos tâches peuvent être résolues depuis votre VPC, exécutez les commandes suivantes :

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

Remarque : La valeur d’awsExampleService est le nom de votre ressource AWS::ECS::Service. La valeur d’awsExampleNamespace est le nom de votre ressource AWS::ServiceDiscovery::PrivateDnsNamespace .

Les commandes renvoient une sortie similaire à celle-ci :

Pour $ dig awsExampleService.awsExampleNamespace. +short :

172.31.182.0
172.31.160.124
172.31.137.81
172.31.149.244

Pour $ 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.

Pour $ 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

Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?