You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AWS CDK列举当前AWS账号下的所有可用VPC

实现方案

目前有两种成熟的实现思路,可以适配不同的使用场景:


方案1:使用CDK内置Lookup功能筛选VPC

CDK的ec2.Vpc.from_lookup支持不指定具体vpc_id,通过传入筛选条件匹配目标VPC,查询操作会在synth阶段执行,结果默认缓存到cdk.context.json中避免重复请求。
如果需要匹配特定条件的VPC,可以参考如下Python示例:

from aws_cdk import Stack
from aws_cdk import aws_ec2 as ec2
import constructs

class VpcLookupStack(Stack):
    def __init__(self, scope: constructs.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # 可自定义筛选条件,比如按标签、CIDR块、是否为默认VPC筛选
        target_vpc = ec2.Vpc.from_lookup(self, "target-vpc", 
            tags={"business": "offline"},
            is_default=False
        )
        
        # 直接获取匹配VPC的ID、CIDR、子网等属性
        print(target_vpc.vpc_id, target_vpc.vpc_cidr_block, target_vpc.private_subnets)

注意:如果筛选条件匹配到多个VPC,from_lookup会默认抛出错误,需要调整条件确保唯一匹配;如果需要获取全量VPC信息,建议使用方案2。


方案2:在CDK代码中调用boto3查询全量VPC

如果需要灵活获取所有VPC做自定义逻辑(比如自动计算下一个可用CIDR块),可以直接在CDK代码中引入boto3,在synth阶段调用EC2的API查询所有VPC信息,效果和CLI执行aws ec2 describe-vpcs完全一致:

import boto3
from aws_cdk import Stack
import constructs
from aws_cdk import aws_ec2 as ec2

class VpcAutoCreateStack(Stack):
    def __init__(self, scope: constructs.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        # 调用boto3查询当前区域所有VPC
        ec2_client = boto3.client("ec2")
        all_vpcs = ec2_client.describe_vpcs()["Vpcs"]
        
        # 提取所有已使用的VPC CIDR块
        used_vpc_cidrs = [vpc["CidrBlock"] for vpc in all_vpcs]
        
        # 自定义逻辑计算下一个未被使用的CIDR块,示例为在10.0.0.0/8段下找第一个可用的/16段
        next_available_cidr = None
        for segment in range(0, 256):
            candidate_cidr = f"10.{segment}.0.0/16"
            if candidate_cidr not in used_vpc_cidrs:
                next_available_cidr = candidate_cidr
                break
        
        # 用自动计算得到的CIDR创建VPC
        new_vpc = ec2.Vpc(self, "auto-created-vpc",
            cidr=next_available_cidr,
            max_azs=2
        )

注意:执行cdk命令的环境需要具备EC2只读权限,否则boto3调用会失败;如果是跨账号/跨区域部署,需要提前配置boto3的凭证、区域参数和CDK部署的目标环境一致。


自动分配CIDR需求补充

如果需要避免和已有VPC下的子网CIDR冲突,只需要在查询完VPC之后额外调用describe_subnets接口,拿到所有子网的CIDR块加入已使用的CIDR列表判断即可。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:54:01