Resumen
Esta guía muestra la capacidad de usar certificados importados de un proveedor externo (p. ej., Venafi) en ACM, montarlos en EFS y usarlos como fuentes confiables en sidecars de Envoy con aplicaciones que se ejecutan en ECS. AppMesh se usa como un paso con la terminación de TLS que se produce en la capa del contenedor de la aplicación.
Requisitos previos y limitaciones
requisitos previos
Un certificado que contiene la cadena de dominios necesarios para el servicio presentado y los microservicios necesarios.
Lo que vamos a producir:
- ACM que contiene un certificado importado.
- volumen EFS.
- Registro de ruta53.
- Equilibrador de carga de purple, con grupo de destino asociado.
- Clúster de ECS, con Tareas administradas por un Servicio. Una definición de tarea para combinar los criterios de mapeo.
- AppMesh Digital Gateway, Digital Service y Digital Node apuntando hacia los contenedores de tareas de ECS.
- CloudMap para integrar configuraciones de ECS y AppMesh con automatización.
- Host de bastión utilizado con fines de prueba.
Arquitectura
Pila de tecnología de destino
ACM, EFS, Route53, NLB, TG, ECS, AppMesh, CloudMap
Arquitectura de destino
N / A
Mejores prácticas
ACM – Administrador de certificados
Los certificados son importados de Venafi (proveedor externo):
Profundizando en esta información, los dominios enumerados contienen subdominios suficientes para abordar la arquitectura orientada a microservicios.
EFS
AppMesh no admite certificados ACM PCM directamente, por lo que se cargan en un volumen EFS que se montará en los contenedores sidecar de Envoy.

ruta53
Se configura una zona alojada en Route53 para poder enrutar el tráfico desde nuestro dominio principal a un Equilibrador de carga de purple.
equilibrador de carga
Este Equilibrador de carga de purple está configurado como interno para permitir solo el tráfico interno controlado.
Hay un único oyente abierto en el puerto 443:
Grupo objetivo
El grupo objetivo enruta el tráfico al puerto de la aplicación en dos tareas de ECS detrás de nuestro servicio de ECS.
La verificación de estado confirma el acceso al puerto de tráfico definido, que es el puerto del contenedor de la aplicación para ECS.
ECS
Cada servicio tiene su propia aplicación de microservicio, que consiste en un contenedor de aplicaciones y un sidecar enviado.
El servicio contiene varias tareas para distribuir la carga.
Múltiples contenedores residen dentro de cada definición de tarea.
Los enlaces de purple se configuran para permitir el tráfico a través de los puertos de aplicación que se configuraron previamente en los grupos de destino.
Es importante configurar Envoy para poder validar los certificados para la terminación TLS de la aplicación. Para hacer esto, la definición de una tarea de enviado puede verse así:
{
"taskDefinitionArn": "arn:aws:ecs:af-south-1:xxxxxx:task-definition/envoy-task:12",
"containerDefinitions": (
{
"title": "envoy",
"picture": "xxxxx.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.22.2.1-prod",
"cpu": 0,
"reminiscence": 500,
"portMappings": (
{
"containerPort": 8443,
"hostPort": 8443,
"protocol": "tcp"
},
{
"containerPort": 8080,
"hostPort": 8080,
"protocol": "tcp"
},
{
"containerPort": 9901,
"hostPort": 9901,
"protocol": "tcp"
}
),
"important": true,
"surroundings": (
{
"title": "APPMESH_VIRTUAL_NODE_NAME",
"worth": "mesh/VAX/virtualGateway/om-xxx-vgw"
},
{
"title": "ENVOY_LOG_LEVEL",
"worth": "debug"
}
),
"mountPoints": (
{
"sourceVolume": "cert-vol",
"containerPath": "/certs",
"readOnly": true
}
),
"volumesFrom": (),
"consumer": "1337",
"logConfiguration": {
"logDriver": "awslogs",
"choices": {
"awslogs-group": "/ecs/envoy-task",
"awslogs-region": "af-south-1",
"awslogs-stream-prefix": "ecs"
}
},
"healthCheck": grep state
}
),
"household": "envoy-task",
"taskRoleArn": "arn:aws:iam::xxxxxx:position/Bounded-AmazonECSTaskExecutionRole",
"executionRoleArn": "arn:aws:iam::xxxxxx:position/Bounded-AmazonECSTaskExecutionRole",
"networkMode": "awsvpc",
"revision": 12,
"volumes": (
{
"title": "cert-vol",
"efsVolumeConfiguration": {
"fileSystemId": "fs-01c20c20xxxxd3",
"rootDirectory": "/",
"transitEncryption": "ENABLED",
"authorizationConfig": {
"accessPointId": "fsap-06a57e7xxx1d439",
"iam": "DISABLED"
}
}
}
),
"standing": "ACTIVE",
"requiresAttributes": (
{"title": "ecs.functionality.execution-role-awslogs"},
{"title": "com.amazonaws.ecs.functionality.ecr-auth"},
{"title": "com.amazonaws.ecs.functionality.docker-remote-api.1.17"},
{"title": "com.amazonaws.ecs.functionality.task-iam-role"},
{"title": "ecs.functionality.container-health-check"},
{"title": "ecs.functionality.execution-role-ecr-pull"},
{"title": "com.amazonaws.ecs.functionality.docker-remote-api.1.18"},
{"title": "ecs.functionality.task-eni"},
{"title": "com.amazonaws.ecs.functionality.docker-remote-api.1.29"},
{"title": "com.amazonaws.ecs.functionality.logging-driver.awslogs"},
{"title": "ecs.functionality.efsAuth"},
{"title": "com.amazonaws.ecs.functionality.docker-remote-api.1.19"},
{"title": "ecs.functionality.efs"},
{"title": "com.amazonaws.ecs.functionality.docker-remote-api.1.25"}
),
"placementConstraints": (),
"compatibilities": (
"EC2",
"FARGATE"
),
"requiresCompatibilities": (
"FARGATE"
),
"cpu": "1024",
"reminiscence": "2048",
"runtimePlatform": {
"operatingSystemFamily": "LINUX"
},
"registeredAt": "20xx-08-31T12:01:xx.525Z",
"registeredBy": "arn:aws:sts::xxxx:assumed-role/XXXUsrRole/(e-mail protected)",
"tags": ()
}
Malla de aplicaciones
Hay una sola Malla definida.
Malla
En esta configuración, utilizamos puertas de enlace virtuales, servicios virtuales y nodos virtuales para volver a enrutar los servicios de ECS en ejecución.
Puerta de enlace digital
Se aprovisiona una única puerta de enlace digital.
La configuración que monta la cadena de certificados del volumen EFS y actúa como un paso o flujo de tráfico permisivo.
om-vas-vgw
meshName: VAS
virtualGatewayName: om-vas-vgw
spec:
backendDefaults:
clientPolicy: {}
listeners:
- portMapping:
port: 8443
protocol: http
tls:
certificates:
file:
certificateChain: /certs/vas-api-service.instance.com.crt
privateKey: /certs/new.key
mode: PERMISSIVE
- portMapping:
port: 8080
protocol: http
logging:
accessLog:
file:
path: /dev/std
Oyentes:
Los oyentes de los cuales están configurados para TLS y no TLS, únicamente con fines de prueba durante las fases de desarrollo.

