Passer au contenu

Comment identifier, surveiller et optimiser l'utilisation de mon adresse IPv4 publique Amazon VPC ?

Lecture de 7 minute(s)
0

Je souhaite identifier, surveiller et optimiser l’utilisation de mon adresse IPv4 Amazon Virtual Private Cloud (Amazon VPC).

Résolution

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 des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.

Toutes les adresses IPv4 publiques entraînent des frais de 0,005 $ pour chaque adresse IP par heure, qu'elle soit associée à un service ou non. Si vous êtes un client d’une offre gratuite 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.

Activer Public IP Insights

Vous pouvez utiliser Public IP Insights pour surveiller, analyser et auditer les adresses IPv4 publiques que vos services utilisent actuellement dans les régions AWS.

Pour activer Public IP Insights, créez un pool Gestionnaire d'adresses IP (IPAM) Amazon VPC. Pour identifier l'utilisation des adresses IPv4 publiques, intégrez Public IP Insights IPAM à un compte AWS unique ou à vos comptes AWS Organizations.

Remarque : Aucun coût n’est associé à Public IP Insights dans le cadre de l’offre gratuite. Pour plus d'informations sur la tarification du niveau avancé, consultez l'onglet IPAM de la page de tarification d'Amazon VPC. Lorsque vous intégrez IPAM à des organisations, vous pouvez utiliser Public IP Insights pour toutes les régions et tous les comptes de votre organisation, même dans l’offre gratuite.

Pour consulter les résultats, vous pouvez utiliser la console Amazon VPC ou l'AWS CLI.

Remarque : Après avoir créé un pool IPAM, Public IP Insights génère un rapport pour vos adresses IPv4 publiques. Le temps nécessaire pour générer le rapport dépend de la taille de votre organisation.

Activer votre rapport d’utilisation et de coût

Votre rapport de coût et d’utilisation AWS (CUR) inclut des données d'utilisation pour les adresses IPv4 publiques utilisées et non utilisées. Lorsque vous créez votre CUR, sélectionnez Inclure des ID de ressource pour obtenir une analyse 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. Vous pouvez utiliser les fichiers de rapport pour analyser les données historiques d'utilisation des adresses IPv4.

Remarque : Vous pouvez également accéder aux rapports depuis un compartiment Amazon Simple Storage Service (Amazon S3). AWS peut mettre jusqu’à 24 heures à diffuser des rapports dans votre compartiment Amazon S3.

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 Amazon EC2 ou l'AWS CLI.

Console Amazon EC2

Pour analyser vos interfaces réseau afin de visualiser les services AWS qui utilisent des adresses IPv4 publiques, procédez comme suit :

  1. Ouvrez la console Amazon EC2.
  2. Dans le volet de navigation, sous Réseau et sécurité, sélectionnez Interfaces réseau.
  3. Dans le filtre Adresses IPv4 publiques, saisissez <*> pour identifier les interfaces réseau Elastic qui utilisent l'adresse IPv4 publique principale.
  4. Utilisez la description de l'interface réseau et le type d'interface pour identifier le service qui utilise l'adresse IPv4 publique.
  5. Pour afficher toutes les adresses IP publiques et secondaires dotées d'interfaces réseau dans une région, exécutez la commande suivante :
    aws ec2 describe-network-interfaces --region example-region --query 'NetworkInterfaces[*].PrivateIpAddresses[?Association.PublicIp].Association.PublicIp[]' --output table
    Remarque : Vous devez remplacer example-region par votre région.

Pour les adresses IPv4 publiques utilisées par l’AWS Site-to-Site VPN, consultez la section Comment vérifier le statut actuel de mon tunnel VPN ?

Pour les adresses IPv4 publiques utilisées par AWS 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, sous Réseau et sécurité, choisissez Adresses IP Elastic.
  3. Sélectionnez une adresse IP Elastic pour afficher les ressources qui utilisent cette adresse IP Elastic.
    Remarque : Pour plus d'informations sur l'utilisation, consultez les champs Interface réseau ou Instance.

Aucun frais n’est exigé pour la Fourniture de vos propres adresses IP (BYOIP). AWS facture Global Accelerator dans la région us-west-2.

AWS CLI

Prérequis : Exécutez la commande aws configure de l’AWS CLI pour définir vos informations d'identification. Installez également Boto3. Pour plus d'informations, consultez la page Installer Boto3 sur le site Web de Boto3.

Pour identifier immédiatement les services qui utilisent des adresses IPv4 publiques, effectuez les étapes suivantes depuis un environnement AWS CloudShell ou Linux :

  1. Créez le fichier suivant :

    touch public_ipv4_recon.py
  2. Exécutez la commande suivante pour modifier 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"]:
            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]:
      global_public_ipv4_lookup(aga)
      public_ipv4_lookup(
        ec2=profile.client('ec2', region_name=sys.argv[2])
        )
  4. Pour vérifier toutes les régions, exécutez la commande suivante :

    python3 public_ipv4_recon.py example-cli-profile

    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. Si vous utilisez Windows, remplacez python3 par python.
    -ou-
    Pour vérifier une région spécifique, exécutez la commande suivante :

    python3 public_ipv4_recon.py example-cli-profile example-region

    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 votre région.

Si vous n'êtes pas autorisé à exécuter la requête ou si la région est désactivée pour votre compte, le message d'erreur suivant peut s'afficher :

« 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 recommandé de migrer vers IPv6. Aucun frais n’est exigé pour les adresses IPv6.

AWS OFFICIELA mis à jour il y a 7 mois