Tengo una pila de CDK de AWS con una función lambda que debe insertarse en una base de datos RDS. Cuando se implementa la pila, la función lambda no puede acceder a la base de datos y genera un error: getaddrinfo ENOTFOUND [punto final de RDS definido por mí]. Después de agregar manualmente la VPC, las subredes y el grupo de seguridad en el que se encuentra la base de datos de RDS, la función lambda funciona correctamente.
¿Cómo se define el grupo de VPC, subredes y seguridad en AWS CDK, preferiblemente en TypeScript? En la medida en que hay documentación, probé:
const vpc = ec2.Vpc.fromLookup(this, "VPC", { vpcName: "myVPC" }); const securityGroup = ec2.SecurityGroup.fromSecurityGroupId( this, "SG", "sg-XXXXX" ); const subnet1a = ec2.PrivateSubnet.fromSubnetAttributes(this, "SUBNET1A", { subnetId: "eu-central-1a" }); const myLambda = new lambda.Function(this, "myLambda", { runtime: lambda.Runtime.NODEJS_12_X, code: lambda.Code.fromAsset("lambda"), handler: "myLambda.handler", description: "myLambda", environment: { DB_HOST: "XXXX", DB_USER: "XXXX", DB_PASSWORD: "XXXX", DB_NAME: "XXXX" }, vpc: vpc, vpcSubnets: [subnet1a], securityGroups: [securityGroup] });Al ejecutar cdk deployment Esto da un error de AWS CDK: "No es posible colocar funciones de Lambda en una subred pública El subproceso salió con el error 1"
Cualquier ayuda es bienvenida.
Si desea implementar una función Lambda en una VPC, debe implementarla en una subred privada (una que tenga subnetType: SubnetType.PRIVATE ) o una subred aislada (una que tenga subnetType: SubnetType.ISOLATED ).
El que elija depende de si la función Lambda necesita o no acceso a Internet saliente. Si es así, utilice PRIVADO; de lo contrario, utilice AISLADO.
Para llegar a una instancia de RDS en la misma VPC, la función de Lambda debe colocarse en un grupo de seguridad que tenga acceso entrante en el número de puerto correspondiente al grupo de seguridad de la instancia de RDS.
Aquí hay un ejemplo simple, espero que ayude:
//get VPC Info form AWS account, FYI we are not rebuilding we are referencing const DefaultVpc = Vpc.fromVpcAttributes(this, 'vpcdev', { vpcId:'vpc-d0e0000b0', availabilityZones: core.Fn.getAzs(), privateSubnetIds: 'subnet-00a0de00', publicSubnetIds: 'subnet-00a0de00' }); const YourService = new lambda.Function(this, 'LambdaName', { code: lambda.Code.fromAsset("lambda"), handler: 'handlers.your_handler', role: lambdaExecutionRole, securityGroup: lambdaSecurityGroup, vpc: DefaultVpc, runtime: lambda.Runtime.PYTHON_3_7, timeout: Duration.minutes(2), });Su código para configurar un lambda con vpc está bien. Su 'subnet1a' es una subred pública y se recomienda no definir ningún servicio de back-end en las subredes públicas. Documentación de AWS para la configuración de lambda y vpc Otro enlace para referencia
Elija subredes privadas o aisladas para lambda.