AppMesh y ECS con certificados ACM importados en Envoy Sidecar a través de EFS


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$

Related Articles

Convirtiendo la pasión por aprender en cursos en línea vistos por millones

Publicado por Kevin Hernandez, gerente de relaciones con desarrolladores de...

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Same Category

spot_img

Stay in touch!

Follow our Instagram