En utilisant AWS re:Post, vous acceptez les AWS re:Post Conditions d’utilisation

Comment puis-je identifier, surveiller et optimiser l'utilisation IPv4 publique de mon VPC ?

Lecture de 7 minute(s)
0

Je souhaite identifier, surveiller et optimiser mon utilisation IPv4 d'Amazon Virtual Private Cloud (Amazon VPC).

Résolution

Remarque : À compter du 1er février 2024, toutes les adresses IPv4 publiques seront facturées 0,005 $ par adresse IP et par heure, qu'elles soient associées ou non à un service. Si vous êtes un client d’une offre gratuite d’AWS pour Amazon Elastic Compute Cloud (Amazon EC2), vous bénéficiez d’une utilisation gratuite de 750 heures. Cette utilisation gratuite est réservée au lancement d'une instance Amazon EC2 avec une adresse IPv4 publique.

Pour identifier, surveiller et optimiser votre utilisation d'IPv4, procédez comme suit :

Activer votre Public IP Insights

Utilisez Public IP Insights pour afficher gratuitement toutes les adresses IPv4 publiques actuellement utilisées par les services dans les régions AWS. Utilisez Public IP Insights pour surveiller, analyser et auditer l'utilisation de vos adresses IPv4 publiques.

Pour consulter les informations sur les adresses IP publiques, créez un pool IPAM sous Offre gratuite. De plus, après avoir configuré Public IP Insights, vous pouvez y accéder depuis le Gestionnaire d’adresses IP Amazon VPC.

Remarque : Une fois que vous avez créé un pool IPAM, Public IP Insights peut nécessiter du temps pour afficher les rapports relatifs à vos adresses IPv4 publiques.

Activer votre rapport de coûts et d'utilisation

Votre rapport de coûts et d'utilisation (CUR) AWS inclut des données d'utilisation relatives aux adresses IPv4 publiques utilisées ou non. Lorsque vous créez votre CUR, vous pouvez sélectionner Inclure des ID de ressource pour obtenir une analyse plus détaillée au niveau des ressources. Une fois que vous avez créé votre CUR, AWS met à jour les fichiers de rapport qui contient les données du mois à ce jour au moins une fois par jour. Cela vous permet d'analyser l'historique des données d'utilisation d'IPv4. Vous pouvez également accéder aux rapports depuis un compartiment Amazon Simple Storage Service (Amazon S3).

Remarque : La diffusion des rapports dans votre compartiment Amazon S3 par AWS peut prendre jusqu'à 24 heures.

Identifier immédiatement les adresses IPv4 publiques

Remarque : Il est recommandé d'utiliser CUR et Public IP Insights pour l'analyse planifiée de l'utilisation des adresses IPv4 publiques.

Pour identifier immédiatement les services qui utilisent des adresses IPv4 publiques, utilisez la console de gestion AWS ou l'AWS CLI.

Console de gestion AWS

Pour analyser vos interfaces réseau afin de vérifier les services qui consomment des adresses IPv4 publiques, procédez comme suit :

  1. Ouvrez la console Amazon EC2, puis sélectionnez Interfaces réseau.
  2. Utilisez le filtre pour sélectionner les adresses IPv4 publiques. Saisissez <*> pour la valeur. Ce filtre identifie toutes les interfaces réseau Elastic qui utilisent l'adresse IPv4 publique principale.
  3. Utilisez la description de l'interface réseau Elastic et le type d'interface pour identifier le service qui utilise l'adresse IPv4 publique.
  4. Pour afficher toutes les adresses IP publiques et secondaires dotées d'interfaces réseau Elastic dans une région, exécutez la commande suivante :
    Remarque : Remplacez example-region par la région requise.
    aws ec2 describe-network-interfaces --region example-region --query 'NetworkInterfaces[*].PrivateIpAddresses[?Association.PublicIp].Association.PublicIp[]' --output table

Pour les adresses IPv4 publiques utilisées par le VPN site à site, consultez la section Comment vérifier le statut actuel de mon tunnel VPN ?

Pour les adresses IPv4 publiques utilisées par Global Accelerator standard et personnalisé, consultez la section Affichage de vos accélérateurs.

Pour afficher les adresses IP Elastic inactives ou associées, procédez comme suit :

  1. Ouvrez la console Amazon EC2.
  2. Dans le volet de navigation, sélectionnez Réseau et sécurité, puis Adresses IP Elastic pour afficher les adresses IP Elastic.
  3. Pour afficher les ressources qui utilisent une adresse IP Elastic, sélectionnez d'abord l'adresse IP élastique. Puis, vérifiez l'interface réseau ou le champ d'instance pour obtenir de plus amples informations.

Remarque : Les BYOIP ne sont pas facturées. Les AWS Global Accelerators sont facturés dans us-west-2.

AWS CLI

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre les erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

Avant de commencer, procédez comme suit :

Procédez comme suit :

