如何将 VPC 和安全组分配给 AWS CDK 中的 Lambda?

Rob*_*bin 7 amazon-web-services aws-lambda aws-security-group aws-cdk

我有一个带有需要插入 RDS 数据库的 lambda 函数的 AWS CDK 堆栈。部署堆栈时,lambda 函数无法访问数据库并给出错误:getaddrinfo ENOTFOUND [RDS 端点由我定义]。手动添加RDS数据库所在的VPC、子网和安全组后,lambda函数正常工作。

您如何在 AWS CDK 中定义 VPC、子网和安全组,最好是在 TypeScript 中?就文档而言,我尝试过:

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]
});
Run Code Online (Sandbox Code Playgroud)

运行 cdk deploy 时会出现 AWS CDK 错误:“无法将 Lambda 函数放置在公共子网中,子进程因错误 1 ​​退出”

欢迎任何帮助。

jar*_*mod 5

如果您要将 Lambda 函数部署到 VPC 中,则应将其部署到私有子网(具有subnetType: SubnetType.PRIVATE)或隔离子网(具有subnetType: SubnetType.ISOLATED)。

您选择哪个取决于 Lambda 函数是否需要出站 Internet 访问。如果是,则使用 PRIVATE,否则使用 ISOLATED。

要访问同一 VPC 中的 RDS 实例,Lambda 函数应放置在对 RDS 实例安全组的相关端口号具有入站访问权限的安全组中。

此处为 VPC 示例,此处为 Lambda示例。


gre*_*pit 5

下面是一个简单的例子,希望对你有帮助:

//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),
});
Run Code Online (Sandbox Code Playgroud)