Prerequisitos para habilitar MultiVPC sobre MSK
El objetivo del presente documento es dejar el clúster listo (a nivel de: auth, ACLs/policies, red y pruebas) antes de habilitar Multi-VPC, de modo que los clientes existentes consuman y produzcan sin TopicAuthorizationException ni errores de enrutamiento.
El esquema de autenticación por cliente en el MSK de las APP permite SCRAM (SASL/SCRAM), que tiene control por ACLs de Kafka. Y está configurado actualmente como:
allow.everyone.if.no.acl.found=true (permisivo);Esta valor está seteado en parameter store de la cuenta Shared (msk-{env})
Se cambiará a false una vez que se tenga las ACLs completas.

Con SCRAM, el clúster tiene un usuario con privilegios para gestionar ACLs (que se encuentra almacenado en un secret)
0 - Conectarse al clúster de MSK
1- Permisos de metadatos del clúster
./kafka-acls.sh --bootstrap-server "$KAFKA_BROKERS_SCRAM" \
--add --allow-principal User:<user> \
--operation Describe \
--operation Create \
--operation Alter \
--operation AlterConfigs \
--operation DescribeConfigs \
--cluster \
--command-config client.properties
Reemplazar user con el usuario asociado al clúster.
2- Dar permisos sobre tópicos que usará la app (prefijos o '*' )
./kafka-acls.sh --bootstrap-server "$KAFKA_BROKERS_SCRAM" \
--add --allow-principal User:<user> \
--operation Describe \
--operation Read \
--operation Alter \
--operation Write \
--operation DescribeConfigs \
--topic "<prefijo-o-*>" \
--resource-pattern-type literal \
--command-config client.properties
Reemplazar user con el usuario asociado al clúster.
3- Consumer groups (prefijo o '*' )
./kafka-acls.sh --bootstrap-server "$KAFKA_BROKERS_SCRAM" \
--add --allow-principal User:<user> \
--operation Read --operation Describe \
--group "<prefijo-o-*>" --resource-pattern-type literal \
--command-config client.properties
Reemplazar user con el usuario asociado al clúster.
4- Dar permiso para crear tópicos por prefijo de topic:
./kafka-acls.sh ... --operation Create --topic <prefijo> --resource-pattern-type literal ...
No cambiar allow.everyone.if.no.acl.found=false hasta que estas ACLs estén aplicadas; de lo contrario, se puede bloquear.
5 - Red y requisitos de Multi-VPC
- Misma Región
- Mismo número de subredes ↔ clúster y mismos AZ IDs (no confundir con nombres de AZ).
- Un VPC Endpoint (Interface) por AZ cliente.
- SG/NACL permitiendo 9096 (SASL/SCRAM).
6- Pruebas “pre-Multi-VPC” (en la VPC del clúster)
- Listar/describe tópicos de destino con el usuario que usarán los clientes.
- Producir y consumir mensajes de prueba.
7- Activar Multi-VPC
- Cambiar el valor en el parameter store asociado
allow.everyone.if.no.acl.found=false(permisivo);
Y ejecutar el pipeline
- En caso de error: This server does not host this topic-partition, suele ser conectividad parcial hacia el líder; validar DNS/SG/NACL y usa client.dns.lookup=use_all_dns_ips.
8 - Observabilidad y troubleshooting
- Revisar los logs del MSK (CloudWatch Logs): buscar Session(User:...), Denied, TopicAuthorizationException.
- Filtrar en CloudWatch Logs Insights – en los log groups de las lambdas involucradas: error|exception|Authorization|Throttl|ConditionalCheckFailed|ValidationException.
- Revisar el estado de Event Source Mappings (list-event-source-mappings): Comprobar State (Active) y LastProcessingResult.
En caso los ACL no funcionen correctamente, seguir el siguiente paso para elminar y corregir los ACLs:
Después de eliminar los archivos "users_jaas.conf" y "client.properties", así como hacer unset de la variable KAFKA_OPTS, ejecutar el siguiente comando y limpiar las ACLs:
./kafka-acls.sh --authorizer-properties zookeeper.connect=$ZKSTRING --remove --allow-principal User:msk-prod --operation Describe --clusterUna vez limpias, agregamos las ACLs necesarias para poder modificar permisos posteriormente:
./kafka-acls.sh --bootstrap-server $BROKERSSCRAM --add --allow-principal User:msk-prod --operation Describe --operation Create --operation Alter --cluster --command-config client.properties
Referencias:
https://docs.aws.amazon.com/es_es/msk/latest/developerguide/msk-acls.html
