如何解决AWS 子网没有 IP 地址使用 CDK
一段时间以来,我一直在尝试使用 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,});
这个想法是不应该从 Internet 访问 lambda 函数,只能从我将通过另一个堆栈部署的 Fargate 服务访问。
解决方法
我认为这是问题所在:
cidrMask: 28
一个 /28 网络允许 16 个 IP 地址,而 AWS 会占用其中的 3 个地址。
我不熟悉用于创建子网的 CDK 类,因此不能说您使用的整体方法是否正确。我假设它足够聪明,可以根据您为掩码提供的内容将 VPC CIDR 分成子网块。
我建议至少为每个子网分配一个/24;我更喜欢/20。和一个 /16 到 VPC。开始时网络配置是免费的,以后更正成本非常高。
,我最终将 VPC 构造创建的默认安全组显式添加到每个 Lambda 并且有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。