Lambda Conectando a RDS Privado: Configuración de VPC, Subnets y Security Groups
Una de las situaciones más frustrantes al empezar con Lambda es cuando la función simplemente no puede alcanzar la base de datos RDS que vive en una subnet privada. El timeout llega después de 30 segundos, no hay ningún mensaje de error claro en CloudWatch, y la pregunta inevitable es: ¿necesito configurar algo de VPC en mi Lambda? La respuesta corta es sí — pero la configuración incorrecta puede dejarte igual de bloqueado, o peor, con una Lambda que perdió acceso a internet sin que te des cuenta.
TL;DR: Lambda Conectando a RDS Privado
| Componente | Qué configurar | Error típico si falta |
|---|---|---|
| VPC en Lambda | Misma VPC que RDS | Timeout de conexión (no hay ruta) |
| Subnets en Lambda | Subnets privadas con ruta a RDS | Timeout de conexión |
| Security Group en Lambda | SG que RDS acepta como origen | Conexión rechazada o timeout |
| Security Group en RDS | Regla inbound desde SG de Lambda | Conexión rechazada (puerto 5432/3306) |
| Rol IAM de Lambda | Permisos ec2:CreateNetworkInterface y relacionados | Error al crear ENI durante cold start |
Cómo Funciona Lambda Conectando a RDS en VPC Privada
Por defecto, Lambda ejecuta funciones en una infraestructura de red gestionada por AWS, completamente fuera de tu VPC. Eso significa que no tiene visibilidad de recursos privados como RDS, ElastiCache, o cualquier instancia EC2 en subnets privadas. Para que Lambda pueda conectarse a RDS privado, debes adjuntarle una configuración de VPC explícita.
Cuando configuras VPC en Lambda, el servicio crea una Elastic Network Interface (ENI) en las subnets que especifiques. Esta ENI es la que realmente establece la conexión de red hacia RDS. El proceso de creación de la ENI ocurre durante el cold start de la función — y aquí está el primer punto de falla silencioso: si el rol de ejecución de Lambda no tiene los permisos IAM necesarios para crear ENIs, la función falla antes de ejecutar una sola línea de tu código.
(infraestructura AWS pública)"] LambdaVPC["Lambda con VPC
(ENI en subnet privada)"] ENI["ENI
(Elastic Network Interface)"] SGΛ["Security Group
Lambda"] SGRDS["Security Group
RDS"] RDS["RDS Instance
(subnet privada)"] Internet["Internet / Servicios AWS
(endpoints públicos)"] LambdaDefault -. "Sin ruta a RDS privado" .-> RDS LambdaVPC --> ENI ENI --> SGΛ SGΛ -- "tráfico permitido
por regla inbound" --> SGRDS SGRDS --> RDS LambdaVPC -. "Pierde acceso
sin NAT GW o VPC Endpoint" .-> Internet
- Lambda sin VPC: La función corre en infraestructura AWS pública. No tiene ruta hacia subnets privadas de tu cuenta.
- Lambda con VPC: AWS crea una ENI en la subnet especificada. La función obtiene una IP privada dentro de tu VPC.
- Flujo de conexión: Lambda (via ENI) → Security Group de Lambda → Security Group de RDS → instancia RDS. Cada salto tiene su propia capa de filtrado.
- Cold start con VPC: La creación de la ENI añade latencia al cold start. AWS optimizó esto con el modelo de ENI compartidas introducido en 2019, pero el comportamiento depende de la región y configuración.
Diagnóstico: Por Qué Lambda No Puede Conectar a RDS Privado
Antes de tocar cualquier configuración, vale la pena entender en qué capa exactamente está fallando la conexión. Un timeout genérico puede venir de cuatro lugares distintos, y cada uno tiene su propio fix.
VPC configurada?"} Check1 -- No --> Fix1["Adjuntar VPC, Subnets
y Security Group a Lambda"] Check1 -- Sí --> Check2{"¿Misma VPC
que RDS?"} Check2 -- No --> Fix2["Corregir VpcId
en configuración Lambda"] Check2 -- Sí --> Check3{"¿SG de RDS permite
inbound desde SG Lambda?"} Check3 -- No --> Fix3["Agregar regla inbound
en SG de RDS"] Check3 -- Sí --> Check4{"¿Rol IAM tiene permisos
para crear ENIs?"} Check4 -- No --> Fix4["Adjuntar AWSLambdaVPCAccessExecutionRole
al rol de Lambda"] Check4 -- Sí --> Check5["Verificar route tables
y logs de CloudWatch"] Fix1 --> End["Reintentar conexión"] Fix2 --> End Fix3 --> End Fix4 --> End Check5 --> End
Paso 1: Verificar que Lambda tiene configuración de VPC
Si Lambda no tiene VPC configurada, no hay nada más que diagnosticar — simplemente no existe ruta hacia RDS. Este es el error más común y el más fácil de confirmar.
aws lambda get-function-configuration \
--function-name nombre-de-tu-funcion \
--query 'VpcConfig' \
--output json
Si la respuesta muestra SubnetIds: [] y SecurityGroupIds: [], Lambda está corriendo fuera de tu VPC. Necesitas adjuntarle la configuración antes de continuar con cualquier otro diagnóstico.
Paso 2: Confirmar que las subnets de Lambda están en la misma VPC que RDS
Una configuración de VPC válida en Lambda no garantiza que esté en la misma VPC que RDS. Si apuntas a subnets de una VPC diferente, el resultado es idéntico a no tener VPC configurada: timeout sin mensaje de error.
aws rds describe-db-instances \
--db-instance-identifier nombre-de-tu-rds \
--query 'DBInstances[0].{VpcId:DbSubnetGroup.VpcId,Subnets:DbSubnetGroup.Subnets[*].SubnetIdentifier}' \
--output json
Compara el VpcId devuelto con el que aparece en la configuración de VPC de tu Lambda. Deben coincidir.
Paso 3: Revisar las reglas inbound del Security Group de RDS
Este es el punto de falla más frecuente en entornos reales. Lambda puede estar en la VPC correcta, en la subnet correcta, y aun así no conectar porque el Security Group de RDS no tiene una regla que permita tráfico desde el Security Group de Lambda. Revisar solo por IP no es suficiente — la referencia debe ser por Security Group ID.
aws ec2 describe-security-groups \
--group-ids sg-XXXXXXXX \
--query 'SecurityGroups[0].IpPermissions' \
--output json
Busca una regla inbound que apunte al puerto de tu base de datos (3306 para MySQL/Aurora MySQL, 5432 para PostgreSQL) y cuyo origen sea el Security Group ID de tu Lambda, no un rango CIDR. Usar un CIDR funciona, pero referenciar el SG de Lambda es más seguro y más fácil de auditar.
Paso 4: Verificar permisos IAM del rol de ejecución de Lambda
Lambda necesita permisos para crear, describir y eliminar ENIs en tu VPC. Sin estos permisos, la función falla durante el cold start con un error que aparece en CloudWatch Logs, no como un error de conexión a base de datos. Muchos equipos pasan horas mirando el código de conexión cuando el problema está en el rol IAM.
aws iam get-role-policy \
--role-name nombre-del-rol-de-lambda \
--policy-name nombre-de-la-policy \
--output json
Si usas políticas administradas, verifica que el rol tenga adjunta AWSLambdaVPCAccessExecutionRole:
aws iam list-attached-role-policies \
--role-name nombre-del-rol-de-lambda \
--output json
La política administrada AWSLambdaVPCAccessExecutionRole incluye los permisos ec2:CreateNetworkInterface, ec2:DescribeNetworkInterfaces, y ec2:DeleteNetworkInterface que Lambda necesita para operar dentro de una VPC.
Paso 5: Confirmar que las subnets de Lambda tienen ruta hacia RDS
Incluso dentro de la misma VPC, si Lambda y RDS están en subnets con route tables diferentes y no hay ruta entre ellas, la conexión falla. En la mayoría de arquitecturas con subnets privadas esto no es un problema porque comparten la misma route table, pero en VPCs con segmentación más granular puede serlo.
aws ec2 describe-route-tables \
--filters Name=association.subnet-id,Values=subnet-XXXXXXXX \
--query 'RouteTables[0].Routes' \
--output json
Ejecuta este comando para cada subnet donde está configurada tu Lambda. El tráfico hacia la IP privada de RDS debe tener una ruta local (local) dentro del bloque CIDR de la VPC — esto es automático en VPCs estándar.
Configuración Correcta: Lambda con Acceso a RDS Privado
Actualizar la configuración de VPC en Lambda
aws lambda update-function-configuration \
--function-name nombre-de-tu-funcion \
--vpc-config SubnetIds=subnet-XXXXXXXX,subnet-YYYYYYYY,SecurityGroupIds=sg-XXXXXXXX
Especifica al menos dos subnets en zonas de disponibilidad diferentes para alta disponibilidad. Si RDS falla a otra AZ, Lambda necesita tener una ENI disponible en esa AZ para seguir conectando.
Agregar regla inbound al Security Group de RDS
aws ec2 authorize-security-group-ingress \
--group-id sg-RDS-XXXXXXXX \
--protocol tcp \
--port 5432 \
--source-group sg-LAMBDA-XXXXXXXX
Reemplaza el puerto según tu motor de base de datos. Esta regla le dice al SG de RDS que acepte conexiones TCP en el puerto especificado cuando el origen sea cualquier recurso que tenga el SG de Lambda adjunto.
Policy IAM mínima para Lambda en VPC
🔽 Ver política IAM completa (Click para expandir)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DeleteNetworkInterface",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"ec2:DescribeVpcs"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/nombre-de-tu-funcion:*"
}
]
}
Las acciones de EC2 para gestión de ENIs requieren "Resource": "*" — no admiten restricción por ARN de recurso específico según la Service Authorization Reference de AWS.
El Error Silencioso que Nadie Espera: Lambda Pierde Acceso a Internet
Aquí está la trampa que atrapa a casi todos la primera vez. Cuando adjuntas Lambda a una VPC, la función pierde acceso a internet aunque antes lo tuviera. Esto rompe silenciosamente cualquier llamada a APIs externas, a endpoints de AWS fuera de la VPC (como Secrets Manager, S3, o el propio endpoint de RDS si usas RDS Proxy), o a servicios de terceros.
Piénsalo como mover a un empleado de una oficina con conexión pública a una sala de servidores sin ventanas. Ahora puede hablar con los servidores internos, pero perdió el teléfono para llamar al exterior.
El síntoma clásico: Lambda conecta bien a RDS, pero las llamadas a boto3.client('secretsmanager') empiezan a dar timeout. El equipo asume que es un problema de permisos IAM y pierde horas revisando políticas que están perfectamente configuradas.
La causa real: Lambda en VPC privada no tiene ruta a internet. Para resolverlo tienes dos opciones:
- NAT Gateway: Coloca Lambda en subnets privadas con una route table que apunte a un NAT Gateway en una subnet pública. Esto restaura el acceso a internet y a endpoints públicos de AWS.
- VPC Endpoints: Para servicios AWS específicos (Secrets Manager, S3, SSM, etc.), crea Interface Endpoints o Gateway Endpoints en tu VPC. Más económico que NAT Gateway para tráfico interno de AWS, y más seguro porque el tráfico nunca sale de la red de AWS.
aws ec2 describe-vpc-endpoints \
--filters Name=vpc-id,Values=vpc-XXXXXXXX \
--query 'VpcEndpoints[*].{Service:ServiceName,State:State,Type:VpcEndpointType}' \
--output table
Este comando te muestra qué VPC Endpoints ya existen en tu VPC. Si no ves endpoints para los servicios AWS que tu Lambda necesita, ese es tu siguiente paso de configuración.
Verificación End-to-End de Lambda Conectando a RDS Privado
Una vez aplicados los cambios, la forma más rápida de confirmar que todo está bien es invocar la función y revisar los logs. Pero antes de eso, verifica el estado de la ENI — si Lambda no pudo crear la ENI, el error aparece en el estado de la función, no en los logs de ejecución.
aws lambda get-function-configuration \
--function-name nombre-de-tu-funcion \
--query '{VpcConfig:VpcConfig,LastUpdateStatus:LastUpdateStatus,LastUpdateStatusReason:LastUpdateStatusReason}' \
--output json
Si LastUpdateStatus muestra Failed, el campo LastUpdateStatusReason te dirá exactamente qué salió mal — típicamente un error de permisos IAM o una subnet inválida.
aws lambda invoke \
--function-name nombre-de-tu-funcion \
--payload '{}' \
--log-type Tail \
--query 'LogResult' \
--output text \
response.json | base64 --decode
CLI examples omitted for steps intermedios de route table — la verificación de rutas locales dentro de una VPC estándar no requiere comandos adicionales más allá del describe-route-tables ya mostrado.
Resumen y Próximos Pasos para Lambda Conectando a RDS Privado
Conectar Lambda a RDS privado requiere alinear cuatro capas: configuración de VPC en Lambda (misma VPC y subnets correctas), Security Groups (regla inbound en RDS apuntando al SG de Lambda), permisos IAM (gestión de ENIs), y acceso a servicios AWS adicionales si Lambda los necesita. Omitir cualquiera de estas capas produce timeouts que son difíciles de distinguir entre sí sin un diagnóstico sistemático.
Para entornos de producción, considera también RDS Proxy — actúa como pool de conexiones entre Lambda y RDS, resuelve el problema de agotamiento de conexiones cuando Lambda escala horizontalmente, y soporta autenticación IAM nativa que elimina la necesidad de gestionar credenciales de base de datos en variables de entorno.
- Documentación oficial: Lambda VPC Configuration
- Documentación oficial: RDS Proxy
- Documentación oficial: VPC Endpoints
Glosario de Términos Clave
| Término | Definición operacional |
|---|---|
| ENI (Elastic Network Interface) | Interfaz de red virtual que Lambda crea en tu VPC para obtener conectividad privada. Su ciclo de vida está gestionado por el servicio Lambda. |
| Security Group | Firewall stateful a nivel de recurso. Las reglas inbound del SG de RDS deben referenciar explícitamente el SG de Lambda como origen. |
| VPC Endpoint | Conexión privada entre tu VPC y servicios AWS sin pasar por internet público. Esencial cuando Lambda en VPC privada necesita llamar a servicios como Secrets Manager o S3. |
| NAT Gateway | Componente de red en subnet pública que permite a recursos en subnets privadas iniciar conexiones hacia internet. Necesario si Lambda requiere acceso a endpoints públicos. |
| RDS Proxy | Proxy gestionado por AWS que mantiene un pool de conexiones a RDS. Crítico cuando Lambda escala a muchas instancias concurrentes para evitar agotar las conexiones de la base de datos. |
Related Posts
- 📄 EC2 SSH Connection Timeout: Qué revisar en Security Groups para resolver el error
- 📄 EC2 sin acceso a Internet en VPC personalizada: Internet Gateway y Route Table
- 📄 NAT Gateway vs NAT Instance en AWS: ¿Cuál usar para tus instancias privadas?
- 📄 Conectar Dos VPCs con VPC Peering: Guía Completa de Configuración y Tablas de Rutas
Comentarios
Publicar un comentario