Réserver une adresse IP statique externe

Vous pouvez réserver des adresses IP externes statiques. Vous pouvez également lister et libérer vos adresses IP externes statiques réservées. Pour attribuer une adresse IP externe statique à une instance de machine virtuelle (VM), consultez la page Configurer des adresses IP externes statiques.

Les adresses IP externes peuvent être statiques ou éphémères. Si une VM nécessite une adresse IP externe fixe qui ne change pas, vous pouvez l'obtenir de l'une des façons suivantes : Vous pouvez réserver de nouvelles adresses IP externes ou convertir des adresses IP externes éphémères existantes.

Si vous avez besoin d'une adresse IP interne statique, consultez la page Réserver une adresse IP interne statique.

Avant de commencer

  • En savoir plus sur les adresses IP.
  • En savoir plus sur les quotas et limites pour les adresses IP externes statiques.
  • Consultez la section sur la tarification des adresses IP externes.
  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier comme suit :

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    Install the Google Cloud CLI, then initialize it by running the following command:

    gcloud init

    Terraform

    Pour utiliser les exemples Terraform de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local dans la documentation sur l'authentification Google Cloud.

    REST

    Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

    Pour en savoir plus, consultez la section S'authentifier pour utiliser REST dans la documentation sur l'authentification Google Cloud.

Rôles requis

Pour obtenir les autorisations nécessaires pour réserver et gérer des adresses IP statiques, demandez à votre administrateur de vous accorder le rôle IAM Administrateur de réseaux Compute (roles/compute.networkAdmin) sur votre projet. Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

Ce rôle prédéfini contient les autorisations requises pour réserver et gérer des adresses IP statiques. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Vous devez disposer des autorisations suivantes pour réserver et gérer des adresses IP statiques :

  • compute.addresses.create sur l'adresse IP
  • compute.addresses.createInternal sur l'adresse IP
  • compute.networks.list sur le réseau
  • compute.subnetworks.use sur le sous-réseau
  • compute.subnetworks.list sur le sous-réseau

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

À propos des adresses IP externes statiques

Une adresse IP externe statique est une adresse IP réservée pour votre ressource jusqu'à ce que vous décidiez de la libérer. Si vous disposez d'une adresse IP qui permet à vos clients ou utilisateurs d'accéder à votre service, vous pouvez réserver cette adresse IP pour qu'elle ne puisse être utilisée que par votre ressource. Vous pouvez également convertir une adresse IP externe éphémère en adresse IP externe statique.

Pour en savoir plus, consultez la section Adresses IP.

Le tableau suivant répertorie les adresses IP externes statiques compatibles avec Google Cloud.

Type d'adresse IP Ressource Plage d'adresses IP Source Associée à
Adresses IPv6 externes régionales VM et équilibreurs de charge régionaux /32 Pool d'adresses IP externes de Google Projet
Adresses IPv6 externes régionales VM et équilibreurs de charge régionaux compatibles /96 Plage d'adresses IPv6 externes du sous-réseau Sous-réseau
Adresses IPv4 externes globales Équilibreurs de charge mondiaux /32 Pool d'adresses IP externes de Google Projet
Adresses IPv6 externes globales Équilibreurs de charge mondiaux /64 Pool d'adresses IP externes de Google Projet

Pour consulter la liste des équilibreurs de charge régionaux et globaux, consultez le Récapitulatif des types d'équilibreurs de charge.

Limites

  • Une adresse IP externe statique peut être utilisée par une seule ressource à la fois.

  • Il n'y a aucun moyen de vérifier si une adresse IP est statique ou éphémère après son attribution à une ressource. Vous pouvez comparer l'adresse IP à la liste des adresses IP externes statiques réservées pour ce projet. Exécutez la sous-commande gcloud compute addresses list pour afficher la liste des adresses IP externes statiques disponibles pour le projet.

  • Chaque VM peut avoir plusieurs interfaces réseau, et chaque interface peut avoir les adresses IP suivantes :

    • Une adresse IPv4 interne (obligatoire)
    • Une adresse IPv4 externe
    • Une plage d'adresses IPv6 /96, internes ou externes, mais pas les deux
  • Vous ne pouvez pas modifier le nom d'une adresse IP statique.

  • Les adresses IP externes attribuées existent sur le même hôte physique que la VM et existent dans la même région que la VM à toutes fins, y compris pour le routage, la latence et les tarifs. Cela est valable quelles que soient les informations de recherche de géolocalisation Internet.

Remarque : Les interfaces réseau peuvent recevoir du trafic provenant de plusieurs règles de transfert, qui peuvent diffuser d'autres adresses IP externes. Le nombre d'adresses IP externes pouvant faire référence à une interface réseau via ces règles de transfert est libre, en revanche, chaque interface réseau ne peut se voir attribuer qu'une seule adresse IPv4 externe et une seule plage d'adresses IPv6 externes /96.

Pour en savoir plus sur l'équilibrage de charge et les règles de transfert, consultez la documentation sur l'équilibrage de charge.

Réserver une nouvelle adresse IP externe statique

Une fois l'adresse réservée, attribuez-la à une nouvelle VM lors de sa création ou à une VM existante.

