¿Cómo usar la detección de servicios de Amazon ECS con CloudFormation?
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

Contenido relevante
- preguntada hace 10 díaslg...
- Respuesta aceptadapreguntada hace 2 meseslg...
- preguntada hace 4 meseslg...
- preguntada hace 3 meseslg...
- preguntada hace 4 meseslg...
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace 8 meses