【问题标题】:Boto3: How to check if VPC already exists before creating itBoto3:如何在创建之前检查 VPC 是否已经存在
【发布时间】:2021-11-06 16:18:44
【问题描述】:

我可以像这样快速创建一个 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')

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


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

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

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

【问题讨论】:

  • 您必须使用标签来验证 VPC 的存在。甚至 cloudformation 也在使用相同的机制。

标签: python-3.x amazon-web-services boto3 amazon-vpc vpc


【解决方案1】:

是的,您需要使用带有describe_vpcs API 的过滤器。

以下代码将列出同时匹配 Name 标签值和 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')

CIDR 块是 VPC 的主要检查。我建议只使用 CIDR 过滤器 而不是使用 Name 标记进行俱乐部,因为这样您可以防止创建具有相同 CIDR 块 的 VPC。

【讨论】:

  • 是的,不喜欢只检查Tags。我会在中午左右测试你的代码,然后告诉你这是否适合我。
  • 我可能需要做一些工作,但基本上它解决了我的目的。谢谢!
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多