【发布时间】: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