Console

  1. Dans la console Google Cloud, accédez à la page Adresses IP.

    Accéder à la page "Adresses IP"

  2. Cliquez sur Réserver une adresse IP statique externe.
  3. Dans le champ Nom, saisissez un nom d'adresse IP.
  4. Indiquez si le niveau de service réseau est Premium ou Standard. La réservation d'adresse statique IPv6 n'est acceptée qu'avec le niveau Premium.
  5. Indiquez s'il s'agit d'une adresse IPv4 ou IPv6.
  6. Choisissez si cette adresse IP est régionale ou globale.
    • Si vous réservez une adresse IP statique pour un équilibreur de charge global, sélectionnez Global, puis cliquez sur Réserver.
    • Si vous réservez une adresse IP statique pour une VM ou pour un équilibreur de charge régional, sélectionnez Régional, puis sélectionnez la région dans laquelle créer l'adresse.
  7. Si vous réservez une adresse IPv6 externe régionale, choisissez également les éléments suivants :

    • Réseau : le réseau VPC
    • Sous-réseau : sous-réseau à partir duquel attribuer l'adresse IPv6 régionale statique
    • Type de point de terminaison : choisissez Instance de VM ou Équilibreur de charge réseau.
  8. Facultatif : Si vous réservez l'adresse IP externe statique pour une VM, sélectionnez une VM à laquelle associer l'adresse IP dans la liste Associée à.

  9. Cliquez sur Réserver pour réserver l'adresse IP.

gcloud

Pour réserver une adresse IP externe statique, utilisez la commande gcloud compute addresses create.

Suivez les instructions ci-dessous pour réserver une adresse IPv4 ou IPv6 externe statique :

Adresse IP internationale

Pour réserver une adresse IP globale, procédez comme suit :
  gcloud compute addresses create ADDRESS_NAME \
      --global \
      --ip-version [IPV4 | IPV6]
  

Adresse IPv4 externe régionale

Pour réserver une adresse IPv4 externe régionale, procédez comme suit :
   gcloud compute addresses create ADDRESS_NAME \
       --region=REGION
   

Adresse IPv6 externe régionale

Pour réserver une adresse IPv6 externe régionale, procédez comme suit :
   gcloud compute addresses create ADDRESS_NAME \
       --region=REGION \
       --subnet=SUBNET_NAME \
       --ip-version=IPV6 \
       --endpoint-type=[VM | NETLB]
   

Remplacez les éléments suivants :

  • ADDRESS_NAME : nom que vous souhaitez associer à cette adresse.
  • REGION : pour les adresses IP externes régionales, spécifiez la région dans laquelle vous souhaitez réserver cette adresse. Il doit s'agir de la même région que la ressource à laquelle vous souhaitez associer l'adresse IP.
  • SUBNET_NAME : pour les adresses IPv6 externes régionales, spécifiez le sous-réseau à partir duquel attribuer l'adresse IPv6 régionale statique. Le sous-réseau doit avoir une plage d'adresses IPv6 externe attribuée.
  • [IPV4 | IPV6] : pour les adresses IP globales, spécifiez la version IP (IPv4 ou IPv6). Pour les adresses IPv6 externes régionales, spécifiez IPv6. Une plage IPv6 /96 est attribuée à partir du sous-réseau spécifié.
  • VM | NETLB : pour les adresses IPv6 externes régionales, spécifiez le type de point de terminaison. qu'il s'agisse d'une VM ou d'un équilibreur de charge réseau.

Pour afficher le résultat, utilisez la commande gcloud compute addresses describe :

gcloud compute addresses describe ADDRESS_NAME

Terraform

Vous pouvez utiliser la ressource google_compute_address pour créer une adresse IP externe régionale.

resource "google_compute_address" "default" {
  name   = "my-test-static-ip-address"
  region = "us-central1"
}

L'exemple suivant montre comment utiliser la ressource google_compute_global_address pour créer une adresse IPv6 externe globale :

resource "google_compute_global_address" "default" {
  project      = var.project_id # Replace this with your service project ID in quotes
  name         = "ipv6-address"
  address_type = "EXTERNAL"
  ip_version   = "IPV6"
}

API

  • Pour créer une adresse IPv4 régionale, appelez la méthode addresses.insert régionale :

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses
    

    Le corps de votre requête doit contenir les éléments suivants :

    {
      "name": "ADDRESS_NAME"
    }
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet pour cette requête
    • REGION : nom de la région pour cette requête
    • ADDRESS_NAME : nom que vous souhaitez associer à l'adresse
  • Pour les adresses IPv4 statiques globales, appelez la méthode globalAddresses.insert :

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
    

    Le corps de votre requête doit contenir les éléments suivants :

    {
      "name": "ADDRESS_NAME"
    }
    
  • Pour les adresses IPv6 statiques globales, appelez la méthode globalAddresses.insert :

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
    

    Le corps de votre requête doit contenir les éléments suivants :

    {
      "name": "ADDRESS_NAME",
      "ipVersion": "IPV6"
    }
    

    Pour afficher le résultat, utilisez la méthode addresses.get.

  • Pour les adresses IPv6 statiques régionales, appelez la méthode addresses.insert :

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses
    

    Le corps de votre requête doit contenir les éléments suivants :

    {
      "name": "ADDRESS_NAME",
      "ipVersion": "IPV6",
      "ipv6EndpointType": "VM|LB",
      "networkTier": "PREMIUM",
      "subnetwork": "SUBNET"
    }
    

    Remplacez SUBNET par le sous-réseau de ce projet.

    Pour afficher le résultat, utilisez la méthode addresses.get.

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	"cloud.google.com/go/compute/apiv1/computepb"
)

