如何通过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
相关产品推荐
相关产品推荐

