Configuration des paramètres réseau

Les paramètres réseau de Cloud Functions vous permettent de contrôler l'entrée et la sortie réseau depuis et vers des fonctions spécifiques. Par exemple, vous pouvez utiliser les paramètres réseau pour les cas d'utilisation suivants :

  • Sécuriser vos fonctions en mettant en œuvre un contrôle des accès basé sur les réseaux
  • Configurer le trafic sortant d'une fonction de façon à respecter les règles de pare-feu, de DNS et de routage associées à votre réseau VPC
  • Associer le trafic sortant d'une fonction à une adresse IP statique

Pour plus d'informations sur les cas d'utilisation, consultez la section Exemples de cas d'utilisation.

Paramètres d'entrée

Les paramètres d'entrée contrôlent si les ressources situées en dehors de votre projet Google Cloud ou du périmètre de service VPC Service Controls peuvent appeler une fonction.

Pour être soumise à la règle d'un périmètre VPC Service Controls, une ressource doit appartenir au service à restreindre. Pour Cloud Functions (1st gen), le service restreint est l'API Cloud Functions. Pour Cloud Functions (2nd gen), il s'agit de l'API Cloud Run Admin.

Limites

Cloud Functions (1re génération) : Les fonctions déclenchées par HTTP uniquement internes ne peuvent être appelées que par des requêtes HTTP créées au sein d'un réseau VPC, telles que celles de Kubernetes Engine, Compute Engine ou l'environnement flexible App Engine, ou des requêtes HTTP effectuées par des ressources Cloud Scheduler, Cloud Tasks, Workflows ou BigQuery qui se trouvent dans le même projet ou le même périmètre VPC Service Controls. Cela signifie que les requêtes HTTP créées ou acheminées via Pub/Sub ou Eventarc ne peuvent pas déclencher ces fonctions. Les déclencheurs d'événements sont toujours considérés comme "internes" et sont autorisés quel que soit le paramètre d'entrée.

Configurer les paramètres d'entrée

Pour limiter les ressources extérieures à votre projet ou périmètre, spécifiez l'une des valeurs de paramètre d'entrée suivantes:

  • Autoriser tout le trafic : par défaut. Toutes les requêtes entrantes vers la fonction sont autorisées, à partir d'Internet et des ressources d'un même projet.
  • Autoriser uniquement le trafic interne : seul le trafic provenant de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery et des réseaux VPC dans le même projet ou périmètre VPC Service Controls sont autorisés. Toutes les autres requêtes sont refusées avec une erreur 404.

    Pour les requêtes provenant d'un VPC partagé, tenez compte des points suivants :

    • Le trafic est considéré comme interne si la fonction est déployée dans le projet hôte d'un VPC partagé.
    • Le trafic est considéré comme interne si l'hôte VPC partagé et tous les projets de service sont placés dans le même périmètre VPC Service Controls.
    • Le trafic vers une fonction Cloud Functions (2nd gen) est considéré comme interne si la fonction est connectée au même réseau VPC partagé.
    • Tout autre trafic provenant de réseaux VPC partagés est refusé.
  • Autoriser le trafic interne et le trafic provenant de Cloud Load Balancing : trafic provenant de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery et des réseaux VPC dans le même projet ou le même périmètre VPC Service Controls sont autorisés. Le trafic en provenance de Cloud Load Balancing est autorisé.

Vous pouvez spécifier des paramètres d'entrée lorsque vous déployez ou mettez à jour votre fonction à l'aide de la console Google Cloud, de Google Cloud CLI ou de Terraform :

Console

  1. Ouvrez la page de présentation de Cloud Functions dans la console Google Cloud :

    Accéder à la page de présentation de Cloud Functions

  2. Cliquez sur Créer une fonction. Vous pouvez également cliquer sur une fonction existante pour accéder à sa page d'informations, puis sur Modifier.

  3. Développez les paramètres avancés en cliquant sur Paramètres d'exécution, de compilation....

  4. Dans la section Connexions, sélectionnez une valeur pour le champ Paramètres d'entrée.

