Como uso o AWS Cloud Map para configurar a descoberta de serviços entre contas para serviços do ECS?

6 minuto de leitura
0

Quero usar o AWS Cloud Map para configurar a descoberta de serviços entre contas para meus serviços do Amazon Elastic Container Service (Amazon ECS).

Breve descrição

A criação de um namespace privado no AWS Cloud Map também cria uma zona hospedada do Amazon Route 53. Como a zona hospedada do Route 53 está associada a uma Amazon Virtual Private Cloud (Amazon VPC), os registros DNS podem ser descobertos. Portanto, outras contas da AWS e Amazon VPCs não conseguem descobrir o serviço do Amazon ECS por meio do DNS.

Pré-requisitos:

  • Duas Amazon VPCs na mesma conta ou em contas diferentes com as sub-redes e os grupos de segurança necessários e CIDR sem sobreposição.
  • As duas Amazon VPCs usam o AmazonProvidedDNS, com os atributos enableDnsHostnames e enableDnsSupport ativados.
  • Um cluster do Amazon ECS.
  • A versão mais recente da AWS Command Line Interface (AWS CLI) instalada e configurada com as permissões apropriadas.

Observação: Se você receber erros ao executar a AWS CLI, confirme que está executando uma versão recente da AWS CLI.

Resolução

Importante: As etapas a seguir usam exemplos para a Amazon VPC de destino, a Amazon VPC de origem e o cluster do Amazon ECS. Na AWS CLI, substitua os valores de exemplo pelos seus valores.

  • O exemplo de cluster do Amazon ECS example-cluster está na conta 1 da AWS.
  • O destino de exemplo da Amazon VPC example-target-vpc hospeda a tarefa do Amazon ECS e está na conta 1 da AWS.
  • A origem de exemplo da Amazon VPC example-source-vpc executa a consulta ao DNS e está na conta 2 da AWS.

Criar um namespace e um serviço do AWS Cloud Map

1.    Configure sua AWS CLI com as credenciais da conta 1.

2.    Crie um namespace privado de descoberta de serviços do AWS Cloud Map na conta 1:

$ aws servicediscovery create-private-dns-namespace --name example-namespace  --vpc example-target-vpc

Observação: O comando anterior cria um namespace com o nome example-namespace e retorna OperationID como saída em JSON.

3.    Use OperationID para verificar o status do namespace e da ID do namespace:

$ aws servicediscovery get-operation --operation-id <example-OperationId> --query 'Operation.{Status: Status, NamespaceID: Targets.NAMESPACE}'

4.     Localize a ID da zona hospedada que está associada ao namespace:

$ aws servicediscovery get-namespace --id <example-NamespaceID> --query 'Namespace.Properties.DnsProperties.{HoztedZoneId: HostedZoneId}'

5.    Use a ID do namespace para criar um serviço do AWS Cloud Map:

$ aws servicediscovery create-service \
    --name myservice \
    --namespace-id  <example-NamespaceID> \
    --dns-config "NamespaceId=<example-NamespaceID>,RoutingPolicy=MULTIVALUE,DnsRecords=[{Type=A,TTL=60}]"

Observação: O comando anterior cria um serviço do AWS Cloud Map com o nome example-myservice e retorna um ARN de serviço como saída.

Registrar uma definição de tarefa que usa o modo de rede awsvpc

Registre uma definição de tarefa compatível com o AWS Fargate e use o modo de rede awsvpc:

1.    Crie um arquivo chamado fargate-task.json com o seguinte conteúdo de definição de tarefa:

{
    "family": "tutorial-task-def",
        "networkMode": "awsvpc",
        "containerDefinitions": [
            {
                "name": "sample-app",
                "image": "httpd:2.4",
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp"
                    }
                ],
                "essential": true,
                "entryPoint": [
                    "sh",
                    "-c"
                ],
                "command": [
                    "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
                ]
            }
        ],
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "256",
        "memory": "512"
}

2.    Use o arquivo fargate-task.json para registrar a definição da tarefa:

$ aws ecs register-task-definition --cli-input-json file://fargate-task.json

Criar um serviço do Amazon ECS

1.    Crie um arquivo chamado ecs-service-discovery.json e inclua o conteúdo do serviço do Amazon ECS que você está criando:

  • Especifique launchType como FARGATE.
  • Especifique platformVersion como a versão mais recente.
  • Certifique-se de que os parâmetros securityGroups e subnets pertençam a example-target-vpc. Você pode obter as IDs do grupo de segurança e da sub-rede no console da Amazon VPC.

Observação: Como a definição da tarefa usa o modo de rede awsvpc, um awsvpcConfiguration é necessário.

Exemplo de arquivo JSON:

{
    "cluster": "example-cluster",
    "serviceName": "ecs-service-discovery",
    "taskDefinition": "tutorial-task-def",
    "serviceRegistries": [
       {
          "registryArn": "<Cloudmap service ARN>"
       }
    ],
    "launchType": "FARGATE",
    "platformVersion": "example-latest-version",
    "networkConfiguration": {
       "awsvpcConfiguration": {
          "assignPublicIp": "ENABLED",
          "securityGroups": [ "example-target-vpc-sg" ],
          "subnets": [ "example-target-vpc-subnet" ]
       }
    },
    "desiredCount": 1
}

2.    Use o arquivo ecs-service-discovery.json para criar seu serviço do Amazon ECS:

$ aws ecs create-service --cli-input-json file://ecs-service-discovery.json

3.    Confirme se a tarefa de serviço está registrada como uma instância no serviço do AWS Cloud Map:

$ aws servicediscovery list-instances --service-id <example-cloud-map-service-id>

Observação: Seu serviço do Amazon ECS agora pode ser descoberto em example-target-vpc.

Associar a Amazon VPC de origem à zona hospedada do Route 53

1.    Se as Amazon VPCs estiverem em contas diferentes, envie uma solicitação de autorização de associação da Amazon VPC para a conta 2:

$ aws route53 create-vpc-association-authorization --hosted-zone-id <example-HoztedZoneId>  --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

2.    Configure awscli com as credenciais da conta 2 e associe example-source-vpc na conta 2 à zona hospedada na conta 1:

$ aws route53 associate-vpc-with-hosted-zone --hosted-zone-id <example-HoztedZoneId> --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

3.    Verifique se example-source-vpc foi adicionado à zona hospedada:

aws route53 get-hosted-zone --id <example-HoztedZoneId> --query 'VPCs'

4.    Verifique se o serviço do Amazon ECS pode ser descoberto por meio do DNS em example-source-vpc. Consulte o DNS de uma instância do Amazon Elastic Compute Cloud (Amazon EC2) com example-source-vpc:

$ dig +short example-service.example-namespace

Observação: No comando anterior, example-service.example-namespace é o nome do DNS. Substitua-o pelo seu serviço e namespace do AWS Cloud Map.

Configurar o emparelhamento da Amazon VPC 

1.    Use o emparelhamento da Amazon VPC para conectar example-target-vpc com example-source-vpc.

2.    Atualize as tabelas de rotas.

3.    Atualize os grupos de segurança.

Observação: Depois que você configura o emparelhamento da Amazon VPC com as tabelas de rotas e os grupos de segurança, os recursos em example-source-vpc podem se conectar às tarefas do Amazon ECS em example-target-vpc.

Se você tiver problemas ao configurar o emparelhamento da Amazon VPC, consulte os seguintes artigos do Centro de Conhecimentos da AWS:

AWS OFICIAL
AWS OFICIALAtualizada há um ano