Creando RDS Proxy para Instancias de Base de Datos Existentes en AWS CDK

Recientemente trabajé en un proyecto que requería crear y adjuntar un RDS Proxy a una instancia RDS ya existente ejecutando PostgreSQL. Parece bastante fácil, pero seguía obteniendo un error de validación que tomó algún tiempo resolver.

Lo Que Estaba Haciendo (Esto No Funciona)

Mi primer intento usó la función estándar fromLookup para referenciar una base de datos existente:

...
const coolDatabase = rds.DatabaseInstance.fromLookup(this, 'coolDB', {
  instanceIdentifier: props.databaseInstanceId,
})

const dbProxy = coolDatabase.addProxy('coolDBProxy', {
  secrets: [<relevant_secrets>],
  vpc: <relevant_vpc>,
  securityGroups: [<relevant_security_groups>],
});
...

Este código recupera información de una instancia RDS usando la función fromLookup con un identificador de base de datos pasado a través de props, luego llama addProxy para crear y adjuntar un proxy RDS.

Bastante fácil, ¿verdad? Cuando intenté desplegar mi stack seguía obteniendo este error de validación:

Could not determine engine for proxy target 'coolStack/coolDB'.
Please provide it explicitly when importing the resource at path
[coolStack/coolDB/coolProxy] in aws-cdk-lib.aws_rds.DatabaseProxy

El Problema

La esencia del asunto es que la función fromLookup no puebla el campo engine usado por la base de datos. Internamente, este valor es importante para el código que crea y conecta el RDS Proxy, por lo que te presenta un error de validación.

La Solución

Usa fromDatabaseInstanceAttributes en lugar de fromLookup. Esta función te permite especificar explícitamente el motor de base de datos, resolviendo nuestro problema. La desventaja es que la llamada requiere información adicional sobre la base de datos:

  • Identificador de instancia
  • Dirección del endpoint de instancia
  • Número de puerto
  • Grupos de seguridad (pueden dejarse vacíos si es necesario)

El código corregido se ve así:

const coolDatabase = rds.DatabaseInstance.fromDatabaseInstanceAttributes(this,'coolDB',
  {
    instanceIdentifier: props.databaseInstanceId,
    instanceEndpointAddress: props.databaseInstanceEndpoint,
    port: 5432, // because Postgres
    securityGroups: [<relevant_security_groups>], // This can be left empty in a pinch
    engine: rds.DatabaseInstanceEngine.POSTGRES, // <- Magic happening right there
  }
);

const dbProxy = coolDatabase.addProxy('coolDBProxy', {
  secrets: [<relevant_secrets>],
  vpc: <relevant_secrets>,
  securityGroups: [<relevant_security_groups>],
});

Al establecer explícitamente el campo engine, CDK tiene toda la información que necesita para configurar apropiadamente el RDS Proxy. La llamada addProxy ahora tendrá éxito sin errores de validación.

Aunque esta solución funciona, no es ideal. Preferiría pasar el motor directamente a la función fromLookup, pero en julio de 2025, usar fromDatabaseInstanceAttributes es probablemente la forma más directa de resolver este problema.

Si te has encontrado con este problema específico, ¡bienvenido a nuestro exclusivo club! Probablemente solo hay un puñado de personas que se han topado con este escenario exacto, pero espero que esta guía te ahorre algo de tiempo de debugging/corrección.

¡Espero que esto te sea útil!

Juan Luis Orozco Villalobos

¡Hola! Soy Juan, un ingeniero de software y consultor que vive en Budapest. Me especializo en computación en la nube e IA/ML, y me encanta ayudar a otros a aprender sobre tecnología e ingeniería