Configuration d’un conteneur Azure pour le chargement de données

Ce chapitre décrit comment configurer un accès sécurisé aux fichiers de données stockés dans un conteneur Microsoft Azure.

Les options suivantes sont prises en charge :

Option 1

Configurez un objet d’intégration de stockage pour déléguer la responsabilité de l’authentification pour le stockage externe dans le Cloud à un principal de service Azure. Un principal de service est une identité créée pour être utilisée avec des services tels que Snowflake pour accéder à des ressources Azure.

Note

  • Nous vous recommandons vivement cette option, qui vous évite de fournir un jeton SAS lors de la création de zones de préparation ou du chargement de données.

  • L’accès au stockage Azure blob dans les régions gouvernementales à l’aide d’une intégration de stockage est limité aux comptes Snowflake hébergés sur dans la même région gouvernementale. L’accès à votre stockage blob à partir d’un compte hébergé en dehors de la région gouvernementale à l’aide d’identifiants directs est pris en charge.

Option 2

Générez un jeton de signature d’accès partagé (SAS) pour accorder à Snowflake un accès limité aux objets de votre compte de stockage. Vous pouvez ensuite accéder à une zone de préparation externe (Azure) qui fait référence au conteneur à l’aide du jeton SAS.

Note

Pour suivre les instructions de ce chapitre, vous devez avoir un accès administratif à Azure. Si vous n’êtes pas un administrateur Azure, demandez à votre administrateur Azure d’effectuer ces tâches.

Dans ce chapitre :

Option 1 : Configuration d’une intégration de stockage Snowflake

Cette section décrit comment utiliser des intégrations de stockage pour permettre à Snowflake de lire et d’écrire des données dans un conteneur Azure référencé dans une zone de préparation externe (Azure). Les intégrations sont des objets Snowflake de première classe nommés, qui évitent de transmettre des informations d’identification explicites de fournisseur Cloud, telles que des clés secrètes ou des jetons d’accès. Les objets d’intégration stockent un ID d’utilisateur Azure de gestion des identités et des accès (IAM) appelé inscription d’application. Un administrateur de votre organisation accorde à cette application les autorisations nécessaires dans le compte Azure.

Une intégration peut également spécifier des conteneurs (et des chemins facultatifs) qui limitent les emplacements que les utilisateurs peuvent spécifier lors de la création de zones de préparation externes utilisant l’intégration.

Note

La réalisation des instructions de cette section nécessite des autorisations dans Azure pour gérer les comptes de stockage. Si vous n’êtes pas un administrateur Azure, demandez à votre administrateur Azure d’effectuer ces tâches.

Dans cette section :

Étape 1 : Création d’une intégration Cloud Storage dans Snowflake

Créez une intégration de stockage à l’aide de la commande CREATE STORAGE INTEGRATION. Une intégration de stockage est un objet Snowflake qui stocke un principal de service généré pour votre stockage Cloud Azure, ainsi qu’un ensemble facultatif d’emplacements de stockage autorisés ou bloqués (c.-à-d. des conteneurs). Les administrateurs de fournisseur de Cloud de votre entreprise accordent des autorisations sur les emplacements de stockage au principal de service généré. Cette option permet aux utilisateurs d’éviter de fournir des informations d’identification lors de la création de zones de préparation ou du chargement de données.

