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 并且成功了。
一段时间以来,我一直在尝试取消部署具有 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 并且成功了。