Boto3:如何在创建 VPC 之前检查它是否已经存在

Mac*_*ers 2 vpc amazon-web-services python-3.x amazon-vpc boto3

我可以像这样快速创建一个 VPC:

import boto3 as boto

inst = boto.Session(profile_name='myprofile').resource('ec2')

def createVpc(nid,az='us-west-2'):
    '''Create the VPC'''
    vpc = inst.create_vpc(CidrBlock = '10.'+str(nid)+'.0.0/16')
    vpc.create_tags(
        Tags = [ { 'Key': 'Name', 'Value': 'VPC-'+nid }, ]
    )
    vpc.wait_until_available()

createVpc('111')
Run Code Online (Sandbox Code Playgroud)

如何使用 CidrBlock:10.111.0.0/16或 Name:VPC-111在创建之前检查 VPC已存在?我实际上想在创建任何 AWS 资源之前进行相同的检查,但 VPC 只是一个开始。最好的事物!


编辑: 发现vpcs.filter可用于查询给定的 VPC 标签;例如:

fltr = [{'Name':'tag:Name', 'Values':['VPC-'+str(nid)]}]
list(inst.vpcs.filter(Filters=fltr))
Run Code Online (Sandbox Code Playgroud)

返回这样一个列表对象:[ec2.Vpc(id='vpc-43e56b3b')]。长度为 0(零)的列表很好地表明 VPC 不存在,但想知道是否有更多 boto/aws 检测方法。

Mad*_*aju 7

是的,您需要将过滤器与describe_vpcsAPI一起使用。

以下代码将列出与名称标签值和 CIDR块匹配的所有 VPC :

import boto3

client = boto3.client('ec2',region_name='us-east-1')
response = client.describe_vpcs(
    Filters=[
        {
            'Name': 'tag:Name',
            'Values': [
                '<Enter you VPC name here>',
            ]
        },
        {
            'Name': 'cidr-block-association.cidr-block',
            'Values': [
                '10.0.0.0/16', #Enter you cidr block here
            ]
        },        
    ]
)
resp = response['Vpcs']
if resp:
    print(resp)
else:
    print('No vpcs found')
Run Code Online (Sandbox Code Playgroud)

CIDR块是 VPC 的主要检查。我建议只使用CIDR 过滤器,而不是使用名称标签进行泡吧,因为这样您就可以防止使用相同的CIDR 块创建 VPC 。