Actualisation automatique des tables de répertoire pour Google Cloud Storage¶
Cette rubrique fournit des instructions pour déclencher des actualisations de métadonnées de table de répertoire à l’aide de messages Google Cloud Pub/Sub pour les événements Google Cloud Storage (GCS).
Note
Pour effectuer les étapes décrites dans cette rubrique, vous devez utiliser un rôle disposant du privilège CREATE STAGE sur un schéma.
De plus, vous devez avoir un accès administratif à Google Cloud Platform (GCP). Si vous n’êtes pas un administrateur GCP, demandez à votre administrateur GCP de suivre les étapes requises.
Notez que seuls les événements OBJECT_DELETE
et OBJECT_FINALIZE
déclenchent des actualisations pour les tables de répertoire. Snowflake recommande de n’envoyer que des événements pris en charge pour les tables de répertoire afin de réduire les coûts, le bruit des événements et la latence.
Dans ce chapitre :
Prise en charge de la plateforme Cloud¶
Le déclenchement des actualisations de métadonnées de répertoire automatisées à l’aide de messages d’événements GCS Pub/Sub est pris en charge par les comptes Snowflake hébergés sur les plates-formes Cloud suivantes :
Amazon Web Services (AWS)
Google Cloud Platform
Les instructions pour la configuration de cette prise en charge sont identiques pour les comptes sur les deux plates-formes d’hébergement Cloud.
Configuration de l’accès sécurisé au stockage Cloud¶
Note
Si vous avez déjà configuré un accès sécurisé au compartiment GCS qui stocke vos fichiers de données, vous pouvez ignorer cette section.
Cette section décrit comment configurer un objet d’intégration de stockage Snowflake pour déléguer la responsabilité de l’authentification pour le stockage dans le Cloud à une entité Gestion des identités et des accès Snowflake (IAM).
Cette section explique comment utiliser les intégrations de stockage pour permettre à Snowflake de lire des données et de les écrire dans un compartiment de Google Cloud Storage référencé dans une zone de préparation externe (c’est-à-dire Cloud Storage). Les intégrations sont des objets Snowflake de première classe nommés, qui évitent de transmettre des informations d’identification explicites de fournisseur de Cloud, telles que des clés secrètes ou des jetons d’accès ; au lieu de cela, les objets d’intégration font référence à un compte de service Cloud Storage. Un administrateur de votre organisation accorde des autorisations au compte de service dans le compte Cloud Storage.
Les administrateurs peuvent également limiter les utilisateurs à un ensemble spécifique de compartiments Cloud Storage (et de chemins d’accès facultatifs) auxquels accèdent des zones de préparation externes utilisant l’intégration.
Note
Pour suivre les instructions de cette section, vous devez avoir accès à votre projet Cloud Storage en tant qu’éditeur de projet. Si vous n’êtes pas un éditeur de projet, demandez à votre administrateur Cloud Storage d’effectuer ces tâches.
Le diagramme suivant illustre le flux d’intégration d’une zone de préparation Cloud Storage :
Une zone de préparation externe (c.-à-d Cloud Storage) fait référence à un objet d’intégration de stockage dans sa définition.
Snowflake associe automatiquement l’intégration de stockage à un compte de service Cloud Storage créé pour votre compte. Snowflake crée un seul compte de service référencé par toutes les intégrations de stockage GCS de votre compte Snowflake.
Un éditeur de projet pour votre projet Cloud Storage accorde des autorisations au compte de service pour accéder au compartiment référencé dans la définition de la zone de stockage. Notez que de nombreux objets de zone de stockage externes peuvent référencer différents compartiments et chemins et utiliser la même intégration pour l’authentification.
Lorsqu’un utilisateur charge ou décharge des données depuis ou vers une zone de préparation, Snowflake vérifie les autorisations accordées au compte de service sur le compartiment avant d’autoriser ou de refuser l’accès.
Dans cette section :
Étape 1 : Création d’une intégration Cloud Storage dans Snowflake¶
Créez une intégration à l’aide de la commande CREATE STORAGE INTEGRATION. Une intégration est un objet Snowflake qui délègue la responsabilité de l’authentification pour un stockage externe dans le Cloud à une entité générée par Snowflake (c’est-à-dire un compte de service Cloud Storage). Pour accéder aux compartiments Cloud Storage, Snowflake crée un compte de service auquel des autorisations peuvent être accordées pour accéder aux compartiments dans lesquels vos fichiers de données sont stockés.
Une seule intégration de stockage peut prendre en charge plusieurs zones de préparation externes (c.-à-d. GCS). L’URL dans la définition de zone de préparation doit correspondre aux compartiments GCS (et aux chemins facultatifs) spécifiés pour le paramètre STORAGE_ALLOWED_LOCATIONS.
Note
Seuls les administrateurs de compte (utilisateurs dotés du rôle ACCOUNTADMIN) ou un rôle disposant du privilège global CREATE INTEGRATION peuvent exécuter cette commande SQL.
CREATE STORAGE INTEGRATION <integration_name>
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'GCS'
ENABLED = TRUE
STORAGE_ALLOWED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/')
[ STORAGE_BLOCKED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/') ]
Où :
integration_name
est le nom de la nouvelle intégration.bucket
est le nom d’un compartiment Cloud Storage qui stocke vos fichiers de données (par exemple,mybucket
). Les paramètres STORAGE_ALLOWED_LOCATIONS requis et STORAGE_BLOCKED_LOCATIONS facultatif limitent ou bloquent l’accès à ces compartiments, respectivement, lors de la création ou de la modification de zones de préparation faisant référence à cette intégration.path
est un chemin facultatif qui peut être utilisé pour fournir un contrôle granulaire sur les objets du compartiment.
L’exemple suivant crée une intégration qui limite explicitement les zones de préparation externes utilisant l’intégration pour faire référence à l’un des deux compartiments et des chemins. Dans une étape ultérieure, nous allons créer une zone de préparation externe qui fait référence à l’un de ces compartiments et chemins.
Les zones de préparation externes supplémentaires qui utilisent également cette intégration peuvent faire référence aux compartiments et aux chemins autorisés :
CREATE STORAGE INTEGRATION gcs_int TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'GCS' ENABLED = TRUE STORAGE_ALLOWED_LOCATIONS = ('gcs://mybucket1/path1/', 'gcs://mybucket2/path2/') STORAGE_BLOCKED_LOCATIONS = ('gcs://mybucket1/path1/sensitivedata/', 'gcs://mybucket2/path2/sensitivedata/');
Étape 2 : Récupération du compte de service Cloud Storage pour votre compte Snowflake¶
Exécutez la commande DESCRIBE INTEGRATION pour extraire l’ID du compte de service Cloud Storage créé automatiquement pour votre compte Snowflake :
DESC STORAGE INTEGRATION <integration_name>;
Où :
integration_name
est le nom de l’intégration créée à l”étape 1 : Création d’une intégration Cloud Storage dans Snowflake (ce chapitre).
Par exemple :
DESC STORAGE INTEGRATION gcs_int; +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+ | property | property_type | property_value | property_default | +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------| | ENABLED | Boolean | true | false | | STORAGE_ALLOWED_LOCATIONS | List | gcs://mybucket1/path1/,gcs://mybucket2/path2/ | [] | | STORAGE_BLOCKED_LOCATIONS | List | gcs://mybucket1/path1/sensitivedata/,gcs://mybucket2/path2/sensitivedata/ | [] | | STORAGE_GCP_SERVICE_ACCOUNT | String | service-account-id@project1-123456.iam.gserviceaccount.com | | +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
La propriété STORAGE_GCP_SERVICE_ACCOUNT de la sortie affiche le compte de service Cloud Storage créé pour votre compte Snowflake (par exemple, service-account-id@project1-123456.iam.gserviceaccount.com
). Nous fournissons un seul compte de service Cloud Storage pour l’ensemble de votre compte Snowflake. Toutes les intégrations Cloud Storage utilisent ce compte de service.
Étape 3 : Octroi d’autorisations au compte de service pour accéder à des objets de compartiment¶
Les instructions étape par étape suivantes décrivent comment configurer les permissions d’accès IAM pour Snowflake dans votre console Google Cloud Platform de sorte que vous puissiez utiliser un compartiment Cloud Storage pour charger et décharger les données :
Création d’un rôle IAM personnalisé¶
Créez un rôle personnalisé disposant des autorisations requises pour accéder au compartiment et obtenir des objets.
Connectez-vous à la console Google Cloud Platform en tant qu’éditeur de projet.
Dans le tableau de bord d’accueil, sélectionnez IAM & admin » Roles.
Cliquez sur Create Role.
Entrez un nom et une description pour le rôle personnalisé.
Cliquez sur Add Permissions.
Filtrez la liste des autorisations et ajoutez les éléments suivants dans la liste :
Action(s)
Autorisations requises
Chargement des données uniquement
storage.buckets.get
storage.objects.get
storage.objects.list
Chargement de données avec option de purge, exécution de la commande REMOVE sur la zone de préparation
storage.buckets.get
storage.objects.delete
storage.objects.get
storage.objects.list
Chargement et déchargement des données
storage.buckets.get
(pour le calcul des coûts de transfert des données)storage.objects.create
storage.objects.delete
storage.objects.get
storage.objects.list
Déchargement des données uniquement
storage.buckets.get
storage.objects.create
storage.objects.delete
storage.objects.list
Cliquez sur Create.
Attribution du rôle personnalisé au compte du service Cloud Storage¶
Connectez-vous à la console Google Cloud Platform en tant qu’éditeur de projet.
Dans le tableau de bord d’accueil, sélectionnez Cloud Storage » Browser :
Sélectionnez un compartiment à configurer pour l’accès.
Cliquez sur SHOW INFO PANEL dans le coin supérieur droit. Le panneau d’information du compartiment s’affiche en coulissant.
Cliquez sur le bouton ADD PRINCIPAL.
Dans le champ New principals, recherchez le nom du compte de service à partir de la sortie DESCRIBE INTEGRATION dans Étape 2 : Récupération du compte de service Cloud Storage pour votre compte Snowflake (dans cette rubrique).
Dans la liste déroulante Select a role , sélectionnez Custom »
<rôle>
, où<rôle>
est le rôle Cloud Storage personnalisé que vous avez créé dans Création d’un rôle IAM personnalisé (dans ce chapitre).Cliquez sur le bouton Save. Le nom du compte de service est ajouté à la liste déroulante des rôles Storage Object Viewer dans le panneau d’informations.
Octroi des autorisations de compte du service Cloud Storage sur les clés cryptographiques de Cloud Key Management Service¶
Note
Cette étape n’est requise que si votre compartiment GCS est chiffré à l’aide d’une clé stockée dans Google Cloud Key Management Service (Cloud KMS).
Connectez-vous à la console Google Cloud Platform en tant qu’éditeur de projet.
Dans le tableau de bord d’accueil, sélectionnez Security » Cryptographic keys.
Sélectionnez le porte-clés affecté à votre compartiment GCS.
Cliquez sur SHOW INFO PANEL dans le coin supérieur droit. Le panneau d’information du porte-clés s’affiche.
Cliquez sur le bouton ADD PRINCIPAL.
Dans le champ New principals, recherchez le nom du compte de service à partir de la sortie DESCRIBE INTEGRATION dans Étape 2 : Récupération du compte de service Cloud Storage pour votre compte Snowflake (dans cette rubrique).
Dans la liste déroulante Select a role, sélectionnez le rôle
Cloud KMS CrytoKey Encryptor/Decryptor
.Cliquez sur le bouton Save. Le nom du compte de service est ajouté à la liste déroulante des rôles Cloud KMS CrytoKey Encryptor/Decryptor dans le panneau d’informations.
Configuration de l’automatisation à l’aide de Pub/Sub GCS¶
Conditions préalables¶
Les instructions de cette rubrique supposent que les éléments suivants ont été créés et configurés :
- Compte GCP:
Sujet Pub/Sub qui reçoit des messages d’événement depuis le compartiment GCS. Pour plus d’informations, voir Création du sujet Pub/Sub (dans cette rubrique).
Abonnement qui reçoit les messages d’événement du sujet Pub/Sub. Pour plus d’informations, voir Création de l’abonnement Pub/Sub (dans cette rubrique).
Pour obtenir des instructions, voir Documentation Pub/Sub.
- Snowflake:
Table cible dans la base de données Snowflake où vos données seront chargées.
Création du sujet Pub/Sub¶
Créez un sujet Pub/Sub à l’aide de Cloud Shell ou du SDK Cloud.
Exécutez la commande suivante pour créer le sujet et lui permettre d’écouter l’activité dans le compartiment GCS spécifié :
$ gsutil notification create -t <topic> -f json gs://<bucket-name> -e OBJECT_FINALIZE -e OBJECT_DELETE
Où :
<sujet>
est le nom du sujet.<nom-compartiment>
est le nom de votre compartiment GCS.
Si le sujet existe déjà, la commande l’utilise ; sinon, un nouveau sujet est créé.
Pour plus d’informations, voir la page Utiliser les notifications Pub/Sub pour le stockage Cloud dans la documentation Pub/Sub.
Création de l’abonnement Pub/Sub¶
Créez un abonnement au sujet avec transmission de type pull Pub/Sub à l’aide de la console Cloud, de l’outil de ligne de commande gcloud
ou de l’API Cloud Pub/Sub. Pour obtenir des instructions, voir Gérer les sujets et les abonnements dans la documentation Pub/Sub.
Note
Seuls les abonnements Pub/Sub qui utilisent la transmission de type pull par défaut sont pris en charge par Snowflake. La transmission de type push n’est pas prise en charge.
Récupération de l’ID d’abonnement Pub/Sub¶
L’ID d’abonnement au sujet Pub/Sub est utilisé dans ces instructions pour permettre à Snowflake d’accéder aux messages d’événement.
Connectez-vous à la console Google Cloud Platform en tant qu’éditeur de projet.
Dans le tableau de bord d’accueil, sélectionnez Big Data » Pub/Sub » Subscriptions.
Copiez l’ID dans la colonne Subscription ID pour l’abonnement au sujet
Étape 1 : créer une intégration de notification dans Snowflake¶
Créez une intégration de notification à l’aide de la commande CREATE NOTIFICATION INTEGRATION. L’intégration des notifications fait référence à votre abonnement Pub/Sub. Snowflake associe l’intégration de la notification à un compte de service GCS créé pour votre compte. Snowflake crée un seul compte de service référencé par toutes les notifications de stockage GCS de votre compte Snowflake.
Note
Seuls les administrateurs de compte (utilisateurs dotés du rôle ACCOUNTADMIN) ou un rôle disposant du privilège global CREATE INTEGRATION peuvent exécuter cette commande SQL.
Le compte de service GCS pour les intégrations de notification est différent du compte de service créé pour les intégrations de stockage.
Une seule intégration de notification prend en charge un seul abonnement Google Cloud Pub/Sub. Le fait de référencer le même abonnement Pub/Sub dans plusieurs intégrations de notification peut entraîner des données manquantes dans les tables cibles, car les notifications d’événements sont réparties entre les intégrations de notification.
CREATE NOTIFICATION INTEGRATION <integration_name>
TYPE = QUEUE
NOTIFICATION_PROVIDER = GCP_PUBSUB
ENABLED = true
GCP_PUBSUB_SUBSCRIPTION_NAME = '<subscription_id>';
Où :
integration_name
est le nom de la nouvelle intégration.subscription_id
est le nom de l’abonnement que vous avez enregistré dans Récupération de l’ID d’abonnement Pub/Sub.
Par exemple :
CREATE NOTIFICATION INTEGRATION my_notification_int
TYPE = QUEUE
NOTIFICATION_PROVIDER = GCP_PUBSUB
ENABLED = true
GCP_PUBSUB_SUBSCRIPTION_NAME = 'projects/project-1234/subscriptions/sub2';
Étape 2 : Accorder un accès à Snowflake à l’abonnement Pub/Sub¶
Exécutez la commande DESCRIBE INTEGRATION pour récupérer l’ID de compte de service Snowflake :
DESC NOTIFICATION INTEGRATION <integration_name>;
Où :
integration_name
est le nom de l’intégration créée à l”étape 1 : Créer une intégration de notification dans Snowflake.
Par exemple :
DESC NOTIFICATION INTEGRATION my_notification_int;
Enregistrez le nom du compte de service dans la colonne GCP_PUBSUB_SERVICE_ACCOUNT, qui a le format suivant :
<service_account>@<project_id>.iam.gserviceaccount.com
Connectez-vous à la console Google Cloud Platform en tant qu’éditeur de projet.
Dans le tableau de bord d’accueil, sélectionnez Big Data » Pub/Sub » Subscriptions.
Sélectionnez l’abonnement à configurer pour l’accès.
Cliquez sur SHOW INFO PANEL dans le coin supérieur droit. Le panneau d’information de l’abonnement s’affiche en coulissant.
Cliquez sur le bouton ADD PRINCIPAL.
Dans le champ New principals, recherchez le nom du compte de service que vous avez enregistré.
Dans la liste déroulante Select a role, sélectionnez Pub/Sub Subscriber.
Cliquez sur le bouton Save. Le nom du compte de service est ajouté à la liste déroulante des rôles Pub/Sub Subscriber dans le panneau d’informations.
Accédez à la page Dashboard de la console Cloud et sélectionnez votre projet dans la liste déroulante.
Cliquez sur le bouton ADD PEOPLE TO THIS PROJECT .
Ajoutez le nom du compte de service que vous avez enregistré.
Dans la liste déroulante Select a role, sélectionnez Monitoring Viewer.
Cliquez sur le bouton Save . Le nom du compte de service est ajouté au rôle Monitoring Viewer.
Étape 3 : Création d’une zone de préparation avec une table de répertoire incluse¶
Créez une zone de préparation externe qui fait référence à votre compartiment GCS à l’aide de la commande CREATE STAGE. Snowflake lit vos fichiers de données en zone de préparation dans les métadonnées de la table de répertoire. Vous pouvez aussi utiliser une zone de préparation externe existante.
Note
Pour configurer un accès sécurisé à l’emplacement de stockage Cloud, voir Configuration de l’accès sécurisé au stockage Cloud (dans cette rubrique).
Pour faire référence à une intégration de stockage dans l’instruction CREATE STAGE, le rôle doit avoir le privilège USAGE sur l’objet d’intégration de stockage.
-- External stage
CREATE [ OR REPLACE ] [ TEMPORARY ] STAGE [ IF NOT EXISTS ] <external_stage_name>
<cloud_storage_access_settings>
[ FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ directoryTable ]
[ COPY_OPTIONS = ( copyOptions ) ]
[ COMMENT = '<string_literal>' ]
Où :
directoryTable ::= [ DIRECTORY = ( ENABLE = { TRUE | FALSE } [ AUTO_REFRESH = { TRUE | FALSE } ] [ NOTIFICATION_INTEGRATION = '<notification_integration_name>' ] ) ]
Paramètres de la table de répertoire (directoryTable
)¶
ENABLE = TRUE | FALSE
Spécifie s’il faut ajouter une table de répertoire à la zone de préparation. Lorsque la valeur est TRUE, une table de répertoire est créée avec la zone de préparation.
Par défaut :
FALSE
AUTO_REFRESH = TRUE | FALSE
Spécifie si Snowflake doit activer le déclenchement des actualisations automatiques des métadonnées de la table de répertoire lorsque de nouveaux fichiers de données ou des fichiers de données mis à jour sont disponibles dans la zone de préparation externe nommée spécifiée dans le paramètre
[ WITH ] LOCATION =
.TRUE
Snowflake permet de déclencher des actualisations automatiques des métadonnées de la table de répertoire.
FALSE
Snowflake n’active pas le déclenchement d’actualisations automatiques des métadonnées de la table de répertoire. Vous devez actualiser manuellement les métadonnées de la table de répertoire de façon périodique avec ALTER STAGE … REFRESH pour synchroniser les métadonnées avec la liste actuelle des fichiers dans le chemin de la zone de préparation.
Par défaut :
FALSE
NOTIFICATION_INTEGRATION = '<nom_intégration_notification>'
Spécifie le nom de l’intégration de notification utilisée pour actualiser automatiquement les métadonnées de la table de répertoire à l’aide des notifications Pub/Sub. Une intégration de notification est un objet Snowflake qui fournit une interface entre Snowflake et des services tiers de mise en file d’attente de messages dans le Cloud.
Le nom de l’intégration doit être fourni en majuscule.
L’exemple suivant crée une zone de préparation nommée mystage
dans le schéma actif de la session utilisateur. L’URL de stockage Cloud inclut le chemin files
. La zone de préparation fait référence à une intégration de stockage nommée my_storage_int
.
Le paramètre NOTIFICATION_INTEGRATION fait référence à l’intégration my_notification_int
créée à l” étape 1 : Créer une intégration de notification dans Snowflake :
USE SCHEMA mydb.public;
CREATE STAGE mystage
URL='gcs://mybucket/files/'
STORAGE_INTEGRATION = my_storage_int
DIRECTORY = (
ENABLE = true
AUTO_REFRESH = true
NOTIFICATION_INTEGRATION = 'MY_NOTIFICATION_INT'
);
Note
L’emplacement de stockage dans la valeur d’URL doit se terminer par une barre oblique (
/
).Le nom de l’intégration doit être fourni en majuscule.
Lorsque des fichiers de données nouveaux ou mis à jour sont ajoutés à l’emplacement de stockage dans le Cloud, la notification d’événement demande à Snowflake de les analyser dans les métadonnées de la table de répertoire.
Étape 4 : Actualisation manuelle des métadonnées de la table de répertoire¶
Actualiser manuellement les métadonnées d’une table de répertoire à l’aide de la commande ALTER STAGE.
Syntaxe¶
ALTER STAGE [ IF EXISTS ] <name> REFRESH [ SUBPATH = '<relative-path>' ]
Où :
REFRESH
Accède aux fichiers de données mis en zone de préparation, et référencés dans la définition de table de répertoire et met à jour les métadonnées de la table :
Les nouveaux fichiers dans le chemin sont ajoutés aux métadonnées de la table.
Les modifications apportées aux fichiers dans le chemin sont mises à jour dans les métadonnées de la table.
Les fichiers qui ne figurent plus dans le chemin sont supprimés des métadonnées de la table.
Actuellement, il est nécessaire d’exécuter cette commande chaque fois que des fichiers sont ajoutés à la zone de préparation, mis à jour ou détruits. Cette étape synchronise les métadonnées avec le dernier ensemble de fichiers associés dans la définition de la zone de préparation pour la table de répertoire.
SUBPATH = '<relative-path>'
Spécifiez éventuellement un chemin relatif pour actualiser les métadonnées pour un sous-ensemble spécifique des fichiers de données.
Exemples¶
Actualiser manuellement les métadonnées de la table de répertoire dans une zone de préparation nommée mystage
:
ALTER STAGE mystage REFRESH;
Important
Si cette étape n’est pas réalisée avec succès au moins une fois après la création de la table de répertoire, l’interrogation de la table de répertoire ne renvoie aucun résultat jusqu’à ce qu’un événement de notification déclenche l’actualisation automatique des métadonnées de la table de répertoire pour la première fois.
Étape 5 : Configuration de la sécurité¶
Pour chaque rôle supplémentaire qui sera utilisé pour interroger la table de répertoire, accordez des privilèges de contrôle d’accès suffisants sur les différents objets (c.-à-d. la ou les bases de données, le ou les schémas et la zone de préparation) avec GRANT <privilèges> :
Objet |
Privilège |
Remarques |
---|---|---|
Base de données |
USAGE |
|
Schéma |
USAGE |
|
Zone de préparation nommée |
USAGE , READ |
|
Format de fichier nommé |
USAGE |
Facultatif ; uniquement nécessaire si la zone de préparation que vous avez créée fait référence à un format de fichier nommé. |