¿Cómo usar la detección de servicios de Amazon ECS con CloudFormation?

5 minutos de lectura
0

Quiero usar la detección de servicios de Amazon Elastic Container Service (Amazon ECS) con AWS CloudFormation.

Breve descripción

La consola de Amazon ECS permite crear recursos de detección de servicios durante la creación del servicio. Sin embargo, el tipo de recurso AWS::ECS::Service para CloudFormation no le permite crear recursos de detección de servicios durante la creación del servicio.

**Nota:**La consola de Amazon ECS usa las API de integración CreatePrivateDNSNamespace, CreateService (AWS Cloud Map) y CreateService (Amazon ECS). En CloudFormation, puede usar los tipos de recursos AWS::ServiceDiscovery::PrivateDnsNamespace, AWS::ServiceDiscovery::Service y AWS::ECS::Service para implementar una integración en una única plantilla de CloudFormation.

Resolución

1.    En la sección Recursos de la plantilla de CloudFormation, cree un espacio de nombres de detección de servicios privado, tal como example.com. Cree el espacio de nombres en una Amazon Virtual Private Cloud (Amazon VPC) existente. Consulte los siguientes ejemplos de JSON y YAML.

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

Nota: Sustituya example.com por un nombre en su espacio de nombres. Sustituya vpc-xxxxxx por el identificador de una VPC de su cuenta.

2.    Cree un servicio de detección de servicios con el identificador del espacio de nombres que creó en el paso 1.

Puede obtener el valor del identificador del espacio de nombres mediante la función intrínseca Ref de su plantilla de CloudFormation. Consulte los siguientes ejemplos de JSON y YAML.

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

Nota: Sustituya example-service-name por el nombre de su servicio.

La propiedad DNSConfig especifica los registros DNS que se crean automáticamente en Amazon Route 53. Estos registros DNS se crean cuando la tarea de Amazon ECS se registra en el servicio de detección de servicios. Se admiten registros DNS de tipo A y SRV. Para obtener más información, consulte Configuración del servicio para usar Service Discovery.

Consejo: Se recomienda usar la propiedad HealthCheckCustomConfig para permitir que Amazon ECS informe del estado de las tareas a Service Discovery. Amazon ECS usa la información de las comprobaciones de contenedores, las comprobaciones de estado y el estado de las tareas para actualizar el estado de la detección de servicios con AWS Cloud Map.

3.    Cree un servicio de Amazon ECS que se integre con el espacio de nombres de detección de servicios y el servicio que creó en los pasos anteriores. Use la propiedad ServiceRegistries del recurso AWS:ECS::Service para especificar la integración. Consulte los siguientes ejemplos de JSON y YAML.

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

Nota: Sustituya awsExampleCluster por su clúster. Sustituya awsExampleService por su servicio. Sustituya awsExampleTaskDefinition por su definición de tarea. Sustituya sg-xxxxxx por el identificador de su grupo de seguridad. Sustituya subnet-xxxxxx por su identificador de subred.

Para RegistryArn, use el nombre de recurso de Amazon (ARN) del servicio de detección de servicios que desee integrar con su servicio Amazon ECS. Use la función intrínseca Fn::getATT para obtener este valor de su plantilla de CloudFormation.

Si usa el modo awsvpc, defina el valor en Port o en una combinación de ContainerPort y ContainerName (tal y como se especifica en la definición de la tarea). Si usa el modo host o bridge, defina el valor en ContainerPort o ContainerName (tal y como se especifica en la definición de la tarea).

4.    Abra la consola de CloudFormation y, a continuación, elija Crear pila para implementar los recursos en función de la plantilla actualizada.

5.    Para comprobar que las tareas se pueden resolver desde la VPC, ejecute los siguientes comandos:

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

Nota: El valor de AWSexampleService es el nombre del recurso AWS::ECS::Service. El valor de AWSExampleNamespace es el nombre del recurso AWS::ServiceDiscovery::PrivateDnsNamespace.

Los comandos devuelven un resultado similar al siguiente:

Para $ dig awsExampleService.awsExampleNamespace. +short:

172.31.182.0
172.31.160.124
172.31.137.81
172.31.149.244

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

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

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años