# 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:
> 
> ```plaintext
> 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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1766160619819/8b6c3d03-b642-4e34-831a-7fe8918d576f.png align="center")

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

```plaintext
./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 '\*' )

```plaintext
./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 '\*' )

```plaintext
./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:

```plaintext
./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**

```plaintext
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:
    
    ```plaintext
    ./kafka-acls.sh --authorizer-properties zookeeper.connect=$ZKSTRING --remove --allow-principal User:msk-prod  --operation Describe --cluster 
    ```
    
* Una vez limpias, agregamos las ACLs necesarias para poder modificar permisos posteriormente:
    
    ```plaintext
    ./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](https://docs.aws.amazon.com/es_es/msk/latest/developerguide/msk-acls.html)