gcloud

Exécutez la commande gcloud functions deploy pour déployer ou mettre à jour la fonction, puis spécifiez l'option --ingress-settings :

  gcloud functions deploy FUNCTION_NAME 
--trigger-http
--ingress-settings INGRESS_SETTINGS
FLAGS...

où :

  • FUNCTION_NAME est le nom de la fonction.
  • INGRESS_SETTINGS est l'une des valeurs acceptées pour les paramètres d'entrée. Les valeurs possibles sont :

    • all
    • internal-only
    • internal-and-gclb : autorise le trafic interne ainsi que le trafic en direction d'une adresse IP publique exposée par Cloud Load Balancing. Bloque le trafic envoyé à cloudfunctions.net ou à tout domaine personnalisé configuré via Cloud Functions. Empêche les utilisateurs de contourner les contrôles d'accès (Cloud Armor, IAP) qu'ils ont configurés via Cloud Load Balancing.
  • FLAGS... fait référence aux autres options que vous transmettez à la commande deploy.

Terraform

Facultatif. Pour mettre à jour le champ des paramètres d'entrée du fichier main.tf de votre ressource Terraform, incluez l'argument ingress_settings que vous souhaitez déployer ou mettre à jour. Le fait de modifier les paramètres d'entrée entraîne la recréation de la fonction.

  1. Dans votre fichier main.tf, localisez la ressource pour laquelle vous souhaitez restreindre les paramètres d'entrée et mettez-la à jour avec le paramètre souhaité, par exemple :

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }
    

    INGRESS_SETTINGS est l'une des valeurs acceptées pour les paramètres d'entrée. Les valeurs possibles sont :

    • ALLOW_ALL (par défaut) : toutes les requêtes entrantes vers la fonction sont autorisées, à partir d'Internet et des ressources d'un même projet.
    • ALLOW_INTERNAL_ONLY : seul le trafic provenant de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows et des réseaux VPC dans le même projet ou le périmètre VPC Service Controls est autorisé.
    • ALLOW_INTERNAL_AND_GCLB : autorise le trafic interne ainsi que le trafic en direction d'une adresse IP publique exposée par Cloud Load Balancing. Bloque le trafic envoyé à cloudfunctions.net ou à tout domaine personnalisé configuré via Cloud Functions. Empêche les utilisateurs de contourner les contrôles d'accès (Cloud Armor, IAP) qu'ils ont configurés via Cloud Load Balancing.

Si vous utilisez Google Cloud Armor avec Cloud Load Balancing, vous pouvez créer des règles de sécurité qui filtrent des conditions basées sur le trafic, telles que l'adresse IP, la plage d'adresses IP, le code régional ou les en-têtes d'une requête entrante. Pour en savoir plus, consultez la Présentation des règles de sécurité Google Cloud Armor.

Paramètres de sortie

Les paramètres de sortie contrôlent le routage des requêtes HTTP sortantes depuis une fonction. Pour spécifier des paramètres de sortie, vous devez connecter la fonction à un réseau VPC à l'aide d'un connecteur d'accès au VPC sans serveur. Les paramètres de sortie contrôlent l'acheminement du trafic lorsqu'il passe par le connecteur sur votre réseau VPC.

Limites

  • L'accès au VPC sans serveur n'accepte que le routage du trafic IPv4. Le trafic IPv6 n'est pas accepté, même si votre réseau VPC comporte des routes IPv6.

  • Pour plus de sécurité, Google Cloud bloque les paquets de sortie vers les adresses IP externes sur le port de destination TCP 25.

  • Les fonctions ou services utilisateur qui appellent des fonctions ou des services protégés par un réseau VPC doivent acheminer ces appels via un connecteur VPC.

Configurer les paramètres de sortie

Pour les paramètres de sortie, vous pouvez spécifier les éléments suivants :

  • Acheminer uniquement les requêtes envoyées à des adresses IP privées via le connecteur VPC : par défaut. Le trafic n'est acheminé via le réseau VPC que si les paquets qui le transportent ont des destinations correspondant aux suivantes :

    Les paquets vers toute autre destination sont acheminés depuis Cloud Functions vers Internet, et non via un réseau VPC.

  • Acheminer tout le trafic via le connecteur VPC : le trafic est toujours acheminé via le réseau VPC associé au connecteur, pour toutes les destinations de paquets. Vous devez utiliser cette option dans les cas suivants :

    • Vous devez envoyer du trafic vers des plages de sous-réseaux VPC avec des plages d'adresses IP externes utilisées en mode privé. Pour en savoir plus sur les plages de sous-réseaux VPC, consultez la section Plages IPv4 valides de la présentation des sous-réseaux.
    • Vous devez envoyer du trafic vers un point de terminaison Private Service Connect pour les API Google, dont l'adresse est une adresse IP externe utilisée en mode privé. Pour en savoir plus sur les points de terminaison Private Service Connect pour les API Google, consultez la page Accéder aux API Google via des points de terminaison.
    • Vous devez envoyer du trafic vers une autre destination d'adresse IP externe utilisée en mode privé routable sur le réseau VPC du connecteur. Voici quelques exemples de destinations couvrant les adresses IP externes utilisées en mode privé : les plages d'adresses IP d'appairage de sous-réseau, les plages d'adresses IP d'appairage créées à partir des plages d'adresses IP allouées pour les services, et les destinations accessibles à l'aide de routes personnalisées dans le réseau VPC.

    Si votre réseau VPC inclut une route par défaut, les paquets peuvent toujours être acheminés vers Internet après avoir été traités par le connecteur si vous configurez une passerelle Cloud NAT pour fournir des services NAT au sous-réseau utilisé par le connecteur. Ces paquets sont soumis aux routes de votre réseau VPC et aux règles de pare-feu qui s'appliquent à votre réseau VPC. Vous pouvez utiliser la configuration du routage et du pare-feu pour contrôler la sortie Internet pour toutes les requêtes sortantes envoyées par votre fonction via un connecteur d'accès au VPC sans serveur.

Vous pouvez spécifier des paramètres de sortie lorsque vous déployez ou mettez à jour votre fonction à l'aide de la console Google Cloud ou de Google Cloud CLI.

Console

  1. Ouvrez la page de présentation de Cloud Functions dans la console Google Cloud :

    Accéder à la page de présentation de Cloud Functions

  2. Cliquez sur Créer une fonction. Vous pouvez également cliquer sur une fonction existante pour accéder à sa page d'informations, puis sur Modifier.

  3. Développez les paramètres avancés en cliquant sur Paramètres d'exécution, de compilation....

  4. Dans la section Connexions, sous Paramètres de sortie, sélectionnez un connecteur d'accès au VPC sans serveur.

  5. Sélectionnez le paramètre de sortie approprié en fonction de la manière dont vous souhaitez acheminer le trafic sortant via le connecteur.

gcloud

Exécutez la commande gcloud functions deploy pour déployer ou mettre à jour la fonction, puis spécifiez l'option --egress-settings :

  gcloud functions deploy FUNCTION_NAME 
--vpc-connector CONNECTOR_NAME
--egress-settings EGRESS_SETTINGS
FLAGS...

où :

  • FUNCTION_NAME est le nom de la fonction.
  • CONNECTOR_NAME est le nom du connecteur d'accès au VPC sans serveur à utiliser. Pour en savoir plus, consultez la documentation sur gcloud.

  • EGRESS_SETTINGS est l'une des valeurs acceptées pour les paramètres de sortie. Consultez la documentation sur gcloud.

  • FLAGS... fait référence aux autres options que vous transmettez à la commande deploy.

Exemples de cas d'utilisation

Les exemples suivants montrent comment configurer l'accès au réseau dans plusieurs scénarios courants.

Créer une fonction ne pouvant pas être appelée par des clients externes

Pour assurer la sécurité de vos fonctions HTTP, vous pouvez spécifier une autorisation afin qu'elles ne soient appelées que par les ressources associées au même projet Google Cloud ou au même périmètre de service VPC Service Controls.

  1. Déployez votre fonction et n'autorisez que le trafic interne. Utilisez la console Google Cloud ou Google Cloud CLI :

    Console

    1. Ouvrez la page de présentation de Cloud Functions dans la console Google Cloud :

      Accéder à la page de présentation de Cloud Functions

    2. Cliquez sur Créer une fonction. Vous pouvez également cliquer sur une fonction existante pour accéder à sa page d'informations, puis sur Modifier.

    3. Développez les paramètres avancés en cliquant sur Paramètres d'exécution, de compilation....

    4. Dans la section Connexions, sous Paramètres d'entrée, sélectionnez Autoriser uniquement le trafic interne.

    gcloud

    Exécutez la commande gcloud functions deploy :

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

Une fois votre fonction déployée, les requêtes provenant de l'extérieur de votre projet Google Cloud ne peuvent plus y accéder. Si vous utilisez VPC Service Controls, les requêtes provenant de l'extérieur du périmètre de service sont bloquées. Les instances de VM situées dans votre projet ou périmètre de service peuvent toujours atteindre votre fonction en envoyant des requêtes à son point de terminaison HTTPS.

Si vous souhaitez appeler cette fonction limitée depuis une autre fonction, la fonction appelante doit acheminer son trafic sortant via votre réseau VPC.

Utiliser des paramètres de sortie et d'entrée pour restreindre l'accès

Vous pouvez intégrer à la fois une entrée et une sortie à vos services pour ajouter une couche de restriction supplémentaire.

  1. Clonez le dépôt cloud-run-sample et basculez vers le répertoire vpc-sample :

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample
    

  2. Installez les dépendances Python :

    pip3 install -r requirements.txt
    

  3. Vous pouvez ouvrir le fichier main.py dans le répertoire vpc-sample pour afficher la fonction que vous déployez :

    def hello_world(request):
        return "Hello World!"

  4. Déployez la fonction :

    gcloud functions deploy restricted-function 
    --runtime=python38
    --trigger-http
    --no-allow-unauthenticated
    --ingress-settings=internal-only
    --entry-point=hello_world

  5. Configurez un connecteur d'accès au VPC sans serveur :

    gcloud compute networks vpc-access connectors create serverless-connector 
    --region=SERVICE_REGION
    --range=10.8.0.0/28

    SERVICE_REGION est une région pour votre connecteur. Elle doit correspondre à la région de votre service sans serveur. Si votre service se trouve dans la région us-central ou europe-west, utilisez us-central1 ou europe-west1.

  6. Créez votre image de conteneur :

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .
    

    PROJECT_ID est l'ID du projet.

    Cela crée une image de conteneur qui appelle get_hello_world lorsqu'elle est déployée à partir du fichier main.py :

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. Exécutez la commande gcloud run deploy run-function pour déployer le conteneur Cloud Run :

      gcloud run deploy run-function 
    --image gcr.io/PROJECT_ID/restricted-function-caller
    --no-allow-unauthenticated
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller
    --vpc-egress=all
    --vpc-connector=serverless-connector
    --region=SERVICE_REGION

    où :

    • PROJECT_ID est l'ID de projet.
    • SERVICE_REGION est la région de votre connecteur. Elle doit correspondre à la région de votre service sans serveur. Si votre service se trouve dans la région us-central ou europe-west, utilisez us-central1 ou europe-west1.

    Le service run-function de Cloud Run est maintenant configuré pour envoyer une requête GET via le connecteur VPC à la fonction restreinte au réseau.

Acheminer le trafic sortant d'une fonction via votre réseau VPC

Les réseaux VPC de Google Cloud sont compatibles avec un grand nombre de configurations et de fonctionnalités de mise en réseau. En acheminant le trafic sortant de votre fonction via votre réseau VPC, vous pouvez vous assurer que le trafic sortant de Cloud Functions respecte les règles de pare-feu, de DNS, de routage et autres de votre réseau VPC. Vous pouvez également utiliser des produits tels que Cloud NAT.

  1. Configurez un réseau VPC. Configurez un réseau VPC existant ou créez-en un en suivant la procédure décrite sur la page Utiliser des réseaux VPC.

  2. Configurez un connecteur d'accès au VPC sans serveur. Les fonctions Cloud nécessitent un connecteur d'accès au VPC sans serveur pour pouvoir acheminer le trafic vers votre réseau VPC. Créez un connecteur et configurez les autorisations appropriées en suivant la procédure décrite sur la page Se connecter à un réseau VPC.

  3. Déployez une fonction qui utilise le connecteur et achemine l'ensemble du trafic sortant via le connecteur. Utilisez la console Google Cloud ou l'outil de ligne de commande gcloud :

    Console

    1. Ouvrez la page de présentation de Cloud Functions dans la console Google Cloud :

      Accéder à la page de présentation de Cloud Functions

    2. Cliquez sur Créer une fonction. Vous pouvez également cliquer sur une fonction existante pour accéder à sa page d'informations, puis sur Modifier.

    3. Développez les paramètres avancés en cliquant sur Paramètres d'exécution, de compilation....

    4. Dans la section Connexions, sous Paramètres de sortie, sélectionnez le connecteur d'accès au VPC sans serveur, puis Acheminer tout le trafic via le connecteur VPC.

    gcloud

    Utilisez la commande gcloud functions deploy :

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings all \
    FLAGS...
    

Une fois votre fonction déployée, tout le trafic qui en provient est acheminé via votre réseau VPC, conformément aux règles que vous avez définies sur ce réseau. Notez que votre fonction ne peut pas accéder à l'Internet public, à moins de configurer Cloud NAT. Notez également que vous avez besoin de la passerelle Cloud NAT pour mapper toutes les plages d'adresses IP principales et secondaires de tous les sous-réseaux avec la passerelle NAT, afin d'inclure le sous-réseau du connecteur dans le mappage.

Associer le trafic sortant d'une fonction à une adresse IP statique

Dans certains cas, vous pouvez souhaiter que le trafic provenant de votre fonction soit associé à une adresse IP statique. C'est utile si, par exemple, vous appelez un service externe qui n'accepte que les requêtes provenant d'adresses IP explicitement spécifiées.

  1. Acheminez le trafic sortant de votre fonction via votre réseau VPC. Reportez-vous à la section précédente, Acheminer le trafic sortant d'une fonction via votre réseau VPC.

  2. Configurez Cloud NAT et spécifiez une adresse IP statique. Suivez les procédures décrites dans les sections Spécifier des plages de sous-réseaux pour la NAT et Spécifier les adresses IP pour la NAT afin de configurer Cloud NAT pour le sous-réseau associé au connecteur d'accès au VPC sans serveur de votre fonction. Cloud NAT doit mapper toutes les plages d'adresses IP principales et secondaires pour tous les sous-réseaux avec la passerelle NAT afin d'inclure le sous-réseau du connecteur dans le mappage.

Équilibrage de charge multirégional

Vous pouvez déployer une fonction dans différentes régions et autoriser l'envoi de la requête à la région opérationnelle la plus proche. Pour ce faire, vous devez configurer un groupe de points de terminaison du réseau sans serveur pour cette fonction et le connecter à un équilibreur de charge, comme expliqué dans la section Configurer un équilibreur de charge HTTP(S) avec des points de terminaison sans serveur.