簡體   English   中英

如何在 AWS 賬戶中找到未使用的 VPC

[英]How to find unused VPC in AWS account

有沒有辦法在 AWS 賬戶中找到未使用的 VPC?

我的意思是沒有任何 EC2 實例、RDS 和其他相關服務的 VPC。

一種方法是在正在運行的實例、RDS 和其他服務中使用 VPC ID 進行搜索,以了解它是否在使用中。 有沒有其他方法或 AWS CLI 可以找到未使用的 VPC?

VPC中包含許多資源,例如:

  • Amazon EC2實例
  • Amazon RDS實例
  • Amazon Redshift實例
  • Amazon Elasticache實例
  • 彈性負載均衡器
  • 彈性網絡接口
  • 等等!

您可以遍歷彈性網絡接口 (ENI),而不是嘗試遍歷每個服務,因為所有內容都通過ENI連接到VPC。

這是您可以使用AWS命令行界面(CLI)運行的命令,該命令顯示附加到給定VPC的ENI:

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

如果沒有返回ENI,那么您可能將其稱為未使用的VPC

這可能聽起來很瘋狂,但我很確定你可以嘗試刪除VPC。 它應該防止刪除任何有資源在其中運行的VPC。 當然,你應該在做之前快速嘗試一下。 但它可能是最快/最干凈的。

請使用以下腳本為您的 AWS 賬戶在所有區域識別未使用的子網:

用法:

  • 請在accounts變量中添加賬戶列表為accounts=["a1","a2","a3"]
  • 它將查詢並提供各個帳戶的所有區域的子網列表
  • 每次運行結束時將為一個帳戶創建一個 CSV 文件

邏輯:

  • 查詢一個 AWS 賬戶跨所有區域的所有子網

  • 獲取子網當前可用的 IP 詳細信息(由 AWS API 提供)

  • 獲取子網 CIDR,計算總 IP 數,減去 5 個計數(5 個,因為 2 個用於網絡和廣播,另外 3 個由 AWS 默認保留)

  • 然后,減去總 IP - 可用 = 當前使用的 IP。 如果 Used 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM