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

Date de la dernière mise à jour : 23/09/2021

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

Brève description

La console Amazon ECS vous permet de créer des ressources de découverte de service pendant la création d'un service. Cependant, le type de ressource AWS::ECS::Service pour AWS CloudFormation ne vous permet pas de créer des ressources de découverte de service lors de la création du service.

Remarque : la console Amazon ECS utilise les API d'intégration CreatePrivateDnsNamespace, CreateService (AWS Cloud Map) et CreateService (Amazon ECS). Dans 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 CloudFormation.

Solution

1.    Dans la section Ressources de votre modèle CloudFormation, créez un espace de noms de découverte de service privé, tel que exemple.com. Créez l'espace de noms 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 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 example-service-name par le nom de votre service.

La propriété DnsConfig spécifie les enregistrements DNS qui sont automatiquement créés dans Amazon Route 53. Ces enregistrements DNS sont créés lorsque votre tâche Amazon ECS est enregistrée auprès du service de découverte de service. 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.    Créez un Amazon ECS service qui s'intègre à l'espace de noms de découverte de service et au service que vous avez créés au cours des étapes précédentes. Utilisez la propriété ServiceRegistries de la ressource AWS:ECS።Service pour spécifier votre intégration. 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. Remplacez awsExampleService par votre service. Remplacez awsExampleTaskDefinition par votre définition de tâche. Remplacez sg-xxxxxxx par votre ID de groupe de sécurité. Remplacez subnet-xxxxxxx par votre ID de sous-réseau.

Pour la propriété RegistryArn, réglez la valeur au 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 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 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 ?


Besoin d'aide pour une question technique ou de facturation ?