Une seule intégration de stockage peut prendre en charge plusieurs zones de préparation (c.-à-d. Azure) externes. L’URL dans la définition de zone de préparation doit correspondre aux conteneurs Azure (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 = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = '<tenant_id>'
  STORAGE_ALLOWED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/') ]
Copy

Où :

  • integration_name est le nom de la nouvelle intégration.

  • tenant_id est l’ID de votre client Office 365 auquel appartiennent les comptes de stockage autorisés et bloqués. Une intégration de stockage peut s’authentifier auprès d’un seul client. Les emplacements de stockage autorisés et bloqués doivent donc faire référence aux comptes de stockage qui appartiennent tous à ce client.

    Pour trouver votre ID de client, connectez-vous au portail Azure et cliquez sur Azure Active Directory » Properties. L” ID de client s’affiche dans le champ Tenant ID.

  • container est le nom d’un conteneur Azure qui stocke vos fichiers de données (par exemple, mycontainer). Les paramètres STORAGE_ALLOWED_LOCATIONS et STORAGE_BLOCKED_LOCATIONS limitent ou bloquent l’accès à ces conteneurs, 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 répertoires logiques du conteneur.

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 conteneurs 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 conteneurs et chemins. Plusieurs zones de préparation externes qui utilisent cette intégration peuvent référencer les conteneurs et les chemins autorisés :

CREATE STORAGE INTEGRATION azure_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = 'a123b4c5-1234-123a-a12b-1a23b45678c9'
  STORAGE_ALLOWED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/')
  STORAGE_BLOCKED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/sensitivedata/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/sensitivedata/');
Copy

Étape 2 : Accorder un accès à Snowflake aux emplacements de stockage

  1. Exécutez la commande DESCRIBE INTEGRATION pour récupérer l’URL de consentement :

    DESC STORAGE INTEGRATION <integration_name>;
    
    Copy

    Où :

Notez les valeurs dans les colonnes suivantes :

AZURE_CONSENT_URL

URL vers la page de demande d’autorisations de Microsoft.

AZURE_MULTI_TENANT_APP_NAME

Nom de l’application client Snowflake créée pour votre compte. Plus loin dans cette section, vous devrez accorder à cette application les autorisations nécessaires pour obtenir un jeton d’accès sur vos emplacements de stockage autorisés.

  1. Dans un navigateur Web, accédez à l’URL dans la colonne AZURE_CONSENT_URL . La page affiche une page de demande d’autorisations Microsoft.

  2. Cliquez sur le bouton Accept. Cette action permet au principal du service Azure créé pour votre compte Snowflake d’obtenir un jeton d’accès sur des ressources spécifiées à l’intérieur de votre client. L’obtention d’un jeton d’accès ne réussit que si vous accordez au principal du service les autorisations appropriées sur le conteneur (voir l’étape suivante).

    La page de demande d’autorisations Microsoft redirige vers le site d’entreprise de Snowflake (snowflake.com).

  3. Connectez-vous au portail Microsoft Azure.

  4. Accédez à Azure Services » Storage Accounts. Cliquez sur le nom du compte de stockage auquel vous accordez au principal du service Snowflake l’accès.

  5. Cliquez sur Access Control (IAM) » Add role assignment.

  6. Sélectionnez le rôle souhaité à accorder au principal du service Snowflake :

    • Storage Blob Data Reader accorde un accès en lecture uniquement. Cela permet de charger des données à partir de fichiers mis en zone de préparation dans le compte de stockage.

    • Storage Blob Data Contributor accorde un accès en lecture et en écriture. Cela permet de charger ou de décharger des données dans des fichiers en zone de préparation dans le compte de stockage. Le rôle permet également d’exécuter la commande REMOVE pour supprimer des fichiers en zone de préparation dans le compte de stockage.

  7. Recherchez le principal de service Snowflake. Il s’agit de l’identité de la propriété AZURE_MULTI_TENANT_APP_NAME dans la sortie DESC STORAGE INTEGRATION (à l’étape 1). Recherchez la chaîne avant le trait de soulignement dans la propriété AZURE_MULTI_TENANT_APP_NAME.

    Important

    • Azure peut prendre une heure ou plus pour créer le principal de service Snowflake demandé via la page de demande Microsoft dans cette section. Si le principal de service n’est pas disponible immédiatement, nous vous recommandons d’attendre une heure ou deux, puis de relancer la recherche.

    • Si vous supprimez le principal de service, l’intégration de stockage cesse de fonctionner.

    Add role assignment in Azure Storage Console
  8. Cliquez sur le bouton Review + assign.

    Note

    • Selon la documentation de Microsoft Azure, les affectations de rôles peuvent prendre jusqu’à cinq minutes pour se propager.

    • Snowflake met en cache les informations d’identification temporaires pendant une période qui ne peut dépasser le délai d’expiration de 60 minutes. Si vous révoquez l’accès à partir de Snowflake, les utilisateurs pourraient être en mesure de répertorier les fichiers et de charger des données à partir de l’emplacement de stockage dans le Cloud jusqu’à l’expiration du cache.

Étape 3 : Création d’une zone de préparation externe

Créez une zone de préparation externe (Azure) qui fait référence à l’intégration de stockage que vous avez créée à l’ étape 1 : Création d’une intégration Cloud Storage dans Snowflake (dans ce chapitre).

Note

  • La création d’une zone de préparation utilisant une intégration de stockage nécessite un rôle doté du privilège CREATE STAGE pour le schéma ainsi que du privilège USAGE sur l’intégration. Par exemple :

    GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;
    
    GRANT USAGE ON INTEGRATION azure_int TO ROLE myrole;
    
    Copy
  • 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.

  • Ajoutez une barre oblique (/) à la valeur de l’URL pour filtrer le chemin du dossier spécifié. Si la barre oblique est omise, tous les fichiers et dossiers commençant par le préfixe du chemin spécifié sont inclus.

    Notez que la barre oblique est nécessaire pour accéder aux fichiers de données non structurées et les récupérer dans la zone de préparation.

Créez la zone de préparation en utilisant la commande CREATE STAGE.

Par exemple, définissez mydb.public comme base de données et schéma actuels pour la session utilisateur, puis créez une zone de préparation nommée my_azure_stage. Dans cet exemple, la zone de préparation fait référence au conteneur Azure et au chemin d’accès mycontainer1/path1, pris en charge par l’intégration. La zone de préparation fait aussi référence à un objet de format de fichier nommé appelé my_csv_format :

USE SCHEMA mydb.public;

CREATE STAGE my_azure_stage
  STORAGE_INTEGRATION = azure_int
  URL = 'azure://myaccount.blob.core.windows.net/container1/path1'
  FILE_FORMAT = my_csv_format;
Copy

Note

  • Le propriétaire de la zone de préparation (c’est-à-dire le rôle avec le privilège OWNERSHIP sur la zone de préparation) doit avoir le privilège USAGE sur l’intégration de stockage.

  • Pour charger ou décharger des données depuis ou vers une zone de préparation qui utilise une intégration, un rôle doit disposer du privilège USAGE sur la zone de préparation. Il n’est pas nécessaire d’avoir le privilège USAGE sur l’intégration de stockage.

  • Utilisez le point de terminaison blob.core.windows.net pour tous les types de comptes de stockage Azure Blob pris en charge, dont Data Lake Storage Gen2.

  • Le paramètre STORAGE_INTEGRATION est traité séparément des autres paramètres de la zone de préparation tels que FILE_FORMAT. La prise en charge de ces autres paramètres est identique quelle que soit l’intégration utilisée pour accéder à votre conteneur Azure.

Option 2 : Génération d’un jeton SAS

Étape 1 : Générer le jeton SAS

Les instructions guidées suivantes décrivent comment générer un jeton SAS pour accorder à Snowflake un accès limité aux objets de votre compte de stockage :

  1. Connectez-vous au portail Azure.

  2. Dans le tableau de bord d’accueil, sélectionnez Storage Accounts » <compte_stockage>. Sous Security + networking, choisissez Shared access signature.

    Storage Account Details in Azure Storage Console
  3. Sélectionnez les services autorisés suivants :

    • Blob

  4. Sélectionnez les types de ressources autorisées suivants :

    • Container (nécessaire pour lister les objets dans le compte de stockage)

    • Object (nécessaire pour lire/écrire des objets depuis/vers le compte de stockage)

  5. Sélectionnez les autorisations autorisées suivantes pour charger des fichiers de données à partir de ressources Azure :

    • Lire

    • Liste

    Les autorisations Write, Add, et Create sont également nécessaires si vous prévoyez de décharger des fichiers dans un conteneur. En outre, pour utiliser l’option PURGE = TRUE l’autorisation Permanent Delete est requise.

  6. Précisez les dates et heures de début et d’expiration du jeton SAS. Dans le cadre d’un plan de sécurité général, vous pourriez générer un autre jeton SAS périodiquement.

  7. Laissez le champ Adresses IP autorisées vide, et spécifiez HTTPS only ou HTTPS and HTTP sous Allowed protocols.

    Shared Access Signature Details in Azure Storage Console
  8. Cliquez sur le bouton Generate SAS and connection string. Enregistrez la valeur complète dans le champ SAS token, en commençant par et en comprenant le code ?. Il s’agit de votre jeton SAS. Vous spécifierez ce jeton lorsque vous créerez une zone de préparation externe.

Étape 2 : Créer une zone de préparation externe

Créez une zone de préparation externe (Azure) qui fait référence au jeton SAS que vous avez généré à l”étape 1 : Générer le jeton SAS (dans ce chapitre).

L’exemple suivant utilise SQL pour créer une zone de préparation externe nommée my_azure_stage qui inclut les identifiants Azure et une clé de chiffrement maître. L’URL de zone de préparation fait référence au compte myaccount d’Azure. Les fichiers de données sont stockés dans le conteneur mycontainer et le chemin d’accès /load/files . La zone de préparation fait référence à un objet de format de fichier nommé appelé my_csv_format. Notez que l’exemple tronque la valeur MASTER_KEY :

CREATE OR REPLACE STAGE my_azure_stage
  URL='azure://myaccount.blob.core.windows.net/mycontainer/load/files'
  CREDENTIALS=(AZURE_SAS_TOKEN='?sv=2016-05-31&ss=b&srt=sco&sp=rwdl&se=2018-06-27T10:05:50Z&st=2017-06-27T02:05:50Z&spr=https,http&sig=bgqQwoXwxzuD2GJfagRg7VOS8hzNr3QLT7rhS8OFRLQ%3D')
  ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPx...')
  FILE_FORMAT = my_csv_format;
Copy

Notez que les valeurs AZURE_SAS_TOKEN et MASTER_KEY utilisées dans cet exemple ne sont données qu’à titre indicatif.

Note

En spécifiant un objet de format de fichier nommé (ou des options de format de fichier individuelles) pour la zone de préparation, il n’est pas nécessaire de spécifier ultérieurement les mêmes options de format de fichier dans la commande COPY utilisée pour charger les données de la zone de préparation. Pour plus d’informations sur les objets et les options de format de fichier, voir CREATE FILE FORMAT.

Chiffrement des fichiers de données

Activez le chiffrement Azure Storage Service (SSE) pour les données au repos sur votre compte de stockage directement, et Snowflake s’en chargera correctement. Pour plus d’informations, voir la documentation Azure sur SSE.

En outre, Snowflake prend en charge le chiffrement côté client pour déchiffrer les fichiers préparés dans des conteneurs Azure.

  • Chiffrement côté client :

    • AZURE_CSE : nécessite une valeur MASTER_KEY. Pour plus d’informations, voir les informations de chiffrement côté client dans la documentation Microsoft Azure.

      Note

      Les blobs de blocage et les blobs d’ajout prennent en charge le chiffrement côté client, ce qui n’est pas le cas des blobs de page.

Suivant : Création d’une zone de préparation Azure