如何在 AWS 账户中查找未使用的 VPC
How to find unused VPC in AWS account
有什么方法可以找到 AWS 账户中未使用的 VPC 吗?
我指的是没有任何 EC2 实例、RDS 和其他相关服务的 VPC。
一种方法是仅在 运行 个实例、RDS 和其他服务中使用 VPC ID 进行搜索,以了解它是否在使用中。有没有其他方法或 AWS CLI 可以找到未使用的 VPC?
这听起来很疯狂,但我很确定您可以尝试删除 VPC。它应该防止删除任何包含资源 运行 的 VPC。当然,您应该在执行此操作之前快速尝试一下。但它可能是 fastest/cleanest。
VPC中包含的资源有很多,例如:
- 亚马逊 EC2 实例
- Amazon RDS 实例
- Amazon Redshift 实例
- Amazon Elasticache 实例
- 弹性负载均衡器
- 弹性网络接口
- 等等!
您可以遍历 弹性网络接口 (ENI),而不是尝试遍历这些服务中的每一个,因为一切都通过 ENI 连接到 VPC。
这是一个您可以 运行 使用 AWS Command-Line Interface (CLI) 的命令,它显示附加到给定 VPC 的 ENI:
aws ec2 describe-network-interfaces --filters 'Name=vpc-id,Values=vpc-abcd1234' --query 'NetworkInterfaces[*].NetworkInterfaceId'
如果没有返回任何 ENI,那么您可能会称其为未使用的 VPC。
请使用以下脚本来识别所有区域中您的 AWS 账户未使用的子网:
用法:
- 请在帐户变量中添加帐户列表,如帐户=["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()
有什么方法可以找到 AWS 账户中未使用的 VPC 吗?
我指的是没有任何 EC2 实例、RDS 和其他相关服务的 VPC。
一种方法是仅在 运行 个实例、RDS 和其他服务中使用 VPC ID 进行搜索,以了解它是否在使用中。有没有其他方法或 AWS CLI 可以找到未使用的 VPC?
这听起来很疯狂,但我很确定您可以尝试删除 VPC。它应该防止删除任何包含资源 运行 的 VPC。当然,您应该在执行此操作之前快速尝试一下。但它可能是 fastest/cleanest。
VPC中包含的资源有很多,例如:
- 亚马逊 EC2 实例
- Amazon RDS 实例
- Amazon Redshift 实例
- Amazon Elasticache 实例
- 弹性负载均衡器
- 弹性网络接口
- 等等!
您可以遍历 弹性网络接口 (ENI),而不是尝试遍历这些服务中的每一个,因为一切都通过 ENI 连接到 VPC。
这是一个您可以 运行 使用 AWS Command-Line Interface (CLI) 的命令,它显示附加到给定 VPC 的 ENI:
aws ec2 describe-network-interfaces --filters 'Name=vpc-id,Values=vpc-abcd1234' --query 'NetworkInterfaces[*].NetworkInterfaceId'
如果没有返回任何 ENI,那么您可能会称其为未使用的 VPC。
请使用以下脚本来识别所有区域中您的 AWS 账户未使用的子网:
用法:
- 请在帐户变量中添加帐户列表,如帐户=["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()