// reserveNewRegionalExternal reserves a new regional external IP address in Google Cloud Platform.
func reserveNewRegionalExternal(w io.Writer, projectID, region, addressName string, isPremium bool) (*computepb.Address, error) {
	// projectID := "your_project_id"
	// region := "europe-central2"
	// addressName := "your_address_name"
	// isPremium := true
	ctx := context.Background()

	networkTier := computepb.AccessConfig_STANDARD.String()
	if isPremium {
		networkTier = computepb.AccessConfig_PREMIUM.String()
	}

	address := &computepb.Address{
		Name:        &addressName,
		NetworkTier: &networkTier,
	}

	client, err := compute.NewAddressesRESTClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewAddressesRESTClient: %w", err)
	}
	defer client.Close()

	req := &computepb.InsertAddressRequest{
		Project:         projectID,
		Region:          region,
		AddressResource: address,
	}

	op, err := client.Insert(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("unable to reserve regional address: %w", err)
	}

	err = op.Wait(ctx)
	if err != nil {
		return nil, fmt.Errorf("waiting for the regional address reservation operation to complete: %w", err)
	}

	addressResult, err := client.Get(ctx, &computepb.GetAddressRequest{
		Project: projectID,
		Region:  region,
		Address: addressName,
	})
	if err != nil {
		return nil, fmt.Errorf("unable to get reserved regional address: %w", err)
	}

	fmt.Fprintf(w, "Regional address %v reserved: %v", addressName, addressResult.GetAddress())

	return addressResult, err
}

// reserveNewGlobalExternal reserves a new global external IP address in Google Cloud Platform.
func reserveNewGlobalExternal(w io.Writer, projectID, addressName string, isV6 bool) (*computepb.Address, error) {
	// projectID := "your_project_id"
	// addressName := "your_address_name"
	// isV6 := false
	ctx := context.Background()
	ipVersion := computepb.Address_IPV4.String()
	if isV6 {
		ipVersion = computepb.Address_IPV6.String()
	}

	address := &computepb.Address{
		Name:      &addressName,
		IpVersion: &ipVersion,
	}

	client, err := compute.NewGlobalAddressesRESTClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewGlobalAddressesRESTClient: %w", err)
	}
	defer client.Close()

	req := &computepb.InsertGlobalAddressRequest{
		Project:         projectID,
		AddressResource: address,
	}

	op, err := client.Insert(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("unable to reserve global address: %w", err)
	}

	err = op.Wait(ctx)
	if err != nil {
		return nil, fmt.Errorf("waiting for the global address reservation operation to complete: %w", err)
	}

	addressResult, err := client.Get(ctx, &computepb.GetGlobalAddressRequest{
		Project: projectID,
		Address: addressName,
	})
	if err != nil {
		return nil, fmt.Errorf("unable to get reserved global address: %w", err)
	}

	fmt.Fprintf(w, "Global address %v reserved: %v", addressName, addressResult.GetAddress())

	return addressResult, nil
}

Java


import com.google.cloud.compute.v1.Address;
import com.google.cloud.compute.v1.Address.AddressType;
import com.google.cloud.compute.v1.Address.IpVersion;
import com.google.cloud.compute.v1.Address.NetworkTier;
import com.google.cloud.compute.v1.AddressesClient;
import com.google.cloud.compute.v1.GlobalAddressesClient;
import com.google.cloud.compute.v1.InsertAddressRequest;
import com.google.cloud.compute.v1.InsertGlobalAddressRequest;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ReserveNewExternalAddress {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Address name you want to use.
    String addressName = "your-address-name";
    // 'IPV4' or 'IPV6' depending on the IP version. IPV6 if True. Option only for global regions.
    boolean ipV6 = false;
    // 'STANDARD' or 'PREMIUM' network tier. Standard option available only in regional ip.
    boolean isPremium = false;
    // region (Optional[str]): The region to reserve the IP address in, if regional.
    // Must be None if global.
    String region = null;

    reserveNewExternalIpAddress(projectId, addressName, ipV6, isPremium, region);
  }

  // Reserves a new external IP address in the specified project and region.
  public static List<Address> reserveNewExternalIpAddress(String projectId, String addressName,
                                                          boolean ipV6, boolean isPremium,
                                                          String region)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {

    String ipVersion = ipV6 ? IpVersion.IPV6.name() : IpVersion.IPV4.name();
    String networkTier = !isPremium && region != null
            ? NetworkTier.STANDARD.name() : NetworkTier.PREMIUM.name();

    Address.Builder address = Address.newBuilder()
            .setName(addressName)
            .setAddressType(AddressType.EXTERNAL.name())
            .setNetworkTier(networkTier);

    // Use global client if no region is specified
    if (region == null) {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (GlobalAddressesClient client = GlobalAddressesClient.create()) {
        address.setIpVersion(ipVersion);

        InsertGlobalAddressRequest addressRequest = InsertGlobalAddressRequest.newBuilder()
                .setProject(projectId)
                .setRequestId(UUID.randomUUID().toString())
                .setAddressResource(address.build())
                .build();

        client.insertCallable().futureCall(addressRequest).get(30, TimeUnit.SECONDS);

        return Lists.newArrayList(client.list(projectId).iterateAll());
      }
    } else {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (AddressesClient client = AddressesClient.create()) {
        address.setRegion(region);

        InsertAddressRequest addressRequest = InsertAddressRequest.newBuilder()
                .setProject(projectId)
                .setRequestId(UUID.randomUUID().toString())
                .setAddressResource(address.build())
                .setRegion(region)
                .build();

        client.insertCallable().futureCall(addressRequest).get(30, TimeUnit.SECONDS);

        return Lists.newArrayList(client.list(projectId, region).iterateAll());
      }
    }
  }
}

