Como uso a descoberta de serviço do Amazon ECS com o CloudFormation?

5 minuto de leitura
0

Quero usar a descoberta de serviço do Amazon Elastic Container Service (Amazon ECS) com o AWS CloudFormation.

Breve descrição

O console do Amazon ECS permite que você crie recursos de descoberta de serviços durante a criação do serviço. No entanto, o tipo de recurso AWS::ECS::Service para o CloudFormation não permite que você crie recursos de descoberta de serviços durante a criação do serviço.

Observação: o console do Amazon ECS usa as APIs de integração CreatePrivateDnsNamespace, CreateService (AWS Cloud Map) e CreateService (Amazon ECS). No CloudFormation, você pode usar os tipos de recursos AWS::ServiceDiscovery::PrivateDnsNamespace, AWS::ServiceDiscovery::Service e AWS::ECS::Service para implementar uma integração em um único modelo do CloudFormation.

Resolução

1.Na seção Recursos do seu modelo do CloudFormation, crie um namespace privado de descoberta de serviços, como example.com. Crie o namespace em uma Amazon Virtual Private Cloud (Amazon VPC) existente. Veja os exemplos de JSON e YAML a seguir.

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

Observação: substitua example.com por um nome para seu namespace. Substitua vpc-xxxxxxx pela ID de uma VPC da sua conta.

2.Crie um serviço de descoberta de serviços usando a ID do namespace que você criou na Etapa 1.

Você pode obter o valor da ID do namespace usando a função intrínseca Ref em seu modelo do CloudFormation. Veja os exemplos de JSON e YAML a seguir.

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

Observação: Substitua example-service-name pelo nome do seu serviço.

A propriedade DNSConfig especifica os registros DNS que são criados automaticamente no Amazon Route 53. Esses registros DNS são criados quando sua tarefa do Amazon ECS é registrada no serviço de descoberta de serviços. Os registros DNS do tipo A e SRV são compatíveis. Para obter mais informações, consulte Configuração do seu serviço para usar a Descoberta de serviços.

Dica: é uma prática recomendada usar a propriedade HealthCheckCustomConfig para permitir que o Amazon ECS reporte a integridade da tarefa à descoberta de serviços. O Amazon ECS usa informações de verificações de contêineres, verificações de integridade e estado da tarefa para atualizar a integridade da descoberta de serviços com o AWS Cloud Map.

3.Crie um serviço do Amazon ECS que se integre ao namespace e ao serviço de descoberta de serviços que você criou nas etapas anteriores. Use a propriedade ServiceRegistries no recurso AWS:ECS::Service para especificar sua integração. Veja os exemplos de JSON e YAML a seguir.

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

Observação: substitua awsExampleCluster pelo seu cluster. Substitua awsExampleService pelo seu serviço. Substitua awsExampleTaskDefinition pela sua definição de tarefa. Substitua sg-xxxxxxx pela ID do seu grupo de segurança. Substitua subnet-xxxxxxx pela ID da sua sub-rede.

Para RegistryArn, use o nome do recurso da Amazon (ARN) do serviço de descoberta de serviços que você deseja integrar ao seu serviço Amazon ECS. Use a função intrínseca Fn::GetAtt para obter esse valor do seu modelo do CloudFormation.

Se você usar o modo awsvpc, defina o valor como Port ou uma combinação de ContainerPort e ContainerName (conforme especificado na definição da tarefa). Se você usar o modo host ou bridge, defina o valor como ContainerPort ou ContainerName (conforme especificado na definição da tarefa).

4.Abra o console do CloudFormation e selecione Criar pilha para implantar os recursos com base em seu modelo atualizado.

5.Para verificar se suas tarefas podem ser resolvidas em sua VPC, execute os comandos a seguir:

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

Observação: o valor do awsExampleService é o nome do seu recurso AWS::ECS::Service. O valor de awsExampleNamespace é o nome do seu recurso AWS::ServiceDiscovery::PrivateDnsNamespace.

Os comandos retornam uma saída semelhante à seguinte:

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

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos