#amazon-web-services #amazon-ec2 #amazon-vpc #vpc
#amazon-веб-сервисы #amazon-ec2 #amazon-vpc #vpc
Вопрос:
Есть ли какой-либо способ найти неиспользуемые VPC в учетной записи AWS?
Я имею в виду виртуальные машины, у которых нет экземпляров EC2, RDS и других связанных с ним сервисов.
Один из способов — просто выполнить поиск по идентификатору VPC в запущенных инстансах, RDS и других сервисах, чтобы узнать, используется он или нет. Есть ли какой-либо другой способ или интерфейс командной строки AWS для поиска неиспользуемых VPC?
Ответ №1:
В VPC должно быть включено много ресурсов, таких как:
- Инстансы Amazon EC2
- Экземпляры Amazon RDS
- Экземпляры Amazon Redshift
- Экземпляры Amazon Elasticache
- Эластичные балансировщики нагрузки
- Эластичные сетевые интерфейсы
- и так далее!
Вместо того, чтобы пытаться перебирать каждую из этих служб, вы можете перебирать эластичные сетевые интерфейсы (ENI), поскольку все подключается к VPC через ENI.
Вот команда, которую вы можете запустить с помощью интерфейса командной строки AWS (CLI), который показывает ENI, подключенные к данному VPC:
aws ec2 describe-network-interfaces --filters 'Name=vpc-id,Values=vpc-abcd1234' --query 'NetworkInterfaces[*].NetworkInterfaceId'
Если ENI не возвращаются, вы, вероятно, назовете это неиспользуемым VPC.
Ответ №2:
Это может показаться безумным, но я уверен, что вы можете попытаться удалить VPC. Он должен защищать от удаления любой VPC, в котором запущены ресурсы. Конечно, вам следует быстро попробовать, прежде чем делать это. Но это, вероятно, самый быстрый / чистый.
Ответ №3:
Пожалуйста, используйте следующий скрипт для определения неиспользуемых подсетей для ваших учетных записей 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()