Python

from typing import Optional

from google.cloud.compute_v1.services.addresses.client import AddressesClient
from google.cloud.compute_v1.services.global_addresses import GlobalAddressesClient
from google.cloud.compute_v1.types import Address


def reserve_new_external_ip_address(
    project_id: str,
    address_name: str,
    is_v6: bool = False,
    is_premium: bool = False,
    region: Optional[str] = None,
):
    """
    Reserves a new external IP address in the specified project and region.

    Args:
    project_id (str): Your Google Cloud project ID.
    address_name (str): The name for the new IP address.
    is_v6 (bool): 'IPV4' or 'IPV6' depending on the IP version. IPV6 if True.
    is_premium (bool): 'STANDARD' or 'PREMIUM' network tier. Standard option available only in regional ip.
    region (Optional[str]): The region to reserve the IP address in, if regional. Must be None if global.

    Returns:
    None
    """

    ip_version = "IPV6" if is_v6 else "IPV4"
    network_tier = "STANDARD" if not is_premium and region else "PREMIUM"

    address = Address(
        name=address_name,
        address_type="EXTERNAL",
        network_tier=network_tier,
    )
    if not region:  # global IP address
        client = GlobalAddressesClient()
        address.ip_version = ip_version
        operation = client.insert(project=project_id, address_resource=address)
    else:  # regional IP address
        address.region = region
        client = AddressesClient()
        operation = client.insert(
            project=project_id, region=region, address_resource=address
        )

    operation.result()

    print(f"External IP address '{address_name}' reserved successfully.")

Convertir une adresse IP externe éphémère

Si votre VM possède une adresse IP externe éphémère et que vous souhaitez l'attribuer de manière permanente à votre projet, convertissez l'adresse IP externe éphémère en adresse IP externe statique. La conversion d'une adresse IP externe éphémère en adresse IP réservée n'entraîne pas la suppression des paquets envoyés à la VM par Google Cloud. Cela inclut les paquets envoyés à la VM directement ou au moyen d'un équilibreur de charge.

Console

  1. Accédez à la page Adresses IP.

    Accéder à la page "Adresses IP"

  2. Cliquez sur Adresses IP externes.
  3. Facultatif : dans le champ Filtre, recherchez l'adresse IP éphémère que vous souhaitez convertir.
  4. Dans le menu Plus d'actions () de l'adresse IP que vous souhaitez convertir, sélectionnez Convertir en adresse IP statique.
  5. Saisissez un nom pour la nouvelle adresse IP statique, puis cliquez sur Réserver.

gcloud

Suivez les instructions ci-dessous pour convertir une adresse IPv4 ou IPv6 externe statique :

  • Pour convertir une adresse IPv4 externe éphémère en adresse IPv4 externe statique, indiquez l'adresse IP externe éphémère à l'aide de l'option --addresses avec la commande compute addresses create. Utilisez l'option region pour convertir une adresse IP régionale éphémère ou l'option global pour convertir une adresse IP globale éphémère.

    gcloud compute addresses create ADDRESS_NAME --addresses=IP_ADDRESS \
        [--region=REGION | --global]
    

    Remplacez les éléments suivants :

    • ADDRESS_NAME : nom que vous souhaitez associer à cette adresse.
    • IP_ADDRESS : adresse IP que vous souhaitez promouvoir.
    • REGION : région à laquelle appartient l'adresse IP régionale.
  • Pour convertir une adresse IPv6 externe régionale éphémère en adresse IPv6 externe régionale statique, indiquez l'adresse IP externe éphémère à l'aide de l'option --addresses avec la commande gcloud compute addresses create

    gcloud compute addresses create ADDRESS_NAME \
      --region=REGION \
      --addresses=IPV6_ADDRESS \
      --prefix-length=96
    

    Remplacez les éléments suivants :

    • ADDRESS_NAME : nom de la ressource d'adresse IP
    • REGION : région de la ressource d'adresse IPv6
    • IPV6_ADDRESS : adresse IPv6 que vous convertissez

API

Pour promouvoir une adresse IP régionale éphémère, appelez la méthode addresses.insert :

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

Pour convertir une adresse IP globale éphémère, envoyez une requête POST à l'URI suivant :

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses

Spécifiez les valeurs des champs obligatoires du corps de la requête :

  • Pour les adresses IPv4, le corps de la requête doit contenir les champs suivants :

    {
      "name": "ADDRESS_NAME",
      "address": "IPV4_ADDRESS"
      "addressType": "EXTERNAL"
    }
    
  • Pour les adresses IPv6, le corps de la requête doit contenir les champs suivants :

    {
      "name": "ADDRESS_NAME",
      "address": "IPV6_ADDRESS"
      "prefixLength": 96
      "addressType": "EXTERNAL"
    }
    

    Remplacez les éléments suivants :

    • ADDRESS_NAME : nom que vous souhaitez associer à cette adresse
    • IPV4_ADDRESS|IPV6_ADDRESS : adresse IPv4 ou IPv6 que vous souhaitez convertir
    • REGION : région à laquelle appartient l'adresse IPv4 ou IPv6
    • PROJECT_ID : ID du projet pour cette requête

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// promoteEphemeralAddress promotes an ephemeral IP address to a reserved static external IP address.
func promoteEphemeralAddress(w io.Writer, projectID, region, ephemeralIP, addressName string) error {
	// projectID := "your_project_id"
	// region := "europe-central2"
	// ephemeral_ip := "214.123.100.121"
	ctx := context.Background()

	client, err := compute.NewAddressesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewAddressesRESTClient: %w", err)
	}
	defer client.Close()

	addressResource := &computepb.Address{
		Name:        proto.String(addressName),
		AddressType: proto.String("EXTERNAL"),
		Address:     proto.String(ephemeralIP),
	}

	req := &computepb.InsertAddressRequest{
		Project:         projectID,
		Region:          region,
		AddressResource: addressResource,
	}

	op, err := client.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("failed to insert address promoted: %v", err)
	}

	// Wait for the operation to complete
	err = op.Wait(ctx)
	if err != nil {
		return fmt.Errorf("failed to complete promotion operation: %v", err)
	}

	fmt.Fprintf(w, "Ephemeral IP %s address promoted successfully", ephemeralIP)
	return nil
}

Java


import com.google.cloud.compute.v1.Address;
import com.google.cloud.compute.v1.Address.AddressType;
import com.google.cloud.compute.v1.AddressesClient;
import com.google.cloud.compute.v1.InsertAddressRequest;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class PromoteEphemeralIp {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Region where the VM and IP is located.
    String region = "your-region-id";
    // Ephemeral IP address to promote.
    String ephemeralIp = "your-ephemeralIp";
    // Name of the address to assign.
    String addressName = "your-addressName";

    promoteEphemeralIp(projectId, region, ephemeralIp, addressName);
  }

  // Promote ephemeral IP found on the instance to a static IP.
  public static List<Address> promoteEphemeralIp(String projectId, String region,
                                                 String ephemeralIp, String addressName)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (AddressesClient client = AddressesClient.create()) {
      Address addressResource = Address.newBuilder()
              .setName(addressName)
              .setRegion(region)
              .setAddressType(AddressType.EXTERNAL.name())
              .setAddress(ephemeralIp)
              .build();

      InsertAddressRequest addressRequest = InsertAddressRequest.newBuilder()
              .setRegion(region)
              .setProject(projectId)
              .setAddressResource(addressResource)
              .setRequestId(UUID.randomUUID().toString())
              .build();

      client.insertCallable().futureCall(addressRequest).get(30, TimeUnit.SECONDS);

      return Lists.newArrayList(client.list(projectId, region).iterateAll());
    }
  }
}

Python

import uuid

from google.cloud.compute_v1 import AddressesClient
from google.cloud.compute_v1.types import Address


def promote_ephemeral_ip(project_id: str, ephemeral_ip: str, region: str):
    """
    Promote ephemeral IP found on the instance to a static IP.

    Args:
        project_id (str): Project ID.
        ephemeral_ip (str): Ephemeral IP address to promote.
        region (str): Region where the VM and IP is located.
    """
    addresses_client = AddressesClient()

    # Create a new static IP address using existing ephemeral IP
    address_resource = Address(
        name=f"ip-reserved-{uuid.uuid4()}",  # new name for promoted IP address
        region=region,
        address_type="EXTERNAL",
        address=ephemeral_ip,
    )
    operation = addresses_client.insert(
        project=project_id, region=region, address_resource=address_resource
    )
    operation.result()

    print(f"Ephemeral IP {ephemeral_ip} has been promoted to a static IP.")

L'adresse IP externe reste associée à la VM même après sa conversion en adresse IP externe statique. Si vous devez attribuer l'adresse IP externe statique que vous venez de convertir à une autre ressource, annulez l'attribution de l'adresse IP externe statique à la VM existante.

Répertorier des adresses IP externes statiques

Pour répertorier les adresses IP externes statiques que vous avez réservées pour votre projet, procédez comme suit :

Console

  1. Dans la console Google Cloud, accédez à la page Adresses IP.

    Accéder à la page "Adresses IP"

  2. Cliquez sur Adresses IP externes.

gcloud

Exécutez la commande gcloud compute addresses list :

  • Pour répertorier toutes les adresses IP, utilisez la commande suivante :

    gcloud compute addresses list
  • Pour répertorier toutes les adresses IP globales, utilisez la commande suivante :

    gcloud compute addresses list --global
  • Pour répertorier toutes les adresses IP régionales dans une région donnée, utilisez la commande suivante :

    gcloud compute addresses list \
        --regions=REGION
    

    Remplacez REGION par la région pour laquelle vous souhaitez répertorier les adresses. Vous pouvez répertorier les adresses de plusieurs régions en spécifiant des noms de région séparés par une virgule :

    gcloud compute addresses list \
        --regions=REGION1,REGION2,..REGION_n_
    

API

  • Pour répertorier les adresses IPv4 ou IPv6 régionales, appelez la méthode addresses.list :

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet pour cette requête
    • REGION : nom de la région pour cette requête
  • Pour répertorier toutes les adresses dans toutes les régions, appelez la méthode addresses.aggregatedList :

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/aggregated/addresses
    
  • Pour répertorier les adresses IPv4 ou IPv6 globales, appelez la méthode globalAddresses.list :

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
    

    Remplacez les éléments suivants :

    PROJECT_ID : ID du projet pour cette requête

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	"google.golang.org/api/iterator"

	"cloud.google.com/go/compute/apiv1/computepb"
)

// listRegionalExternal retrieves list external IP addresses in Google Cloud Platform region.
func listRegionalExternal(w io.Writer, projectID, region string) ([]*computepb.Address, error) {
	// projectID := "your_project_id"
	// region := "europe-west3"

	ctx := context.Background()
	// Create the service client.
	addressesClient, err := compute.NewAddressesRESTClient(ctx)
	if err != nil {
		return nil, err
	}
	defer addressesClient.Close()

	// Build the request.
	req := &computepb.ListAddressesRequest{
		Project: projectID,
		Region:  region,
	}

	// List the addresses.
	it := addressesClient.List(ctx, req)

	// Iterate over the results.
	var addresses []*computepb.Address
	for {
		address, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return nil, err
		}
		addresses = append(addresses, address)
	}

	// Print the addresses.
	fmt.Fprint(w, "Fetched addresses: \n")
	for _, address := range addresses {
		fmt.Fprintf(w, "%s\n", *address.Name)
	}

	return addresses, nil
}

// listGlobalExternal retrieves list external global IP addresses in Google Cloud Platform.
func listGlobalExternal(w io.Writer, projectID string) ([]*computepb.Address, error) {
	// projectID := "your_project_id"

	ctx := context.Background()
	// Create the service client.
	addressesClient, err := compute.NewGlobalAddressesRESTClient(ctx)
	if err != nil {
		return nil, err
	}
	defer addressesClient.Close()

	// Build the request.
	req := &computepb.ListGlobalAddressesRequest{
		Project: projectID,
	}

	// List the addresses.
	it := addressesClient.List(ctx, req)

	// Iterate over the results.
	var addresses []*computepb.Address
	for {
		address, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return nil, err
		}
		addresses = append(addresses, address)
	}

	// Print the addresses.
	fmt.Fprint(w, "Fetched addresses: \n")
	for _, address := range addresses {
		fmt.Fprintf(w, "%s\n", *address.Name)
	}

	return addresses, nil
}

Java


import com.google.cloud.compute.v1.Address;
import com.google.cloud.compute.v1.AddressesClient;
import com.google.cloud.compute.v1.GlobalAddressesClient;
import com.google.cloud.compute.v1.ListAddressesRequest;
import com.google.cloud.compute.v1.ListGlobalAddressesRequest;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

public class ListStaticExternalIp {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Region where the VM and IP is located.
    String region = "your-region-id";

    listStaticExternalIp(projectId, region);
  }

  // Lists all static external IP addresses, either regional or global.
  public static List<Address> listStaticExternalIp(String projectId, String region)
          throws IOException {
    // Use regional client if a region is specified
    if (region != null) {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (AddressesClient client = AddressesClient.create()) {
        ListAddressesRequest request = ListAddressesRequest.newBuilder()
                .setProject(projectId)
                .setRegion(region)
                .build();

        return Lists.newArrayList(client.list(request).iterateAll());
      }
    } else {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (GlobalAddressesClient client = GlobalAddressesClient.create()) {
        ListGlobalAddressesRequest request = ListGlobalAddressesRequest.newBuilder()
                .setProject(projectId)
                .build();

        return Lists.newArrayList(client.list(request).iterateAll());
      }
    }
  }
}

Python

from typing import List, Optional

from google.cloud.compute_v1.services.addresses.client import AddressesClient
from google.cloud.compute_v1.services.global_addresses import GlobalAddressesClient
from google.cloud.compute_v1.types import Address


def list_static_ip_addresses(
    project_id: str, region: Optional[str] = None
) -> List[Address]:
    """
    Lists all static external IP addresses, either regional or global.

    Args:
    project_id (str): project ID.
    region (Optional[str]): The region of the IP addresses if regional. None if global.

    Returns:
    List[Address]: A list of Address objects containing details about the requested IPs.
    """
    if region:
        # Use regional client if a region is specified
        client = AddressesClient()
        addresses_iterator = client.list(project=project_id, region=region)
    else:
        # Use global client if no region is specified
        client = GlobalAddressesClient()
        addresses_iterator = client.list(project=project_id)

    return list(addresses_iterator)  # Convert the iterator to a list to return

Décrire une adresse IP externe statique

Pour obtenir des informations sur une adresse IP externe statique, procédez comme suit :

Console

  1. Dans la console Google Cloud, accédez à la page Adresses IP.

    Accéder à la page "Adresses IP"

  2. Cliquez sur Adresses IP externes.

  3. Cliquez sur l'adresse IP pour laquelle vous souhaitez obtenir plus d'informations.

gcloud

Utilisez la commande gcloud compute addresses describe et remplacez ADDRESS_NAME par le nom de l'adresse IP externe que vous souhaitez décrire.

  • Pour une adresse IPv4 ou IPv6 globale, utilisez la commande suivante :

    gcloud compute addresses describe ADDRESS_NAME --global
  • Pour une adresse IPv4 ou IPv6 régionale, utilisez la commande suivante :

    gcloud compute addresses describe ADDRESS_NAME --region=REGION

API

  • Pour décrire une adresse IPv4 ou IPv6 régionale, appelez la méthode addresses.get :

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet pour la requête.
    • REGION : nom de la région pour la requête.
    • ADDRESS_NAME : nom de l'adresse IP.
  • Pour décrire une adresse IPv4 ou IPv6 globale, appelez la méthode globalAddresses.get :

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/ADDRESS_NAME
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet pour la requête.
    • ADDRESS_NAME : nom de l'adresse IP.

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	"cloud.google.com/go/compute/apiv1/computepb"
)

// getExternalAddress retrieves the external IP address of the given address.
func getRegionalExternal(w io.Writer, projectID, region, addressName string) (*computepb.Address, error) {
	// projectID := "your_project_id"
	// region := "europe-west3"
	// addressName := "your_address_name"

	ctx := context.Background()
	addressesClient, err := compute.NewAddressesRESTClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewAddressesRESTClient: %w", err)
	}
	defer addressesClient.Close()

	req := &computepb.GetAddressRequest{
		Project: projectID,
		Region:  region,
		Address: addressName,
	}

	address, err := addressesClient.Get(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("unable to get address: %w", err)
	}

	fmt.Fprintf(w, "Regional address %s has external IP address: %s\n", addressName, address.GetAddress())

	return address, nil
}

func getGlobalExternal(w io.Writer, projectID, addressName string) (*computepb.Address, error) {

	ctx := context.Background()
	globalAddressesClient, err := compute.NewGlobalAddressesRESTClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewGlobalAddressesRESTClient: %w", err)
	}
	defer globalAddressesClient.Close()

	req := &computepb.GetGlobalAddressRequest{
		Project: projectID,
		Address: addressName,
	}

	address, err := globalAddressesClient.Get(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("unable to get address: %w", err)
	}

	fmt.Fprintf(w, "Global address %s has external IP address: %s\n", addressName, address.GetAddress())

	return address, nil
}

Java


import com.google.cloud.compute.v1.Address;
import com.google.cloud.compute.v1.AddressesClient;
import com.google.cloud.compute.v1.GetAddressRequest;
import com.google.cloud.compute.v1.GetGlobalAddressRequest;
import com.google.cloud.compute.v1.GlobalAddressesClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

public class GetStaticIpAddress {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Region where the VM and IP is located.
    String region = "your-region-id";
    // Name of the address to assign.
    String addressName = "your-addressName";

    getStaticIpAddress(projectId, region, addressName);
  }

  // Retrieves a static external IP address, either regional or global.
  public static Address getStaticIpAddress(String projectId, String region, String addressName)
          throws IOException {
    // Use regional client if a region is specified
    if (region != null) {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (AddressesClient client = AddressesClient.create()) {
        GetAddressRequest request = GetAddressRequest.newBuilder()
                .setProject(projectId)
                .setRegion(region)
                .setAddress(addressName)
                .build();

        return client.get(request);
      }
    } else {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (GlobalAddressesClient client = GlobalAddressesClient.create()) {
        GetGlobalAddressRequest request = GetGlobalAddressRequest.newBuilder()
                .setProject(projectId)
                .setAddress(addressName)
                .build();

        return client.get(request);
      }
    }
  }
}

Python

from typing import Optional

from google.cloud.compute_v1.services.addresses.client import AddressesClient
from google.cloud.compute_v1.services.global_addresses import GlobalAddressesClient
from google.cloud.compute_v1.types import Address


def get_static_ip_address(
    project_id: str, address_name: str, region: Optional[str] = None
) -> Address:
    """
    Retrieves a static external IP address, either regional or global.

    Args:
    project_id (str): project ID.
    address_name (str): The name of the IP address.
    region (Optional[str]): The region of the IP address if it's regional. None if it's global.

    Raises: google.api_core.exceptions.NotFound: in case of address not found

    Returns:
    Address: The Address object containing details about the requested IP.
    """
    if region:
        # Use regional client if a region is specified
        client = AddressesClient()
        address = client.get(project=project_id, region=region, address=address_name)
    else:
        # Use global client if no region is specified
        client = GlobalAddressesClient()
        address = client.get(project=project_id, address=address_name)

    return address

Libérer une adresse IP externe statique

Si vous n'avez plus besoin d'une adresse IPv4 ou IPv6 externe statique, vous pouvez la libérer en supprimant la ressource d'adresse IP.

Si vous utilisez la console Google Cloud, vous ne pouvez libérer une adresse IP statique que si elle n'est pas utilisée par une autre ressource.

Si vous utilisez la gcloud CLI ou l'API, vous pouvez libérer une adresse IP, qu'elle soit utilisée ou non par une autre ressource.

  • Si l'adresse IP n'est pas utilisée par une ressource, elle est renvoyée au pool d'adresses IP externes disponibles.

  • Si l'adresse IP est utilisée par une ressource, elle reste associée à la ressource jusqu'à ce que cette dernière soit supprimée.

