Configuración de Amazon ECS Service Connect con la AWS CLI
Puede crear un servicio de Amazon ECS para una tarea de Fargate que utilice Service Connect a través de la AWS CLI.
Requisitos previos
A continuación, se indican los requisitos previos de Service Connect:
-
Compruebe que la región sea compatible con Service Connect. Para obtener más información, consulte Regions with Service Connect.
-
Compruebe que la última versión de la AWS CLI esté instalada y configurada. Para obtener más información, consulte Instalación o actualización de la versión más reciente de la AWS CLI.
-
Su usuario de AWS dispone de los permisos requeridos que se especifican en la política de IAM AmazonECS_FullAccess de ejemplo.
-
Tiene una VPC, una subred, una tabla de enrutamiento y un grupo de seguridad creados para utilizarlos. Para obtener más información, consulte Creación de una nube virtual privada.
-
Tiene un rol de ejecución de tareas con el nombre
ecsTaskExecutionRole
y la política administradaAmazonECSTaskExecutionRolePolicy
está asociada al rol. Este rol permite a Fargate escribir los registros de aplicaciones de NGINX y los registros de proxy de Service Connect en los registros de Amazon CloudWatch. Para obtener más información, consulte Creación del rol de de ejecución de tareas.
Paso 1: Crear el clúster
Siga los pasos a continuación para crear el clúster y el espacio de nombres de Amazon ECS.
Para crear un clúster de Amazon ECS y espacio de nombres de AWS Cloud Map
-
Cree un clúster de Amazon ECS con el nombre
tutorial
para su utilización. El parámetro--service-connect-defaults
establece el espacio de nombres predeterminado del clúster. En el resultado del ejemplo, no existe un espacio de nombres de AWS Cloud Map con nombreservice-connect
en esta cuenta y Región de AWS, por lo tanto, Amazon ECS crea el espacio de nombres. El espacio de nombres se crea en AWS Cloud Map en la cuenta y es visible con todos los demás espacios de nombres, así que debe usar un nombre que indique el propósito.aws ecs create-cluster --cluster-name
tutorial
--service-connect-defaults namespace=service-connect
Salida:
{ "cluster": { "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial", "clusterName": "tutorial", "serviceConnectDefaults": { "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE" }, "status": "PROVISIONING", "registeredContainerInstancesCount": 0, "runningTasksCount": 0, "pendingTasksCount": 0, "activeServicesCount": 0, "statistics": [], "tags": [], "settings": [ { "name": "containerInsights", "value": "disabled" } ], "capacityProviders": [], "defaultCapacityProviderStrategy": [], "attachments": [ { "id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", "type": "sc", "status": "ATTACHING", "details": [] } ], "attachmentsStatus": "UPDATE_IN_PROGRESS" } } }
-
Compruebe que se haya creado el clúster:
aws ecs describe-clusters --clusters tutorial
Salida:
{ "clusters": [ { "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial", "clusterName": "tutorial", "serviceConnectDefaults": { "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE" }, "status": "ACTIVE", "registeredContainerInstancesCount": 0, "runningTasksCount": 0, "pendingTasksCount": 0, "activeServicesCount": 0, "statistics": [], "tags": [], "settings": [], "capacityProviders": [], "defaultCapacityProviderStrategy": [] } ], "failures": [] }
-
(Opcional) Compruebe que el espacio de nombres se haya creado en AWS Cloud Map. Puede usar la AWS Management Console o la configuración normal de la AWS CLI, ya que esto se crea en AWS Cloud Map.
Por ejemplo, use la AWS CLI:
aws servicediscovery get-namespace --id
ns-EXAMPLE
Salida:
{ "Namespace": { "Id": "ns-EXAMPLE", "Arn": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE", "Name": "service-connect", "Type": "HTTP", "Properties": { "DnsProperties": { "SOA": {} }, "HttpProperties": { "HttpName": "service-connect" } }, "CreateDate": 1661749852.422, "CreatorRequestId": "service-connect" } }
Paso 2: crear el servicio para el servidor
La característica de Service Connect está diseñada para interconectar varias aplicaciones en Amazon ECS. Al menos una de esas aplicaciones debe proporcionar un servicio web al cual conectarse. En este paso, creará:
-
La definición de tarea que utiliza la imagen del contenedor oficial de NGINX sin modificar e incluye la configuración de Service Connect.
-
La definición de servicio de Amazon ECS que configura Service Connect para proporcionar la detección de servicios y el proxy de malla de servicios para el tráfico a este servicio. La configuración reutiliza el espacio de nombres predeterminado de la configuración del clúster para reducir la cantidad de configuración que se realiza para cada servicio.
-
El servicio de Amazon ECS. Ejecuta una tarea mediante la definición de tarea e inserta un contenedor adicional para el proxy de Service Connect. El proxy escucha en el puerto desde la asignación de puertos del contenedor de la definición de la tarea. En una aplicación de cliente que se ejecuta en Amazon ECS, el proxy de la tarea del cliente escucha las conexiones salientes al nombre del puerto de definición de la tarea, el nombre de detección de servicios o el nombre de alias del cliente de servicio y el número de puerto del alias de cliente.
Para crear el servicio web con Service Connect
-
Registre una definición de tarea que sea compatible con Fargate y utilice el
awsvpc
en modo de red. Siga estos pasos:-
Cree un archivo denominado
service-connect-nginx.json
con los contenidos de la siguiente definición de tareas.Esta definición de tarea configura Service Connect al agregar los parámetros
name
yappProtocol
a la asignación de puertos. El nombre del puerto hace que este sea más identificable en la configuración del servicio cuando se utilizan varios puertos. El nombre del puerto también se usa de forma predeterminada como nombre detectable para que lo usen otras aplicaciones en el espacio de nombres.La definición de la tarea contiene el rol de IAM de la tarea porque el servicio tiene habilitado ECS Exec.
importante
Esta definición de tarea usa una
logConfiguration
para enviar la salida de nginx desdestdout
ystderr
hacia los registros de Amazon CloudWatch. Este rol de ejecución de tareas no tiene los permisos adicionales necesarios para crear el grupo de registro de registros de CloudWatch. Cree el grupo de registro de registros de CloudWatch mediante la AWS Management Console o la AWS CLI. Si no desea enviar los registros de nginx a registros de CloudWatch, puede eliminar lalogConfiguration
.Sustituya el ID de la Cuenta de AWS en el rol de ejecución de la tarea por el ID de su Cuenta de AWS.
{ "family": "service-connect-nginx", "executionRoleArn": "arn:aws:iam::
123456789012
:role/ecsTaskExecutionRole", "taskRoleArn": "arn:aws:iam::123456789012
:role/ecsTaskRole", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "webserver", "image": "public.ecr.aws/docker/library/nginx:latest", "cpu": 100, "portMappings": [ { "name": "nginx", "containerPort": 80, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/service-connect-nginx", "awslogs-region": "region
", "awslogs-stream-prefix": "nginx" } } } ], "cpu": "256", "memory": "512" } -
Registre la definición de tareas mediante el archivo
service-connect-nginx.json
:aws ecs register-task-definition --cli-input-json file://service-connect-nginx.json
-
-
Cree un servicio:
-
Cree un archivo llamado
service-connect-nginx-service.json
con el contenido del servicio de Amazon ECS que va a crear. En este ejemplo se utiliza la definición de tareas creada en el paso anterior. Es necesario unawsvpcConfiguration
porque el ejemplo de definición de tareas utiliza el modo de redawsvpc
.Cuando cree el servicio de ECS, especifique el tipo de lanzamiento de Fargate y la versión
LATEST
de la plataforma que admite Service Connect. LossecurityGroups
y lassubnets
deben pertenecer a una VPC que cumpla los requisitos de uso de Amazon ECS. Puede obtener los ID de subred y grupos de seguridad en la consola de Amazon VPC.Este servicio configura Service Connect al agregar el parámetro
serviceConnectConfiguration
. El espacio de nombres no es obligatorio porque el clúster tiene configurado un espacio de nombres predeterminado. Las aplicaciones de cliente que se ejecutan en ECS en el espacio de nombres se conectan a este servicio medianteportName
y el puerto declientAliases
. Por ejemplo, se puede acceder a este servicio conhttp://nginx:80/
, ya que nginx proporciona una página de bienvenida en la ubicación raíz/
. Las aplicaciones externas que no se ejecutan en Amazon ECS o que no están en el mismo espacio de nombres pueden acceder a esta aplicación a través del proxy de Service Connect mediante la dirección IP de la tarea y el número de puerto de la definición de la tarea. Para su configuración detls
, agregue el certificadoarn
para suawsPcaAuthorityArn
sukmsKey
, yroleArn
de su rol de IAM.Este servicio utiliza una
logConfiguration
para enviar la salida del proxy de Service Connect desdestdout
ystderr
hacia los registros de Amazon CloudWatch. Este rol de ejecución de tareas no tiene los permisos adicionales necesarios para crear el grupo de registro de registros de CloudWatch. Cree el grupo de registro de registros de CloudWatch mediante la AWS Management Console o la AWS CLI. Le recomendamos que cree este grupo de registro y almacene los registros de proxy en registros de CloudWatch. Si no desea enviar los registros de proxy a registros de CloudWatch, puede eliminar lalogConfiguration
.{ "cluster": "tutorial", "deploymentConfiguration": { "maximumPercent": 200, "minimumHealthyPercent": 0 }, "deploymentController": { "type": "ECS" }, "desiredCount": 1, "enableECSManagedTags": true, "enableExecuteCommand": true, "launchType": "FARGATE", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "
sg-EXAMPLE
" ], "subnets": [ "subnet-EXAMPLE
", "subnet-EXAMPLE
", "subnet-EXAMPLE
" ] } }, "platformVersion": "LATEST", "propagateTags": "SERVICE", "serviceName": "service-connect-nginx-service", "serviceConnectConfiguration": { "enabled": true, "services": [ { "portName": "nginx", "clientAliases": [ { "port": 80 } ], "tls": { "issuerCertificateAuthority": { "awsPcaAuthorityArn": "certificateArn
" }, "kmsKey": "kmsKey
", "roleArn": "iamRoleArn
" } } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/service-connect-proxy", "awslogs-region": "region
", "awslogs-stream-prefix": "service-connect-proxy" } } }, "taskDefinition": "service-connect-nginx" } -
Cree un servicio mediante el archivo
service-connect-nginx-service.json
:aws ecs create-service --cluster tutorial --cli-input-json file://service-connect-nginx-service.json
Salida:
{ "service": { "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/tutorial/service-connect-nginx-service", "serviceName": "service-connect-nginx-service", "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial", "loadBalancers": [], "serviceRegistries": [], "status": "ACTIVE", "desiredCount": 1, "runningCount": 0, "pendingCount": 0, "launchType": "FARGATE", "platformVersion": "LATEST", "platformFamily": "Linux", "taskDefinition": "arn:aws:ecs:us-west-2:123456789012:task-definition/service-connect-nginx:1", "deploymentConfiguration": { "deploymentCircuitBreaker": { "enable": false, "rollback": false }, "maximumPercent": 200, "minimumHealthyPercent": 0 }, "deployments": [ { "id": "ecs-svc/3763308422771520962", "status": "PRIMARY", "taskDefinition": "arn:aws:ecs:us-west-2:123456789012:task-definition/service-connect-nginx:1", "desiredCount": 1, "pendingCount": 0, "runningCount": 0, "failedTasks": 0, "createdAt": 1661210032.602, "updatedAt": 1661210032.602, "launchType": "FARGATE", "platformVersion": "1.4.0", "platformFamily": "Linux", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-EXAMPLE" ], "subnets": [ "subnet-EXAMPLEf", "subnet-EXAMPLE", "subnet-EXAMPLE" ] } }, "rolloutState": "IN_PROGRESS", "rolloutStateReason": "ECS deployment ecs-svc/3763308422771520962 in progress.", "failedLaunchTaskCount": 0, "replacedTaskCount": 0, "serviceConnectConfiguration": { "enabled": true, "namespace": "service-connect", "services": [ { "portName": "nginx", "clientAliases": [ { "port": 80 } ] } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/service-connect-proxy", "awslogs-region": "us-west-2", "awslogs-stream-prefix": "service-connect-proxy" }, "secretOptions": [] } }, "serviceConnectResources": [ { "discoveryName": "nginx", "discoveryArn": "arn:aws:servicediscovery:us-west-2:123456789012:service/srv-EXAMPLE" } ] } ], "roleArn": "arn:aws:iam::123456789012:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS", "version": 0, "events": [], "createdAt": 1661210032.602, "placementConstraints": [], "placementStrategy": [], "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-EXAMPLE" ], "subnets": [ "subnet-EXAMPLE", "subnet-EXAMPLE", "subnet-EXAMPLE" ] } }, "schedulingStrategy": "REPLICA", "enableECSManagedTags": true, "propagateTags": "SERVICE", "enableExecuteCommand": true } }
La
serviceConnectConfiguration
que ha proporcionado aparece dentro de la primera implementación de la salida. A medida que hace cambios en el servicio de ECS de manera que es necesario realizar cambios en las tareas, Amazon ECS crea una nueva implementación.
-
Paso 3: Comprobar que puede conectarse
Para comprobar que Service Connect está configurado y funciona, siga estos pasos para conectarse al servicio web desde una aplicación externa. A continuación, consulte las métricas adicionales en CloudWatch que crea el proxy de Service Connect.
Para conectarse al servicio web desde una aplicación externa
-
Conéctese a la dirección IP de la tarea y al puerto del contenedor mediante la dirección IP de la tarea
Utilice la AWS CLI para obtener el ID de la tarea, mediante el
aws ecs list-tasks --cluster tutorial
.Si las subredes y el grupo de seguridad permiten el tráfico de la Internet pública en el puerto de la definición de la tarea, puede conectarse a la IP pública desde su equipo. Sin embargo, la IP pública no está disponible en “describe-tasks”, por lo que los pasos incluyen ir a la AWS Management Console o la AWS CLI de Amazon EC2 para obtener los detalles de la interfaz de red elástica.
En este ejemplo, una instancia de Amazon EC2 de la misma VPC usa la IP privada de la tarea. La aplicación es nginx, pero el encabezado
server: envoy
muestra que se utiliza el proxy de Service Connect. El proxy de Service Connect escucha el puerto del contenedor de la definición de la tarea.$ curl -v 10.0.19.50:80/ * Trying 10.0.19.50:80... * Connected to 10.0.19.50 (10.0.19.50) port 80 (#0) > GET / HTTP/1.1 > Host: 10.0.19.50 > User-Agent: curl/7.79.1 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < server: envoy < date: Tue, 23 Aug 2022 03:53:06 GMT < content-type: text/html < content-length: 612 < last-modified: Tue, 16 Apr 2019 13:08:19 GMT < etag: "5cb5d3c3-264" < accept-ranges: bytes < x-envoy-upstream-service-time: 0 < <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
Para ver las métricas de Service Connect
El proxy de Service Connect crea métricas de aplicaciones (conexión HTTP, HTTP2, gRPC o TCP) en las métricas de CloudWatch. Cuando utilice la consola de CloudWatch, consulte las dimensiones de métricas adicionales de DiscoveryName, (DiscoveryName, ServiceName, ClusterName), TargetDiscoveryName y (TargetDiscoveryName, ServiceName, ClusterName) en el espacio de nombres de Amazon ECS. Para obtener más información acerca de estas métricas y sus dimensiones, consulte View Available Metrics en la Guía del usuario de Registros de Amazon CloudWatch.