Stockage pour les tables Apache Iceberg™

Les tables Snowflake utilisent généralement un stockage géré par Snowflake. En revanche, les tables Apache Iceberg™ dans Snowflake utilisent un stockage externe que vous configurez et maintenez.

Cette rubrique fournit des informations conceptuelles et des bonnes pratiques pour le stockage des tables Iceberg.

Accord à Snowflake l’accès à votre stockage

Pour accorder à Snowflake l’accès à vos emplacements de stockage des tables Iceberg, vous utilisez le service de gestion des identités et des accès de votre fournisseur cloud. Vous accordez à une identité ou à un principal un accès limité à votre stockage sans échanger de secrets. Il s’agit du même modèle d’accès que Snowflake utilise pour d’autres intégrations, y compris les intégrations de stockage.

Snowflake provisionne un principal pour l’ensemble de votre compte Snowflake lorsque vous créez un volume externe. Le principal est comme suit, en fonction de votre fournisseur cloud :

Fournisseur Cloud

Principal fourni par Snowflake

Amazon Web Services (AWS)

Utilisateur IAM

Google Cloud

Compte de service

Azure

Principal de service

Snowflake s’authentifie directement auprès de votre fournisseur de stockage et le principal provisionné par Snowflake assume un rôle que vous spécifiez. Le rôle doit être autorisé à effectuer des opérations sur votre emplacement de stockage. Par exemple, Snowflake ne peut lire du contenu à partir d’un emplacement de stockage que si le rôle a l’autorisation de lecture à partir de cet emplacement de stockage.

Snowflake a besoin d’une autorisation pour effectuer les actions suivantes sur les tables Iceberg :

Tables gérées par Snowflake

Tables utilisant un catalogue Iceberg externe

Amazon S3

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:ListBucket

  • s3:PutObject

  • s3:DeleteObject

  • s3:GetObjectVersion

  • s3:DeleteObjectVersion

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:ListBucket

  • s3:GetObjectVersion

Google Cloud Storage

  • storage.objects.create

  • storage.objects.delete

  • storage.objects.get

  • storage.objects.list

  • storage.buckets.get

  • storage.objects.get

  • storage.objects.list

Stockage Azur

Toutes les actions autorisées pour le rôle de contributeur de données de stockage Blob

Toutes les actions autorisées pour le rôle de lecteur de données de stockage Blob

Note

L’autorisation s3:PutObject permet d’accéder en écriture à l’emplacement du volume externe. Pour une configuration complète de l’accès en écriture, vous devez définir le paramètre ALLOW_WRITES du volume externe sur TRUE (la valeur par défaut).

Chaque volume externe est associé à un Emplacement de stockage actif particulier, et un seul volume externe peut prendre en charge plusieurs tables Iceberg. Cependant, le nombre de volumes externes dont vous avez besoin dépend de la manière dont vous souhaitez stocker, organiser et sécuriser vos données de table.

Vous pouvez utiliser un seul volume externe si vous souhaitez que les données et les métadonnées de toutes vos tables Snowflake-Iceberg se trouvent dans des sous-répertoires sous le même emplacement de stockage (par exemple, dans le même compartiment S3). Pour configurer ces répertoires pour les tables gérées par Snowflake, voir Répertoires de données et de métadonnées.

Vous pouvez également créer plusieurs volumes externes pour sécuriser différemment différents emplacements de stockage. Par exemple, vous pouvez créer les volumes externes suivants :

  • Un volume externe en lecture seule pour les tables Iceberg gérées en externe.

  • Un volume externe configuré avec un accès en lecture et en écriture pour les tables gérées par Snowflake.

Pour obtenir des instructions complètes sur la manière d’accorder à Snowflake l’accès à votre stockage pour les tables Iceberg, reportez-vous aux rubriques suivantes :

Emplacement de stockage actif

Chaque volume externe prend en charge un seul emplacement de stockage actif. Si vous spécifiez plusieurs emplacements de stockage dans une instruction CREATE EXTERNAL VOLUME , Snowflake assigne un emplacement comme emplacement actif. L’emplacement actif reste le même pendant toute la durée de vie du volume externe.

L’affectation se produit la première fois que vous utilisez le volume externe dans une instruction CREATE ICEBERG TABLE. Snowflake utilise la logique suivante pour choisir un emplacement actif :

  • Si la liste STORAGE_LOCATIONS contient un ou plusieurs emplacements de stockage local, Snowflake utilise le premier emplacement de stockage local de la liste. Un emplacement de stockage local se trouve chez le même fournisseur Cloud et dans la même région que votre compte Snowflake.

  • Si la liste STORAGE_LOCATIONS ne contient aucun emplacement de stockage local, Snowflake sélectionne le premier emplacement de la liste.