Console

  1. Dans la console Google Cloud, accédez à la page Adresses IP.

    Accéder à la page "Adresses IP"

  2. Cliquez sur Adresses IP externes.

  3. Facultatif: dans le champ Filtre, saisissez static, puis sélectionnez Statique : Type dans la liste déroulante.

  4. Sélectionnez l'adresse IP externe statique que vous souhaitez libérer.

  5. Cliquez sur Libérer l'adresse statique.

    Si cette option ne s'affiche pas, cliquez sur le menu Autres actions () dans la barre de menu supérieure, puis sélectionnez Libérer l'adresse statique dans la liste.

gcloud

Exécutez la commande compute addresses delete :

gcloud compute addresses delete ADDRESS_NAME

Remplacez ADDRESS_NAME par le nom de l'adresse IPv4 ou IPv6 à libérer.

API

  • Pour libérer une adresse IPv4 ou IPv6 régionale, appelez la méthode addresses.delete :

    DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet pour cette requête
    • REGION : nom de la région pour cette requête
    • ADDRESS_NAME : nom de l'adresse IP.
  • Pour libérer une adresse IPv4 ou IPv6 globale, appelez la méthode globalAddresses.delete :

    DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/ADDRESS_NAME
    

    Remplacez les éléments suivants :

    • ADDRESS_NAME : nom de l'adresse IP.
    • PROJECT_ID : ID du projet pour cette requête

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	"cloud.google.com/go/compute/apiv1/computepb"
)

// releaseRegionalStaticExternal releases a static regional external IP address.
func releaseRegionalStaticExternal(w io.Writer, projectID, region, addressName string) error {
	// projectID := "your_project_id"
	// region := "us-central1"
	// addressName := "your_address_name"

	ctx := context.Background()
	addressesClient, err := compute.NewAddressesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewAddressesRESTClient: %w", err)
	}
	defer addressesClient.Close()

	req := &computepb.DeleteAddressRequest{
		Project: projectID,
		Region:  region,
		Address: addressName,
	}

	op, err := addressesClient.Delete(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to release static external IP address: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Static external IP address released\n")

	return nil
}

// releaseGlobalStaticExternal releases a static global external IP address.
func releaseGlobalStaticExternal(w io.Writer, projectID, addressName string) error {
	// projectID := "your_project_id"
	// addressName := "your_address_name"

	ctx := context.Background()
	addressesClient, err := compute.NewGlobalAddressesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewGlobalAddressesRESTClient: %w", err)
	}
	defer addressesClient.Close()

	req := &computepb.DeleteGlobalAddressRequest{
		Project: projectID,
		Address: addressName,
	}

	op, err := addressesClient.Delete(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to release static external IP address: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Static external IP address released\n")

	return nil
}

Java


import com.google.cloud.compute.v1.AddressesClient;
import com.google.cloud.compute.v1.DeleteAddressRequest;
import com.google.cloud.compute.v1.DeleteGlobalAddressRequest;
import com.google.cloud.compute.v1.GlobalAddressesClient;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ReleaseStaticAddress {

  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // The region to reserve the IP address in, if regional. Must be None if global
    String region = "your-region =";
    // Name of the address to release.
    String addressName = "your-addressName";

    releaseStaticAddress(projectId, addressName, region);
  }

  // Releases a static external IP address that is currently reserved.
  // This action requires that the address is not being used by any forwarding rule.
  public static void releaseStaticAddress(String projectId, String addressName, String region)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    Operation operation;
    // Use global client if no region is specified
    if (region == null) {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (GlobalAddressesClient client = GlobalAddressesClient.create()) {
        DeleteGlobalAddressRequest request = DeleteGlobalAddressRequest.newBuilder()
                .setProject(projectId)
                .setAddress(addressName)
                .build();

        operation = client.deleteCallable().futureCall(request).get(30, TimeUnit.SECONDS);
      }
    } else {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      try (AddressesClient client = AddressesClient.create()) {
        DeleteAddressRequest request = DeleteAddressRequest.newBuilder()
                .setProject(projectId)
                .setRegion(region)
                .setAddress(addressName)
                .build();

        operation = client.deleteCallable().futureCall(request).get(30, TimeUnit.SECONDS);
      }
    }
    if (operation.hasError()) {
      System.out.printf("Can't release external IP address '%s'. Caused by : %s",
              addressName, operation.getError());
    }
    System.out.printf("External IP address '%s' released successfully.", addressName);
  }
}

Python

from typing import Optional

from google.cloud.compute_v1.services.addresses.client import AddressesClient
from google.cloud.compute_v1.services.global_addresses import GlobalAddressesClient


def release_external_ip_address(
    project_id: str,
    address_name: str,
    region: Optional[str] = None,
) -> None:
    """
    Releases a static external IP address that is currently reserved.
    This action requires that the address is not being used by any forwarding rule.

    Args:
        project_id (str): project ID.
        address_name (str): name of the address to release.
        region (Optional[str]): The region to reserve the IP address in, if regional. Must be None if global.


    """
    if not region:  # global IP address
        client = GlobalAddressesClient()
        operation = client.delete(project=project_id, address=address_name)
    else:  # regional IP address
        client = AddressesClient()
        operation = client.delete(
            project=project_id, region=region, address=address_name
        )

    operation.result()
    print(f"External IP address '{address_name}' released successfully.")

Étape suivante