Rutas de puerta de enlace
Se configura una ruta de puerta de enlace para enrutar el tráfico de tipo http a través de un servicio digital definido a continuación.
vas-api-servicio-ruta:

meshName: VAS
virtualGatewayName: om-vas-vgw
gatewayRouteName: vas-api-service-route
spec:
httpRoute:
motion:
rewrite:
hostname:
defaultTargetHostname: DISABLED
prefix:
defaultPrefix: ENABLED
goal:
virtualService:
virtualServiceName: om-vas-api-vsvc
match:
port: 8443
prefix: /
El servicio digital está conectado a un nodo digital a través de la siguiente configuración.
om-vas-api-vsv:

meshName: VAS
virtualServiceName: om-vas-api-vsvc
spec:
supplier:
virtualNode:
virtualNodeName: om-vas-api-server-vnode
Nodo digital:
El nodo digital permite que el tráfico pase al puerto de la aplicación en 34559, como se muestra a continuación.
meshName: VAS
virtualNodeName: om-vas-api-server-vnode
spec:
backendDefaults:
clientPolicy:
tls:
implement: false
ports: ()
validation:
belief:
file:
certificateChain: /certs/vas-api-service.instance.com.crt
backends: ()
listeners:
- healthCheck:
healthyThreshold: 3
intervalMillis: 10000
path: /
port: 34559
protocol: tcp
timeoutMillis: 5000
unhealthyThreshold: 2
portMapping:
port: 34559
protocol: tcp
logging: {}
serviceDiscovery:
awsCloudMap:
attributes: ()
namespaceName: instance.com
serviceName: vas-api-service
Oyentes de nodos virtuales:
Una representación visible es la siguiente:
mapa de nubes
CloudMap proporciona descubrimiento de servicios para nuestros recursos, comenzamos con un espacio de nombres que se puede usar para llamadas API y consultas DNS dentro de la VPC.
Hemos creado un espacio de nombres para albergar nuestros recursos colectivos.
Aquí podemos ver las instancias de servicio que las tareas de ECS nos informan.
Si nos fijamos en uno de ellos, podemos ver la información que informará a AppMesh:
Confirmación del flujo de tráfico
Ejecutar las siguientes pruebas de conexión a través de un Bastion nos permite permanecer dentro de la misma purple interna para todas las pruebas.
Ahora activamos el servicio directamente en ECS para ver si se acepta el certificado:
sh-4.4$ curl -I https://vas-api-service.instance.com:34559/swagger-ui/
HTTP/1.1 200 OK
Final-Modified: Wed, 20 Jul 2022 13:15:06 GMT
Content material-Size: 3129
Settle for-Ranges: bytes
Content material-Sort: textual content/html
Entonces podemos probar que el servicio frontal actual a través de la cadena que comienza con Route53 se conecta con éxito:
sh-4.4$ curl -I https://vas.instance.com/swagger-ui/
HTTP/1.1 200 OK
Final-Modified: Wed, 20 Jul 2022 13:15:06 GMT
Content material-Size: 3129
Settle for-Ranges: bytes
Content material-Sort: textual content/html
Finalmente, nos aseguramos de que la conexión directamente desde el balanceador de carga no permita el ingreso:
sh-4.4$ curl -I https://om-vas-service-nlb-be13b4dccxxxxxx.elb.af-south-1.amazonaws.com/swagger-ui/
curl: (51) SSL: no different certificates topic title matches goal host title 'om-vas-service-nlb-be13b4dccxxxxx.elb.af-south-1.amazonaws.com'
sh-4.4$