Note

  • Les tables Iceberg inter-Cloud/interrégionales ne sont prises en charge que lorsque vous utilisez un catalogue Iceberg externe. Pour plus d’informations, voir Prise en charge inter-Cloud/interrégionale.

  • Les volumes externes créés avant la version 7.44 de Snowflake peuvent avoir utilisé une logique différente pour sélectionner un emplacement actif.

Vérification de l’accès au stockage

Pour vérifier que Snowflake peut s’authentifier avec succès auprès de votre fournisseur de stockage, appelez la fonction SYSTEM$VERIFY_EXTERNAL_VOLUME.

SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('my_s3_external_volume');
Copy

Pour les tables gérées par Snowflake, Snowflake vérifie automatiquement l’accès à l’emplacement de stockage actif sur votre volume externe dans les situations suivantes :

  • La première fois que vous spécifiez ce volume externe dans une instruction CREATE ICEBERG TABLE pour une table gérée par Snowflake.

  • La première fois que vous convertissez une table pour utiliser Snowflake comme catalogue Iceberg.

La propriété ALLOW_WRITES du volume externe doit être définie sur TRUE.

Snowflake tente les opérations de stockage suivantes pour vérifier l’emplacement de stockage.

  1. Écriture d’un fichier de test.

  2. Lecture du fichier.

  3. Affichage du contenu du chemin du fichier.

  4. Suppression du fichier.

Si l’une des opérations échoue, l’instruction CREATE ICEBERG TABLE (ou ALTER ICEBERG TABLE … CONVERT TO MANAGED) échoue et vous recevez un message d’erreur.

Gestion des fichiers

Cette section explique comment fonctionne la gestion des fichiers de tables Iceberg dans le stockage, en fonction du type de table Iceberg.

Tables gérées par Snowflake

Important

  • N’autorisez pas d’autres outils à accéder à la suppression ou au remplacement d’objets associés à des tables Iceberg gérées par Snowflake.

  • Assurez-vous que le principal Snowflake conserve l’accès au stockage de votre table. Pour plus d’informations, voir Accord à Snowflake l’accès à votre stockage.

Bien que vous configurez et gérez les emplacements de stockage pour les tables Iceberg, Snowflake opère exclusivement sur les objets de votre stockage (fichiers de données et de métadonnées) qui appartiennent aux tables gérées par Snowflake. Snowflake effectue une maintenance périodique sur ces objets de table afin d’optimiser les performances des requêtes et de nettoyer les données supprimées.

Les requêtes peuvent échouer si d’autres outils suppriment ou remplacent des objets de table gérés par Snowflake. De même, les requêtes sur la table et les opérations de maintenance de la table de Snowflake échoueront si vous révoquez l’accès du principal Snowflake à votre stockage.

Snowflake supprime les objets après l’expiration de la période de conservation des données de la table lorsque les données de la table gérée par Snowflake sont supprimées ou que la table est supprimée.

Répertoires de données et de métadonnées

Pour les tables gérées par Snowflake, Snowflake écrit les fichiers de données Parquet et les métadonnées des tables dans les chemins suivants de votre stockage cloud externe :

  • STORAGE_BASE_URL/BASE_LOCATION/data/

  • STORAGE_BASE_URL/BASE_LOCATION/metadata/

Où :

  • STORAGE_BASE_URL est l’URL de base pour l’emplacement de stockage actif associé à votre volume externe.

  • BASE_LOCATION est le nom d’un répertoire sous un chemin relatif à partir de votre volume externe (spécifié dans votre instruction CREATE ICEBERG TABLE).

Spécification d’une chaîne vide pour BASE_LOCATION

Si vous spécifiez une chaîne vide ('') pour BASE_LOCATION, Snowflake crée les répertoires data/ et metadata/ sous votre STORAGE_BASE_URL.

Par exemple : STORAGE_BASE_URL/data/

Utilisation du même emplacement pour plusieurs tables

Si vous utilisez le même emplacement de stockage et spécifiez le même emplacement de base pour plusieurs tables, Snowflake écrit les données de toutes ces tables dans le même répertoire data/. De même, Snowflake écrit les métadonnées de toutes ces tables dans le même répertoire metadata/.

Organisation du stockage de tables avec BASE_LOCATION

Pour organiser le stockage des fichiers de plusieurs tables Iceberg sous la même STORAGE_BASE_URL, pensez à utiliser le nom de la table comme BASE_LOCATION dans votre instruction CREATE ICEBERG TABLE. De cette façon, Snowflake écrit les données et les métadonnées dans un répertoire portant le même nom que la table.

Par exemple :

