Accès au réseau externe et connectivité privée sur Google Cloud

Cette rubrique fournit des détails de configuration pour configurer la connectivité privée sortante vers un service externe Google Cloud via l’accès au réseau externe. Les principales différences entre les configurations de connectivité publique sortante et de connectivité privée sortante sont que, avec la connectivité privée, vous devez effectuer les opérations suivantes :

  • Créez un point de terminaison de connectivité privé. Cette étape nécessite le rôle ACCOUNTADMIN.

  • Créez une règle réseau afin que la propriété TYPE soit définie sur PRIVATE_HOST_PORT.

Coûts de la connectivité privée sortante

Vous payez pour le point de terminaison de la connectivité privée et pour toutes les données traitées. Pour connaître les prix de ces éléments, consultez le tableau de consommation des services de Snowflake.

Vous pouvez connaître le coût de ces éléments en filtrant sur les types de services suivants lors de la requête des vues de facturation dans les schémas ACCOUNT_USAGE et ORGANIZATION_USAGE :

  • OUTBOUND_PRIVATELINK_ENDPOINT

  • OUTBOUND_PRIVATELINK_DATA_PROCESSED

Par exemple, vous pouvez interroger la vue USAGE_IN_CURRENCY_DAILY et filtrer sur ces types de services.

Configurer l’accès au réseau externe

Pour configurer la connectivité privée sortante avec l’accès au réseau externe sur Google Cloud, procédez comme suit :

  1. Dans Snowflake, appelez la fonction système SYSTEM$PROVISION_PRIVATELINK_ENDPOINT pour provisionner un point de terminaison de connectivité privé dans votre VNet Snowflake pour permettre à Snowflake de se connecter à un service externe Google Cloud à l’aide d’une connectivité privée :

    USE ROLE ACCOUNTADMIN;
    
    SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
      'projects/<project_id>/regions/us-west2/serviceAttachments/cloud-func',
      'my-hello-echo-function.com',
    );
    
    Copy
  2. Dans la Google Cloud console, accédez à la pièce jointe du service et acceptez le projet Snowflake nouvellement connecté.

  3. Dans Snowflake, créez une règle réseau, en spécifiant la propriété PRIVATE_HOST_PORT permettant une connectivité privée :

    CREATE DATABASE IF NOT EXISTS external_access_db;
    
    CREATE OR REPLACE NETWORK RULE external_access_db.public.cloud_func_rule
      MODE = EGRESS
      TYPE = PRIVATE_HOST_PORT
      VALUE_LIST = ('my-hello-echo-function:443');
    
    Copy
  4. Dans Snowflake, créez une intégration d’accès externe, en spécifiant la règle réseau de l’étape précédente :

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION web_server_eai
      ALLOWED_NETWORK_RULES = (external_access_db.public.cloud_func_rule)
      ENABLED = TRUE;
    
    Copy
  5. Dans Snowflake, exécutez les instructions SQL suivantes pour créer une fonction qui peut utiliser l’intégration d’accès externe :

    CREATE OR REPLACE FUNCTION call_func(name VARCHAR)
      returns VARCHAR
      LANGUAGE JAVA
      EXTERNAL_ACCESS_INTEGRATIONS = (web_server_eai)
      HANDLER = 'UDFClient.call'
      AS
      $$
      import java.net.http.HttpClient;
      import java.net.http.HttpRequest;
      import java.net.http.HttpResponse;
      import java.net.URI;
      import java.io.IOException;
    
      public class UDFClient {
        private HttpClient client;
    
        public UDFClient() {
          this.client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
     }
    
      public String call(String name) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
             .header("Content-Type", "application/json")
             .uri(URI.create("http://my-hello-echo-function?name=" + name))
             .GET()
             .build();
    
        HttpResponse<String> response =
             client.send(request, HttpResponse.BodyHandlers.ofString());
    
        return String.valueOf(response.body());
       }
      }
      $$;
    
    Copy
  6. Dans Snowflake, appelez la fonction que vous avez créée à l’étape précédente :

    SELECT call_func("snowflake");
    
    -- Returns "Hello snowflake!"
    
    Copy

Si vous n’avez plus besoin du point de terminaison de connectivité privée pour l’intégration de l’accès au réseau externe, appelez la fonction système SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT.