AWS 子网没有 IP 地址(使用 CDK)

AWS Subnet is out of IP Addresses (using CDK)

一段时间以来,我一直在尝试取消部署具有 20 个 lambda 函数的 RestApiGateway,但每次我尝试部署时,我都会收到错误消息子网没有 IP 地址。知道为什么会这样吗?

这是我的 Vpc 堆栈的样子:

        this.vpc = new ec2.Vpc(this, 'vpc', {
        cidr: '10.0.0.0/21',
        maxAzs: this.azs,
        natGateways: this.azs,
        subnetConfiguration: [
            {
                subnetType: ec2.SubnetType.PUBLIC,
                name: `${APP_PREFIX}-public-subnet`,
                cidrMask: 24,
            },
            {
                subnetType: ec2.SubnetType.PRIVATE,
                name: `${APP_PREFIX}-private-subnet`,
                cidrMask: 28,
            },
        ],
    });

...这是网关:

const interfaceVpcEndpoint = vpc.addInterfaceEndpoint(`${APP_PREFIX}-endpoint`, {
    service: ec2.InterfaceVpcEndpointAwsService.APIGATEWAY,
    subnets: { subnetType: ec2.SubnetType.PRIVATE },
});

const restApiLogGroup = new logs.LogGroup(stack, `${APP_PREFIX}-log-group`, {
    logGroupName: `${APP_PREFIX}-log-group`,
});

return new gateway.RestApi(stack, `${APP_PREFIX}-rest-api`, {
    restApiName: `${APP_PREFIX}-rest-api`,
    endpointConfiguration: {
        types: [gateway.EndpointType.PRIVATE],
        vpcEndpoints: [interfaceVpcEndpoint],
    },
    retainDeployments: true,
    deployOptions: {
        stageName: 'v2',
        loggingLevel: gateway.MethodLoggingLevel.INFO,
        dataTraceEnabled: true,
        accessLogDestination: new gateway.LogGroupLogDestination(restApiLogGroup),
        accessLogFormat: gateway.AccessLogFormat.jsonWithStandardFields(),
    },
    policy: new iam.PolicyDocument({
        statements: [
            new iam.PolicyStatement({
                effect: iam.Effect.DENY,
                principals: [new iam.AnyPrincipal()],
                actions: ['execute-api:Invoke'],
                resources: ['execute-api:/*/POST/*'],
                conditions: {
                    StringNotEquals: {
                        'aws:sourceVpc': vpc.vpcId,
                    },
                },
            }),
            new iam.PolicyStatement({
                effect: iam.Effect.ALLOW,
                principals: [new iam.AnyPrincipal()],
                actions: ['execute-api:Invoke'],
                resources: ['execute-api:/*/POST/*'],
            }),
        ],
    }),
});

我的想法是,不应从 Internet 访问 lambda 函数,而只能从我将通过另一个堆栈部署的 Fargate 服务访问。

我认为这是问题所在:

cidrMask: 28

一个 /28 网络允许 16 个 IP 地址,而 AWS 占用其中的 3 个地址。

我不熟悉 CDK 类 来创建子网,所以不能说您使用的整体方法是否正确。我假设它足够聪明,可以根据您提供的掩码将 VPC CIDR 分成子网块。

我建议给每个子网至少一个 /24 分配;我更喜欢 /20。和 VPC 的 /16。网络配置在您开始时是免费的,之后更正非常昂贵。

我最终明确地将 VPC Construct 创建的默认安全组添加到每个 Lambda 并且成功了。