Как найти неиспользуемый VPC в учетной записи AWS

#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()