CREATE OR REPLACE ICEBERG TABLE iceberg_table_1 (
  col_1 int,
  col_2 string
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'iceberg_external_volume'
  BASE_LOCATION = 'iceberg_table_1';

CREATE OR REPLACE ICEBERG TABLE iceberg_table_2 (
  col_1 int,
  col_2 string
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'iceberg_external_volume'
  BASE_LOCATION = 'iceberg_table_2';
Copy

L’instruction aboutit à la structure de répertoire suivante dans votre stockage cloud externe :

STORAGE_BASE_URL
|-- iceberg_table_1
|   |-- data/
|   |-- metadata/
|-- iceberg_table_2
|   |-- data/
|   |-- metadata/
Copy

Tables utilisant un catalogue externe

Snowflake n’écrit pas et ne supprime pas les objets de stockage pour les tables Iceberg gérées en externe ou sur les volumes externes dont la propriété ALLOW_WRITES est définie sur FALSE.

Pour accéder aux données et métadonnées de vos tables, Snowflake assume le rôle de contrôle d’accès que vous configurez pour votre volume externe. Vous accordez au rôle l’autorisation d’accès à un emplacement de stockage (dans un compartiment ou un conteneur). Tous les fichiers de données et de métadonnées de vos tables doivent se trouver à cet emplacement. Par exemple, si votre emplacement de stockage est un compartiment S3, tous vos fichiers de données et de métadonnées doivent exister quelque part dans ce compartiment.

En outre, la conversion en table ne réécrit aucun fichier de données ou de métadonnées. Snowflake n’écrit dans une table Iceberg qu’après avoir converti une table pour utiliser Snowflake comme catalogue.

Activation des journaux d’accès au stockage

Pour diagnostiquer les problèmes et auditer l’accès aux emplacements de stockage associés à un volume externe, vous pouvez activer la journalisation du stockage. Les journaux de stockage vous aident à identifier la cause des fichiers manquants ou corrompus.

Activez la journalisation avec votre fournisseur de stockage. Parce que vous possédez et gérez le stockage des tables Iceberg, Snowflake ne peut pas activer la journalisation ou l’audit sur vos emplacements de stockage Iceberg.

Pour en savoir plus sur les journaux d’accès au stockage de votre fournisseur de stockage, consultez les rubriques externes suivantes :

Protection de vos fichiers grâce à la gestion des versions et à la conservation des objets

Si vos données de tables Iceberg se trouvent dans un référentiel de données central (ou data lake) exploité par plusieurs outils et services, une suppression accidentelle ou une corruption peut se produire. Pour protéger les données des tables Iceberg et garantir la récupération des données supprimées ou écrasées accidentellement, utilisez la gestion du cycle de vie du stockage et la gestion des versions proposées par votre fournisseur de stockage.

Grâce à la gestion du cycle de vie, vous pouvez définir des règles de conservation et de suivi pour les objets de stockage. Pour en savoir plus sur la gestion du cycle de vie de votre fournisseur de stockage, consultez les rubriques externes suivantes :

Pour prendre en charge la récupération d’objets, vous pouvez également activer la gestion des versions pour votre stockage cloud externe.

Chiffrage des fichiers de tables

Snowflake peut lire les fichiers de tables Iceberg dans le stockage que vous chiffrez à l’aide de schémas courants de chiffrement côté serveur (SSE). Vous devez utiliser votre fournisseur de services cloud pour gérer les clés de chiffrement et accorder au principal Snowflake l’accès à vos clés si vous utilisez une clé gérée par le client.

Pour Amazon S3, Snowflake prend en charge les options SSE suivantes :

Option SSE

Configuration

SSE avec des clés gérées par Amazon S3 (SSE-S3)

Spécifiez ENCRYPTION = ( TYPE = 'AWS_SSE_S3' ) dans la commande CREATE EXTERNAL VOLUME.

SSE avec clés AWS KMS (SSE-KMS)

Spécifiez ENCRYPTION = ( TYPE = 'AWS_SSE_KMS' KMS_KEY_ID='my_key' ) dans la commande CREATE EXTERNAL VOLUME.

Vous devez également accorder les privilèges requis pour le chiffrement SSE-KMS. Pour plus d’informations, reportez-vous à l’étape 3 de Configurer un volume externe pour Amazon S3.

Pour Google Cloud Storage, Snowflake prend en charge l’option SSE suivante :

Option SSE

Configuration

SSE en utilisant des clés stockées dans Google Cloud KMS

Spécifiez ENCRYPTION = ( TYPE = 'GCS_SSE_KMS' KMS_KEY_ID = 'my_key' ) dans la commande CREATE EXTERNAL VOLUME.

Vous devez également Accordez au compte de service GCS des autorisations sur les clés du service de gestion des clés de Google Cloud.