【问题标题】:AWS Subnet is out of IP Addresses (using CDK)AWS 子网没有 IP 地址(使用 CDK)
【发布时间】:2021-03-08 16:57:30
【问题描述】:

一段时间以来,我一直在尝试部署具有 20 个 lambda 函数的 RestApiGateway,但每次尝试部署时,我都会收到错误消息 Subnet is out of 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/*'],
            }),
        ],
    }),
});

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

【问题讨论】:

  • 该子网中还有什么正在运行?错误消息没有骗你。
  • 这是一个新帐户,这是我运行的仅有的两个堆栈。您是指特定的资源吗?
  • 您的私有子网中的某些 IP 地址是否被其他服务使用?您的私人网络中只会获得 11 个 IP。很有可能它们都已用完,因此您会收到此错误消息。检查您的私有子网的 IP 分配。
  • 谢谢。为什么我只有11个IP,你从哪里得到这个数字?此外,当我按照上面的堆栈部署超过 10 个 lambda 函数时,确实会发生故障。这是否意味着每个 lambda 函数都占用了一个 IP 地址?为什么这样?他们不是都暴露在同一个网关后面吗?
  • 不太清楚 lambda 在网关后面的工作方式。可能@Parsifal 的答案可以帮助您,但 regd IP 地址的可用性很简单。如果您使用 28 个掩码,您将获得 16 个可用地址,其中第一个和最后一个保留用于广播和其他内容,其他 3 个由亚马逊保留。您创建的每个 CIDR 都会发生这种情况。 Aws 将始终保留 5 个并将剩余的留给您使用。

标签: amazon-web-services aws-lambda aws-api-gateway aws-cdk aws-rest-api


【解决方案1】:

我认为这是问题所在:

cidrMask: 28

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

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

我建议至少为每个子网分配 /24;我更喜欢 /20。还有一个/16 到 VPC。开始时网络配置是免费的,以后更正的成本非常高。

【讨论】:

  • 谢谢,我可以做到,但我很担心为什么我附加到网关的每个 lambda 函数都可能为自己占用一个 IP 地址?!
  • @Sammy - 在某些情况下,多个 Lambda 在 VPC 中运行时可以共享相同的网络接口(IP 地址)。在其他人中,他们不能。例如,如果您为每个附加了不同的安全组。
  • 谢谢你,这最终帮助我找到了解决方案。
【解决方案2】:

我最终明确地将 VPC 构造创建的默认安全组添加到每个 Lambda 并且有效。

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2020-02-04
    • 2018-03-09
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2020-04-26
    相关资源
    最近更新 更多