当前位置: 首页 > 知识库问答 >
问题:

如何在AWS帐户中查找未使用的VPC

嵇财
2023-03-14

有没有办法在AWS帐户中找到未使用的VPC?

我指的是没有任何EC2实例、RDS和其他相关服务的VPC。

一种方法是在正在运行的实例、RDS和其他服务中使用VPC ID进行搜索,以确定它是否在使用中。有没有其他方法或AWS CLI来查找未使用的VPC?

共有3个答案

司徒元明
2023-03-14

请使用以下脚本为您在所有地区的AWS帐户识别未使用的子网:

用法:

  • 请在accounts变量中添加accounts=[“a1”、“a2”、“a3”]
  • 它将查询并提供各个帐户在所有地区的子网列表
  • 每次运行结束时,将为一个帐户创建一个CSV文件

逻辑:

>

  • 查询所有区域的所有子网以获取AWS帐户

    获取子网当前可用的IP详细信息(由AWS API提供)

    获取子网CIDR,计算总IP计数,减去5个计数(5个,因为2个用于网络和广播,另外3个默认由AWS保留)

    然后,减去总IP-可用=当前使用的IP。如果使用的IP=0,可以清理子网

     import boto3
     import sys
     import csv
     import ipaddress
    
     def describe_regions(session):
         try:
             aws_regions = []
             ec2_client = session.client('ec2')
             response_regions = ec2_client.describe_regions()['Regions']
             for region in response_regions:
                 aws_regions.append(region['RegionName'])
             return aws_regions
         except Exception:
             print("Unexpected error:", sys.exc_info()[0])
    
    
     def describe_vpc(ec2,aws_region,writer,profile_name):
         try:
             response_vpc = ec2.describe_vpcs()['Vpcs']
             for vpc in response_vpc:
                 print('=' * 50)
                 count = 0
                 filters = [
                     {'Name': 'vpc-id',
                      'Values': [vpc['VpcId']]}
                 ]
    
                 response_subnets = ec2.describe_subnets(Filters=filters)['Subnets']
    
                 for subnets in response_subnets:
                     count += 1
                     total_count = (ipaddress.ip_network(subnets['CidrBlock']).num_addresses) - 5
                     Used_IP = total_count - subnets['AvailableIpAddressCount']
                     writer.writerow({"Account": profile_name, "VpcId": vpc['VpcId'], "VpcCidr": vpc['CidrBlock'], "Region": aws_region,
                                 "Subnet": subnets['CidrBlock'], "SubnetId": subnets['SubnetId'], "AvailableIPv4": subnets['AvailableIpAddressCount'], "Total_Network_IP": str(total_count),
                                 "AvailabilityZone": subnets['AvailabilityZone'],"Used_IP": str(Used_IP)})
                     print({"Account": profile_name, "VpcId": vpc['VpcId'], "VpcCidr": vpc['CidrBlock'], "Region": aws_region,
                                 "Subnet": subnets['CidrBlock'], "SubnetId": subnets['SubnetId'], "AvailableIPv4": subnets['AvailableIpAddressCount'], "Total_Network_IP": str(total_count),
                                 "AvailabilityZone": subnets['AvailabilityZone'],"Used_IP": str(Used_IP)})
                 print('='*50)
         except Exception:
             print("Unexpected error:", sys.exc_info()[0])
    
    
     def main():
         try:
    
             accounts=["<Account names here as list>"]
             for profile in accounts:
                 session = boto3.session.Session(
                     profile_name=profile
                 )
                 file_name = profile
                 print("File Name: " +file_name)
                 profile_name = profile
                 print("Profile_name: " +profile_name)
                 with open(file_name + ".csv", "w", newline="") as csvfile:
                     fieldnames = [
                         "Account", "VpcId",
                         "VpcCidr", "Region",
                         "Subnet", "SubnetId",
                         "AvailableIPv4","Total_Network_IP",
                         "AvailabilityZone","Used_IP"
                     ]
                     writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                     writer.writeheader()
                     aws_regions = describe_regions(session)
                     for aws_region in aws_regions:
                         ec2 = session.client('ec2', region_name=aws_region)
                         print("Scanning region: {}".format(aws_region))
                         describe_vpc(ec2,aws_region, writer, profile_name)
    
         except Exception:
             print("Unexpected error:", sys.exc_info()[0])
             raise
    
    
     if __name__ == "__main__":
         main()
    

  • 井旺
    2023-03-14

    这听起来可能很疯狂,但我很确定您可以尝试删除VPC。它应该防止删除任何在其中运行资源的VPC。当然,您应该在这样做之前快速尝试一下。但它可能是最快/最干净的。

    和选
    2023-03-14

    VPC中包含许多资源,例如:

    • Amazon EC2实例
    • Amazon RDS实例
    • Amazon Redshift实例
    • Amazon Elasticache实例
    • 弹性负载平衡器
    • 弹性网络接口
    • 等等!

    您可以通过弹性网络接口(Elastic Network Interface,ENI)进行迭代,而不是尝试遍历这些服务中的每一项,因为所有东西都通过ENI连接到VPC。

    下面是一个可以使用AWS命令行界面(CLI)运行的命令,显示连接到给定VPC的ENIs:

    aws ec2 describe-network-interfaces --filters 'Name=vpc-id,Values=vpc-abcd1234' --query 'NetworkInterfaces[*].NetworkInterfaceId'
    

    如果没有返回ENI,那么您可能会将其称为未使用的VPC。

     类似资料:
    • 我有一个根帐户是1234(帐户ID),我有启用MFA的身份验证,我的用户名是myuser12。我可以使用帐户ID、用户名和密码登录。它将请求MFA令牌代码。一旦我输入了令牌代码。我可以在我的根帐户下查看特定位置的实例。 我可以使用我的角色(在我的情况下,所有帐户的角色都是相同的)以及该角色的任何别名将角色切换到新帐户(5678)。切换角色完成后,我可以在特定位置看到新帐户下的所有实例。 通过网络控

    • 我有一个aws组织,有几个S3桶和成员帐户。我在其中一个S3 bucket中添加了bucket策略,允许根据aws在下面URL中提供的文档从成员帐户访问它。 但是在登录了特定的会员账号之后,我仍然无法在那里看到S3的bucket。所以请告诉我这里出了什么问题。

    • 使用AWS CLI时,它会引用位于~/.AWS目录中的凭据和配置文件。您可以使用--profile标志来指示需要哪个帐户。例如: 等 但是我对python 3和boto 3的脚本是新手,我想在那里做同样的事情。如何使用python在AWS帐户之间切换?

    • 我刚刚开始和AWS一起工作,学习AWS。我正在使用AWS移动中心的服务,到目前为止已经设置了登录 一切正常,现在我正在处理忘记密码和更新密码。 问题是,AWS设置忘记密码的方式是: 首先输入用户名,然后在用户输入用户名后,AWS通过SMS向与该用户名关联的电话号码发送验证码。 这是一个问题,因为这意味着任何人都可以输入任何用户名,并会发送一条短信,导致我的短信付款增加,老实说,这看起来很草率。 我

    • 我正在使用AWS CDK来构建我的lambda,我想从lambda的CDK堆栈中注册endpoint。 我发现我可以使用fromRestApiId(scope,id,restApiId)获得现有的ApiGateway构造(这里有文档) 所以目前这工作得很好: 但我想部署到许多AWS帐户和许多地区。我不想为每个帐户区域对硬编码API\U GATEWAY\U ID或API\U GATEWAY\U RO

    • 我所做的: 我在这些帐户之间创建了VPC对等连接 还连接到每个VPC的Internet网关 路由表也已配置(允许来自两侧的流量) 案例1: “ErrorMessage”:“调用Invoke操作时发生错误(AccessDeniedException):User:arn:aws:sts::Account-a:Assumed-Role/Role-for-VPC-peering-test/lambda1_