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.

Option 2

Générez un jeton de 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>/') ]

Où :

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

  • id_client 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 Directory ID.

  • conteneur 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.

  • chemin 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/');

É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>;
    

    Où :

Notez l’URL dans la colonne AZURE_CONSENT_URL, au format suivant :

https://login.microsoftonline.com/<tenant_id>/oauth2/authorize?client_id=<snowflake_application_id>

Notez également la valeur dans la colonne AZURE_MULTI_TENANT_APP_NAME. Il s’agit du nom de l’application client Snowflake créée pour votre compte. Plus loin dans ces instructions, 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 URL. La page affiche une page de demande d’autorisations Microsoft.

  2. Cliquez sur le bouton Accept. Cela permet au principal du service Azure créé pour votre compte Snowflake d’obtenir un jeton d’accès sur n’importe quelle ressource à 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).

  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 stockés dans le compte de stockage.

  7. Search for the Snowflake service principal. This is the identity in the AZURE_MULTI_TENANT_APP_NAME property in the DESC STORAGE INTEGRATION output (in Step 1). Search for the string before the underscore in the AZURE_MULTI_TENANT_APP_NAME property.

    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.

  8. Cliquez sur le bouton Save.

    Note

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

É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;

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;

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> » Settings » Shared access signature.

    Shared access signature in Azure portal
  3. 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)

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

    • Lire

    • Lister

    Les autorisations supplémentaires Write Add et Create sont également nécessaires si vous prévoyez de décharger des fichiers dans un conteneur.

  5. 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.

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

  7. Cliquez sur le bouton Generate SAS. 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 :

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 = 'kPxX0jzYfIamtnJEUTHwq80Au6NbSgPH5r4BDDwOaO8=')
  FILE_FORMAT = my_csv_format;

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