¿Cómo utilizo AWS Cloud Map para configurar la detección de servicios entre cuentas para los servicios de ECS?

6 minutos de lectura
0

Quiero usar AWS Cloud Map para configurar la detección de servicios entre cuentas para mis servicios de Amazon Elastic Container Service (Amazon ECS).

Descripción breve

Al crear un espacio de nombres privado en AWS Cloud Map, también se crea una zona alojada de Amazon Route 53. Como la zona alojada de Route 53 está asociada a una Amazon Virtual Private Cloud (Amazon VPC), se pueden detectar los registros DNS. Por lo tanto, otras cuentas de AWS y Amazon VPC no pueden detectar el servicio Amazon ECS a través del DNS.

Prerrequisitos:

  • Dos VPC de Amazon en la misma cuenta o en cuentas diferentes con las subredes, los grupos de seguridad y el CIDR no superpuesto necesarios.
  • Ambas VPC de Amazon utilizan AmazonProvidedDNS, con los atributos enableDNSHostNames y EnableDNSSupport activados.
  • Un clúster de Amazon ECS.
  • Se instaló y configuró la versión más reciente de la Interfaz de la línea de comandos de AWS (AWS CLI) con los permisos adecuados.

Nota: Si recibe errores al ejecutar AWS CLI, confirme que está ejecutando una versión reciente de AWS CLI.

Resolución

Importante: Los siguientes pasos utilizan ejemplos para la Amazon VPC de destino, la Amazon VPC de origen y el clúster de Amazon ECS. En AWS CLI, sustituya los valores de ejemplo por sus valores.

  • El ejemplo de clúster de Amazon ECS example-cluster está en la cuenta 1 de AWS.
  • El ejemplo de Amazon VPC de destino example-target-vpc aloja la tarea de Amazon ECS y se encuentra en la cuenta 1 de AWS.
  • El ejemplo de Amazon VPC de origen example-source-vpc realiza la consulta de DNS y se encuentra en la cuenta 2 de AWS.

Cree un espacio de nombres y un servicio de AWS Cloud Map

1.    Configure AWS CLI con las credenciales de la cuenta 1.

2.    Cree un espacio de nombres de detección de servicios de AWS Cloud Map privado en la cuenta 1:

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

Nota: El comando anterior crea un espacio de nombres con el nombre example-namespace y devuelve OperationID como resultado en JSON.

3.    Utilice el ID de operación para comprobar el estado del espacio de nombres y el ID del espacio de nombres:

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

4.    Busque el ID de la zona alojada que está asociado al espacio de nombres:

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

5.    Utilice el ID del espacio de nombres para crear un servicio de 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}]"

Nota: El comando anterior crea un servicio de AWS Cloud Map con el nombre example-myservice y devuelve un ARN de servicio como resultado.

Registrar una definición de tarea que utilice el modo de red awsvpc

Registre una definición de tarea que sea compatible con AWS Fargate y utilice el modo de red awsvpc:

1.    Cree un archivo denominado fargate-task.json con el siguiente contenido de definición de tareas:

{
    "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.    Utilice el archivo fargate-task.json para registrar la definición de la tarea:

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

Crear un servicio de Amazon ECS

1.    Cree un archivo denominado ecs-service-discovery.json e incluya el contenido del servicio de Amazon ECS que está creando:

  • Especifique launchType como FARGATE.
  • Especifique platformVersion como la versión más reciente.
  • Asegúrese de que los parámetros securityGroups y subnets pertenezcan al example-target-vpc. Puede obtener los ID de subred y grupo de seguridad desde la consola de Amazon VPC.

Nota: Como la definición de la tarea utiliza el modo de red awsvpc, se requiere una awsvpcConfiguration.

Archivo JSON de ejemplo:

{
    "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.    Utilice el archivo ecs-service-discovery.json para crear su servicio de Amazon ECS:

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

3.    Confirme si la tarea de servicio está registrada como una instancia en el servicio de AWS Cloud Map:

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

Nota: Su servicio de Amazon ECS ahora puede detectarse en example-target-vpc.

Asocie la Amazon VPC de origen a la zona alojada de Route 53

1.    Si las VPC de Amazon están en cuentas diferentes, envíe una solicitud de autorización de asociación de Amazon VPC a la cuenta 2:

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

2.    Configure awscli con las credenciales de la cuenta 2 y asocie el example-source-vpc de la cuenta 2 a la zona alojada de la cuenta 1:

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

3.    Compruebe si el example-source-vpc está agregado a la zona alojada:

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

4.    Compruebe que el servicio de Amazon ECS se pueda detectar a través del DNS en example-source-vpc. Consulte el DNS de una instancia de Amazon Elastic Compute Cloud (Amazon EC2) con example-source-vpc:

$ dig +short example-service.example-namespace

Nota: En el comando anterior, ** example-service.example-namespace** es el nombre DNS. Sustitúyalo por su servicio de AWS Cloud Map y su espacio de nombres.

Configurar el emparejamiento de Amazon VPC

1.    Utilice el emparejamiento de Amazon VPC para conectar example-target-vpc con example-source-vpc.

2.    Actualice las tablas de enrutamiento.

3.    Actualice los grupos de seguridad.

Nota: Tras configurar el emparejamiento de Amazon VPC con las tablas de enrutamiento y los grupos de seguridad, los recursos de example-source-vpc pueden conectarse a las tareas de Amazon ECS en example-target-vpc.

Si tiene problemas al configurar el emparejamiento de Amazon VPC, consulte los siguientes artículos del Centro de conocimientos de AWS:

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año