Remarque : Vous pouvez effectuer les étapes suivantes depuis AWS CloudShell ou tout autre environnement Linux.

  1. Créez le fichier suivant :

    touch public_ipv4_recon.py
  2. Modifiez le fichier :

    vim public_ipv4_recon.py
  3. Copiez et collez le code suivant dans le fichier, puis enregistrez le fichier :

    #!/usr/bin/env python3
    import pprint
    import boto3, sys
    
    profile = boto3.Session(profile_name=sys.argv[1])
    aga = profile.client('globalaccelerator', region_name='us-west-2')
    ec2 = boto3.client('ec2')
    
    def global_public_ipv4_lookup(aga):
      try:
        # global accelerator
        next_token = None
        while True:
          if next_token:
            resource = aga.list_accelerators(
            NextToken = next_token
              )
          else:
            resource = aga.list_accelerators(
            )
          print('Describing world wide Global Accelerators...')
          print('Note: AWS Global Accelerators are billed in us-west-2....')
          print(f'Number of AGA: {len(resource["Accelerators"])}')
          print('-'*40)
          for item in resource["Accelerators"]:
            print(f'Name: {item["Name"]}')
            if 'IpSets' in item.keys():
              for ip in item["IpSets"][0]["IpAddresses"]:
                print(f'Public IPv4: {ip}')
            print(f'Status: {item["Status"]}')
            print()
          next_token = resource.get("NextToken")
          if next_token is None:
            break
        print()
        # custom_routing_accelerators
        next_token = None
        while True:
          if next_token:
            custom_routing = aga.list_custom_routing_accelerators(
              NextToken = next_token
            )
          else:
            custom_routing = aga.list_custom_routing_accelerators(
            )
          print('Describing world wide Custom Routing Accelerators...')
          print('Note: AWS Global Accelerators are billed in us-west-2....')
          print(f'Number of custom AGA: {len(custom_routing["Accelerators"])}')
          print('-'*40)
          for item in custom_routing["Accelerators"]:
            if 'IpSets' in item.keys():
              for ip in item["IpSets"][0]["IpAddresses"]:
                print(f'Public IPv4: {ip}')
            print(f'Status: {item["Status"]}')
            print()
          next_token = custom_routing.get("NextToken")
          if next_token is None:
            break
        print()
      except Exception as err:
        print(f'Error found: {err}...')
        pass
    
    def public_ipv4_lookup(ec2):
      try:
        # vpn
        next_token = None
        while True:
          if next_token:
            vpn = ec2.describe_vpn_connections(
                  NextToken = next_token
            )
          else:
            vpn = ec2.describe_vpn_connections(
            )
          print('Describing VPNs...')
          print(f'Number of Vpn connections: {len(vpn["VpnConnections"])}')
          print('-'*40)
          for item in vpn["VpnConnections"]:
            if 'VpnConnectionId' in item.keys():
              print(f'Vpn Id: {item["VpnConnectionId"]}')
              for ip in item["VgwTelemetry"]:
                print(f'Public ipv4: {ip["OutsideIpAddress"]}')
            print()
          next_token = vpn.get("NextToken")
          if next_token is None:
            break
        print()
        # elastic ip
        eip = ec2.describe_addresses(
        )
        print('Describing Elastic IPs...')
        print(f'Number of Elastic Ips: {len(eip["Addresses"])}')
        print('-'*40)
        for item in eip["Addresses"]:
          if 'AllocationId' in item.keys():
            print(f'Eip Id: {item["AllocationId"]}')
            print(f'Public ipv4: {item["PublicIp"]}')
            print()
        print()
        # network interfaces
        next_token = None
        while True:
          if next_token:
            interface = ec2.describe_network_interfaces(
            NextToken=next_token
              )
          else:
            interface = ec2.describe_network_interfaces(
            )
          print('Describing Network Interfaces...')
          print(f'Number of interfaces: {len(interface["NetworkInterfaces"])}')
          print('Only printing Interfaces with a public IPv4 address...')
          print('-'*40)
          for item in interface["NetworkInterfaces"]:
            #print(f'Private Ip: {item["PrivateIpAddress"]}')
            for ip in item["PrivateIpAddresses"]:
              if 'Association' not in ip.keys():
                pass
              else:
                print(f'Interface Id: {item["NetworkInterfaceId"]}')
                print(f'Description: {item["Description"]}')
                print(f'Status: {interface["NetworkInterfaces"][0]["Status"]}')
                print(f'Public Ip: {ip["Association"]["PublicIp"]}\n')
          next_token = interface.get("NextToken")
          if next_token is None:
            break
      except Exception as err:
        print(f'Error found: {err}...')
        pass
    
    # Run code
    if len(sys.argv) < 3 or not sys.argv[2]:
      global_public_ipv4_lookup(aga)
      regions_list = ec2.describe_regions(
          AllRegions=False
      )
      for region in regions_list['Regions']:
        if region["OptInStatus"] == 'opted-in' or 'opt-in-not-required':
          print(f'\n**********-[{region["RegionName"]}]-**********\n')
          public_ipv4_lookup(
            ec2=profile.client('ec2', region_name=region["RegionName"])
            )
    elif sys.argv[2]:
      #ec2 = profile.client('ec2', region_name=sys.argv[2])
      global_public_ipv4_lookup(aga)
      public_ipv4_lookup(
        ec2=profile.client('ec2', region_name=sys.argv[2])
        )
  4. Exécutez le script : 
    Remarque : Remplacez example-cli profile par le nom du profil AWS CLI configuré ou par tout nom de profil défini dans le fichier .aws/credentials. Remplacez example-region par la région requise.
    Pour vérifier toutes les régions, utilisez cette commande :

    # python3 public_ipv4_recon.py <example-cli-profile>

    Pour vérifier une région spécifique, utilisez cette commande :

    # python3 public_ipv4_recon.py <example-cli-profile> <example-region>

Remarque : L'erreur suivante peut s'afficher lorsque vous exécutez le script. Cette erreur indique que vous n'êtes peut-être pas autorisé à exécuter la demande ou que la région est désactivée pour votre compte.

« Error found: An error occurred (AuthFailure) when calling the <API> operation: AWS was not able to validate the provided access credentials... »

Optimiser l'utilisation des adresses IPv4 publiques et adopter les adresses IPv6

Pour optimiser les coûts, améliorez votre architecture actuelle afin de minimiser l'utilisation d'adresses IPv4 publiques. Il est également recommandé de migrer raidement vers IPv6. La migration vers IPv6 est une solution économique sans frais pour les adresses IP.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 8 mois