Configuration de l’accès sécurisé à Amazon S3

Pour lire des données et écrire dans un compartiment S3, les politiques de sécurité et de gestion des accès sur le compartiment doivent permettre à Snowflake d’y accéder.

Les options suivantes pour configurer un accès sécurisé à un compartiment S3 privé 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 à une entité Gestion des identités et des accès Snowflake (IAM).

Note

Nous vous recommandons vivement cette option, qui vous évite de fournir des informations d’identification AWS IAM lors de la création de zones de préparation ou du chargement de données.

Option 2

Configurez un rôle AWS IAM avec les politiques et autorisations requises pour accéder à votre compartiment S3 externe. Cette approche permet aux utilisateurs individuels d’éviter de fournir et de gérer des informations d’identification de sécurité et des clés d’accès.

Remarque : la mise en œuvre de cette fonctionnalité nécessite une zone de préparation externe nommée. L’accès à une URL vers un compartiment S3 directement dans une instruction COPY n’est pas pris en charge.

Important

La possibilité d’utiliser un rôle IAM AWS pour accéder à un compartiment S3 privé pour charger ou décharger des données est désormais obsolète (c’est-à-dire que la prise en charge sera supprimée dans une prochaine version, à déterminer). Nous vous recommandons vivement de modifier toutes les zones de préparation S3 existantes qui utilisent cette fonctionnalité pour référencer à la place des objets d’intégration de stockage (Option 1 dans ce chapitre).

Option 3

Configurez un utilisateur AWS IAM avec les autorisations requises pour accéder à votre compartiment S3. Cette configuration unique consiste à établir les autorisations d’accès sur un compartiment et à associer les autorisations requises à un utilisateur IAM. Vous pouvez ensuite accéder à une zone de préparation externe (c.-à-d. S3) qui pointe vers le compartiment avec la clé AWS et la clé secrète.

Ce chapitre décrit comment exécuter les tâches requises dans S3.

Note

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

Dans ce chapitre :

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

Cette section explique comment utiliser des intégrations de stockage pour permettre à Snowflake de lire et d’écrire des données dans un compartiment Amazon S3 référencé dans une zone de préparation externe (c’est-à-dire S3). 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 de gestion des identités et des accès (IAM) AWS. Un administrateur de votre organisation accorde les autorisations utilisateur IAM de l’intégration dans le compte AWS.

Une intégration peut également répertorier des compartiments (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

Pour terminer les instructions de cette section, des autorisations sont nécessaires dans AWS pour créer et gérer des stratégies et des rôles IAM. Si vous n’êtes pas un administrateur AWS, demandez à votre administrateur AWS d’effectuer ces tâches.

Le diagramme suivant illustre le flux d’intégration d’une zone de préparation S3 :

Amazon S3 Stage Integration Flow
  1. Une zone de préparation externe (c.-à-d S3) fait référence à un objet d’intégration de stockage dans sa définition.

  2. Snowflake associe automatiquement l’intégration de stockage à un utilisateur IAM S3 créé pour votre compte. Snowflake crée un seul utilisateur IAM référencé par toutes les intégrations de stockage S3 de votre compte Snowflake.

  3. Un administrateur AWS de votre organisation accorde des autorisations à l’utilisateur IAM pour accéder au compartiment référencé dans la définition de la zone de préparation. Notez que de nombreux objets de zones de préparation externes peuvent référencer différents compartiments et chemins et utiliser la même intégration de stockage 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 à l’utilisateur IAM sur le compartiment avant d’autoriser ou de refuser l’accès.

Dans cette section :

Étape 1 : Configuration des autorisations d’accès pour le compartiment S3

Exigences en matière de contrôle d’accès AWS

Snowflake requiert les permissions suivantes sur un compartiment S3 et un dossier pour accéder aux fichiers dans le dossier (et tout sous-dossier) :

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

Note

Les autorisations supplémentaires s3:PutObject et s3:DeleteObject ne sont nécessaires que si vous prévoyez de décharger des fichiers dans le compartiment ou de purger automatiquement les fichiers après les avoir chargés dans une table.

Comme bonne pratique, Snowflake recommande la création d’une politique IAM pour l’accès de Snowflake au compartiment S3. Vous pouvez alors joindre la politique au rôle, et utiliser les identifiants de sécurité générés par AWS pour que le rôle puisse accéder aux fichiers dans le compartiment.

Création d’une politique IAM

Les instructions étape par étape suivantes décrivent comment configurer les permissions d’accès pour Snowflake dans votre console de gestion AWS de sorte que vous puissiez utiliser un compartiment S3 pour charger et décharger les données :

  1. Connectez-vous à la console de gestion AWS.

  2. Dans le tableau de bord d’accueil, sélectionnez Identity & Access Management (IAM) :

    Identity & Access Management in AWS Management Console
  3. Cliquez sur Account settings dans le volet de navigation de gauche.

  4. Développez la liste Security Token Service Regions, recherchez la région AWS qui correspond à la région où se trouve votre compte et choisissez Activate si le statut est Inactive.

  5. Cliquez sur Policies dans le volet de navigation de gauche.

  6. Cliquez sur Create Policy :

    Create Policy button on Policies page
  7. Cliquez sur l’onglet JSON.

  8. Ajoutez le document de politique qui permettra à Snowflake d’accéder au compartiment et au dossier S3.

    La politique suivante (au format JSON) fournit à Snowflake les autorisations requises pour charger ou décharger des données à l’aide d’un seul chemin de dossier et de compartiment. Vous pouvez également purger les fichiers de données en utilisant l’option de copie PURGE.

    Copiez et collez le texte dans l’éditeur de stratégies :

    Note

    Assurez-vous de remplacer le compartiment et le préfixe par votre nom de compartiment actuel et le préfixe du chemin du dossier.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                  "s3:PutObject",
                  "s3:GetObject",
                  "s3:GetObjectVersion",
                  "s3:DeleteObject",
                  "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    

    Important

    Définir la condition "s3:prefix": sur ["*"] accorde l’accès à tous les préfixes dans le compartiment spécifié. Si plus de 1 000 objets existent dans le compartiment, vous pourriez rencontrer l’erreur suivante : Access Denied (Status Code: 403; Error Code: AccessDenied).

    Pour éviter cette erreur, supprimez la condition de la politique IAM, par ex. :

    "Condition": {
          "StringLike": {
              "s3:prefix": [
                  "*"
              ]
          }
      }
    

    La politique accorde toujours l’accès aux fichiers du compartiment, mais S3 ne renvoie pas d’erreur si le compartiment contient plus de 1 000 objets.

    Notez que les politiques AWS prennent en charge une variété de cas d’utilisation de sécurité différents.

    La politique suivante fournit à Snowflake les permissions requises pour charger des données à partir d’un seul compartiment en lecture seule et chemin de dossier. La politique inclut les autorisations s3:GetObject, s3:GetObjectVersion et s3:ListBucket :

    Politique alternative : Chargement à partir d’un compartiment S3 en lecture seule

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                  "s3:GetObject",
                  "s3:GetObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    
  9. Cliquez sur Review policy.

  10. Entrez le nom de la stratégie (ex. : snowflake_access) et une description facultative. Cliquez sur Create policy.

    Create Policy button in Review Policy page

Étape 2 : Créer le rôle IAM dans AWS

Dans la console de gestion AWS, créez un rôle AWS IAM qui accorde des privilèges sur le compartiment S3 contenant vos fichiers de données.

  1. Connectez-vous à la console de gestion AWS.

  2. Dans le tableau de bord d’accueil, sélectionnez Identity & Access Management (IAM) :

    Identity & Access Management in AWS Management Console
  3. Cliquez sur Roles dans le volet de navigation de gauche.

  4. Cliquez sur le bouton Create role.

    Select Trusted Entity Page in AWS Management Console
  5. Sélectionnez Another AWS account comme type d’entité de confiance.

  6. Dans le champ Account ID, entrez votre propre ID de compte AWS temporaire. Plus tard, vous modifierez la relation de confiance et accorderez l’accès à Snowflake.

  7. Sélectionnez l’option Require external ID. Entrez un ID fictif tel que 0000. Plus tard, vous modifierez la relation de confiance et spécifierez l’ID externe pour votre zone de préparation Snowflake. Un ID externe est requis pour accorder l’accès à vos ressources AWS (c.-à-d. S3) à un tiers (p. ex Snowflake).

  8. Cliquez sur le bouton Next.

  9. Localisez la politique que vous avez créée lors de l” étape 1 : Configuration des autorisations d’accès au compartiment S3 (dans ce chapitre), puis sélectionnez cette stratégie.

  10. Cliquez sur le bouton Next.

    Review Page in AWS Management Console
  11. Entrez un nom et une description pour le rôle et cliquez sur le bouton Create role.

    Vous avez maintenant créé une stratégie IAM pour un compartiment, créé un rôle IAM et associé la stratégie au rôle.

  12. Enregistrez la valeur Role ARN située sur la page de résumé du rôle. Dans l’étape suivante, vous créerez une intégration Snowflake qui fait référence à ce rôle.

    IAM Role

Étape 3 : 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 utilisateur généré pour la gestion d’identité et d’accès (IAM) pour votre stockage Cloud S3, ainsi qu’un ensemble facultatif d’emplacements de stockage autorisés ou bloqués (c.-à-d. des compartiments). Les administrateurs de fournisseur de Cloud de votre entreprise accordent des autorisations sur les emplacements de stockage à l’utilisateur 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 externes (c’est-à-dire S3). L’URL dans la définition de zone de préparation doit correspondre aux compartiments S3 (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 = S3
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = '<iam_role>'
  STORAGE_ALLOWED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/') ]

Où :

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

  • iam_rôle est le nom Amazon Resource Name (ARN) du rôle que vous avez créé à l’ étape 2 : Créer le rôle IAM dans AWS (dans ce chapitre).

  • compartiment est le nom d’un compartiment S3 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.

  • chemin 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 s3_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = S3
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole'
  STORAGE_ALLOWED_LOCATIONS = ('s3://mybucket1/mypath1/', 's3://mybucket2/mypath2/')
  STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');

Étape 4 : Récupération de l’utilisateur AWS IAM de votre compte Snowflake

  1. Exécutez la commande DESCRIBE INTEGRATION pour récupérer l’ARN de l’utilisateur AWS IAM créé automatiquement pour votre compte Snowflake :

    DESC INTEGRATION <integration_name>;
    

    Où :

    Par exemple :

    DESC INTEGRATION s3_int;
    
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
    | property                  | property_type | property_value                                                                 | property_default |
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------|
    | ENABLED                   | Boolean       | true                                                                           | false            |
    | STORAGE_ALLOWED_LOCATIONS | List          | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/                                | []               |
    | STORAGE_BLOCKED_LOCATIONS | List          | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/    | []               |
    | STORAGE_AWS_IAM_USER_ARN  | String        | arn:aws:iam::123456789001:user/abc1-b-self1234                                 |                  |
    | STORAGE_AWS_ROLE_ARN      | String        | arn:aws:iam::001234567890:role/myrole                                          |                  |
    | STORAGE_AWS_EXTERNAL_ID   | String        | MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=                               |                  |
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
    
  2. Notez les valeurs suivantes :

    Valeur

    Description

    STORAGE_AWS_IAM_USER_ARN

    L’utilisateur AWS IAM créé pour votre compte Snowflake, arn:aws:iam::123456789001:user/abc1-b-self1234 dans cet exemple. Nous mettons à disposition un seul utilisateur IAM pour l’intégralité de votre compte Snowflake. Toutes les intégrations de stockage S3 utilisent cet utilisateur IAM.

    STORAGE_AWS_EXTERNAL_ID

    L’ID externe nécessaire pour établir une relation de confiance.

    Vous fournirez ces valeurs dans la section suivante.

Étape 5 : Octroi des autorisations utilisateur à IAM 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 de gestion AWS de sorte que vous puissiez utiliser un compartiment S3 pour charger et décharger les données :

  1. Connectez-vous à la console de gestion AWS.

  2. Dans le tableau de bord d’accueil, sélectionnez Identity & Access Management (IAM) :

    Identity & Access Management in AWS Management Console
  3. Cliquez sur Roles dans le volet de navigation de gauche.

  4. Cliquez sur le rôle que vous avez créé à l”étape 2 : Créer le rôle IAM dans AWS (dans ce chapitre).

  5. Cliquez sur l’onglet Trust relationships.

  6. Cliquez sur le bouton Edit trust relationship.

  7. Modifiez le document de politique avec les valeurs de sortie DESC STORAGE INTEGRATION que vous avez enregistrées dans l” étape 4 : Récupération de l’utilisateur AWS IAM de votre compte Snowflake (dans ce chapitre) :

    Document de politique pour le rôle IAM

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<snowflake_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<snowflake_external_id>"
            }
          }
        }
      ]
    }
    

    Où :

    • snowflake_external_id est la valeur STORAGE_AWS_EXTERNAL_ID que vous avez enregistrée.

    • snowflake_user_arn est la valeur STORAGE_AWS_IAM_USER_ARN que vous avez enregistrée.

  8. Cliquez sur le bouton Update Trust Policy. Les modifications sont enregistrées.

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

Créez une zone de préparation externe (S3) qui fait référence à l’intégration de stockage que vous avez créée à l’ étape 3 : 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 de stockage. Par exemple :

GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;

GRANT USAGE ON INTEGRATION s3_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_s3_stage. Dans cet exemple, la zone de préparation fait référence au compartiment S3 et au chemin d’accès mybucket1/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_s3_stage
  STORAGE_INTEGRATION = s3_int
  URL = 's3://bucket1/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.

  • 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 compartiment S3.

Option 2 : configuration d’un rôle IAM AWS — Obsolète

Cette section décrit comment configurer un compartiment S3, un rôle IAM et des politiques pour que Snowflake accède à une zone de préparation externe de manière sécurisée au nom d’un ou plusieurs utilisateurs individuels de votre compte Snowflake.

Comme bonne pratique, limitez l’accès au compartiment S3 à un rôle IAM spécifique avec les autorisations minimales requises. Le rôle IAM est créé dans votre compte AWS avec les autorisations d’accès à votre compartiment S3 et la politique de confiance pour permettre à Snowflake d’assumer le rôle IAM.

Trust policies allowing IAM user access to S3 bucket
  1. Un utilisateur AWS IAM créé pour votre compte Snowflake est associé à un rôle IAM que vous configurez via une relation de confiance.

  2. Le rôle se voit accorder un accès limité à un compartiment S3 par le biais de politiques IAM que vous configurez.

Note

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

Étape 1 : Configuration des autorisations d’accès au compartiment S3

Exigences en matière de contrôle d’accès AWS

Snowflake requiert les permissions suivantes sur un compartiment S3 et un dossier pour accéder aux fichiers dans le dossier (et tout sous-dossier) :

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

Note

Les autorisations supplémentaires s3:PutObject et s3:DeleteObject ne sont nécessaires que si vous prévoyez de décharger des fichiers dans le compartiment ou de purger automatiquement les fichiers après les avoir chargés dans une table.

Comme bonne pratique, Snowflake recommande la création d’une politique IAM pour l’accès de Snowflake au compartiment S3. Vous pouvez alors joindre la politique au rôle, et utiliser les identifiants de sécurité générés par AWS pour que le rôle puisse accéder aux fichiers dans le compartiment.

Création d’une politique IAM

Les instructions étape par étape suivantes décrivent comment configurer les permissions d’accès pour Snowflake dans votre console de gestion AWS de sorte que vous puissiez utiliser un compartiment S3 pour charger et décharger les données :

  1. Connectez-vous à la console de gestion AWS.

  2. Dans le tableau de bord d’accueil, sélectionnez Identity & Access Management (IAM) :

    Identity & Access Management in AWS Management Console
  3. Cliquez sur Account settings dans le volet de navigation de gauche.

  4. Développez la liste Security Token Service Regions, recherchez la région AWS qui correspond à la région où se trouve votre compte et choisissez Activate si le statut est Inactive.

  5. Cliquez sur Policies dans le volet de navigation de gauche.

  6. Cliquez sur Create Policy :

    Create Policy button on Policies page
  7. Cliquez sur l’onglet JSON.

  8. Ajoutez le document de politique qui permettra à Snowflake d’accéder au compartiment et au dossier S3.

    La politique suivante (au format JSON) fournit à Snowflake les autorisations requises pour charger ou décharger des données à l’aide d’un seul chemin de dossier et de compartiment. Vous pouvez également purger les fichiers de données en utilisant l’option de copie PURGE.

    Copiez et collez le texte dans l’éditeur de stratégies :

    Note

    Assurez-vous de remplacer le compartiment et le préfixe par votre nom de compartiment actuel et le préfixe du chemin du dossier.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                  "s3:PutObject",
                  "s3:GetObject",
                  "s3:GetObjectVersion",
                  "s3:DeleteObject",
                  "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    

    Important

    Définir la condition "s3:prefix": sur ["*"] accorde l’accès à tous les préfixes dans le compartiment spécifié. Si plus de 1 000 objets existent dans le compartiment, vous pourriez rencontrer l’erreur suivante : Access Denied (Status Code: 403; Error Code: AccessDenied).

    Pour éviter cette erreur, supprimez la condition de la politique IAM :

    "Condition": {
          "StringLike": {
              "s3:prefix": [
                  "*"
              ]
          }
      }
    

    La politique accorde toujours l’accès aux fichiers du compartiment, mais S3 ne renvoie pas d’erreur si le compartiment contient plus de 1 000 objets.

    Notez que les politiques AWS prennent en charge une variété de cas d’utilisation de sécurité différents.

    La politique suivante fournit à Snowflake les permissions requises pour charger des données à partir d’un seul compartiment en lecture seule et chemin de dossier. La politique inclut les autorisations s3:GetObject, s3:GetObjectVersion et s3:ListBucket :

    Politique alternative : Chargement à partir d’un compartiment S3 en lecture seule

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                  "s3:GetObject",
                  "s3:GetObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    
  9. Cliquez sur Review policy.

  10. Entrez le nom de la stratégie (ex. : snowflake_access) et une description facultative. Cliquez ensuite sur Create policy pour créer la politique.

    Create Policy button in Review Policy page

Étape 2 : Créer un rôle IAM AWS

Dans la console de gestion AWS, créez un rôle AWS IAM qui accorde des privilèges sur le compartiment S3 contenant vos fichiers de données.

  1. Connectez-vous à la console de gestion AWS.

  2. Dans le tableau de bord d’accueil, sélectionnez Identity & Access Management (IAM) :

    Identity & Access Management in AWS Management Console
  3. Cliquez sur Roles dans le volet de navigation de gauche.

  4. Cliquez sur le bouton Create role.

    Select Trusted Entity Page in AWS Management Console
  5. Sélectionnez Another AWS account comme type d’entité de confiance.

  6. Dans le champ Account ID, entrez votre propre ID de compte AWS. Plus tard, vous modifierez la relation de confiance et accorderez l’accès à Snowflake. Un ID externe est requis pour accorder l’accès à vos ressources AWS (c.-à-d. S3) à un tiers (c.-à-d. Snowflake dans le cas présent) ultérieurement dans ces instructions.

  7. Sélectionnez l’option Require external ID. Entrez un ID fictif tel que 0000. Plus tard, vous modifierez la relation de confiance et spécifierez l’ID externe pour votre zone de préparation Snowflake.

  8. Cliquez sur le bouton Next.

  9. Localisez la politique que vous avez créée lors de l” étape 1 : Configuration des autorisations d’accès au compartiment S3 (dans ce chapitre), et sélectionnez cette politique.

  10. Cliquez sur le bouton Next.

    Review Page in AWS Management Console
  11. Entrez un nom et une description pour le rôle et cliquez sur le bouton Create role.

    Vous avez maintenant créé une stratégie IAM pour un compartiment, créé un rôle IAM et associé la stratégie au rôle.

  12. Enregistrez la valeur Role ARN située sur la page de résumé du rôle. Dans la zone de préparation suivante, vous créerez une étape Snowflake qui fait référence à ce rôle en tant qu’informations d’identification de sécurité.

    IAM Role

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

Créez une zone de préparation externe (c’est-à-dire S3) qui fait référence au rôle AWS que vous avez créé.

  1. Créez une zone de préparation externe à l’aide de la commande CREATE STAGE, ou vous pouvez choisir de modifier une zone de préparation externe existant et définir l’option CREDENTIALS.

    Note

    Les informations d’identification sont traitées séparément des autres paramètres de la zone de préparation tels que ENCRYPTION et FILE_FORMAT. La prise en charge de ces autres paramètres est la même quel que soit l’identifiant utilisé pour accéder à votre compartiment S3 externe.

    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_S3_stage. Dans cet exemple, la zone de préparation fait référence au compartiment S3 et au chemin mybucket/load/files. Les fichiers du compartiment S3 sont chiffrés avec le chiffrement côté serveur (AWS_SSE_KMS) :

    USE SCHEMA mydb.public;
    
    CREATE STAGE my_s3_stage
      URL='s3://mybucket/load/files'
      CREDENTIALS = (AWS_ROLE = 'arn:aws:iam::001234567890:role/mysnowflakerole')
      ENCRYPTION=(TYPE='AWS_SSE_KMS' KMS_KEY_ID = 'aws/key');
    
  2. Exécutez la commande DESCRIBE STAGE pour visualiser les propriétés de la zone de préparation :

    DESC STAGE my_S3_stage;
    
    +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
    | parent_property    | property                       | property_type | property_value                                                 | property_default |
    |--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------|
    ...
    | STAGE_CREDENTIALS  | AWS_ROLE                       | String        | arn:aws:iam::001234567890:role/mysnowflakerole                 |                  |
    | STAGE_CREDENTIALS  | AWS_EXTERNAL_ID                | String        | MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw=               |                  |
    | STAGE_CREDENTIALS  | SNOWFLAKE_IAM_USER             | String        | arn:aws:iam::123456789001:user/vj4g-a-abcd1234                 |                  |
    +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
    
  3. Enregistrez les valeurs pour les propriétés SNOWFLAKE_IAM_USER et AWS_EXTERNAL_ID, où :

    SNOWFLAKE_IAM_USER

    Un utilisateur AWS IAM créé pour votre compte Snowflake. Cet utilisateur est le même pour chaque zone de préparation S3 externe créée dans votre compte.

    AWS_EXTERNAL_ID

    Un ID unique attribué à la zone de préparation spécifique. L’ID a le format suivant :

    snowflakeCompte_SFCRole=snowflakeRoleId_Idaléatoire

    Notez que les valeurs AWS_ROLE, AWS_EXTERNAL_ID et SNOWFLAKE_IAM_USER utilisées dans cet exemple ne sont données qu’à titre indicatif.

    Dans l’étape suivante, vous configurerez votre rôle IAM AWS pour donner accès à l’utilisateur IAM Snowflake en utilisant l’ID externe AWS généré.

Étape 4 : Configuration du rôle AWS IAM pour permettre l’accès à la zone de préparation

Dans la console de gestion AWS, configurez le rôle IAM en utilisant les propriétés de zone de préparation que vous avez enregistrées dans l” étape 3 : Créer une zone de préparation externe (dans cette rubrique) :

  1. Connectez-vous à la console de gestion AWS.

  2. Dans le tableau de bord d’accueil, sélectionnez Identity & Access Management (IAM) :

    Identity & Access Management in AWS Management Console
  3. Cliquez sur Roles dans le volet de navigation de gauche, puis sur le rôle que vous avez créé à l”étape 2 : Créer un rôle IAM AWS (dans cette rubrique).

  4. Cliquez sur l’onglet Trust relationships et cliquez sur le bouton Edit trust relationship.

  5. Dans le champ Policy Document , mettez à jour la politique avec les valeurs des propriétés pour la zone de préparation :

    • AWS : Entrez l’ARN pour la propriété de la zone de préparation SNOWFLAKE_IAM_USER, c’est-à-dire arn:aws:iam::123456789001:user/vj4g-a-abcd1234 dans cet exemple.

    • sts:ExternalId : Entrez l’ID externe généré, c’est-à-dire MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw= dans cet exemple.

      {
          "Version": "2012-10-17",
          "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::123456789001:user/vj4g-a-abcd1234"
                    ]
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringEquals": {
                        "sts:ExternalId": "MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw="
                    }
                }
            }
          ]
      }
      

      Note

      La politique de confiance ci-dessus permet à une seule zone de préparation externe de votre compte Snowflake d’assumer votre rôle IAM. Il s’agit de la politique de confiance la plus restrictive et donc la plus sûre.

      La permission d’assumer le rôle IAM est associée à l’ID externe. Un ID externe a le format suivant :

      compte_snowflake_SFCRole=id_rôle_snowflake_id_aléatoire

      Où :

      • compte_snowflake est le nom attribué à votre compte Snowflake.

      • id_rôle_snowflake est un ID affecté au rôle Snowflake qui a créé la zone de préparation dans Étape 3 : Création d’une zone de préparation externe (dans cette rubrique).

        Dans l’exemple actuel, la valeur id_rôle_snowflake est 2. Cet ID est associé à un seul rôle dans votre compte Snowflake. Le but de cet ID est limité aux stratégies de confiance pour les zones de préparation externes ; en tant que tel, une correspondance entre les rôles Snowflake et les IDs n’est pas disponible. L’ID de rôle d’un rôle donné apparaît uniquement dans la valeur AWS_EXTERNAL_ID de la sortie DESCRIBE STAGE. Comme bonne pratique, limitez la capacité de créer des zones de préparation S3 externes à un seul rôle Snowflake.

        Notez que le rôle qui crée une zone de préparation n’est pas nécessairement le même que celui du propriétaire de la zone de préparation (c’est-à-dire le rôle qui dispose du privilège OWNERSHIP sur la zone de préparation). La propriété de la zone de préparation peut être transférée ultérieurement à un rôle différent, sans modification correspondante de la stratégie de confiance.

      Pour des raisons de sécurité, si vous créez une nouvelle zone de préparation (ou recréez une zone de préparation existante à l’aide de la syntaxe CREATE OR REPLACE STAGE), la zone de préparation résultante aura un ID externe différent et ne pourra donc assumer le rôle IAM que si la politique de confiance est modifiée.

      Si vous avez besoin d’une politique de confiance avec un ensemble de restrictions moins sécurisé (c’est-à-dire une politique prenant en charge toutes les zones de préparation externes de votre compte), remplacez id_aléatoire dans l’ID externe par un caractère générique (*) :

      compte_snowflake_SFCRole=id_rôle_snowflake_*, par exemple MYACCOUNT_SFCRole=2_* dans l’exemple actuel.

      Cette forme d’ID externe autorise toute zone de préparation S3 externe créée par un utilisateur dans votre compte ayant le même rôle Snowflake (c.-à-d. SYSADMIN) à assumer le rôle IAM, et en retour à tout compartiment S3 le rôle IAM auquel il a accès. Notez que si vous mettez en œuvre ce type de politique de confiance moins sûre, vous devez remplacer le paramètre Condition par StringEquals StringLike.

  6. Cliquez sur le bouton Update Trust Policy.

Vous avez maintenant terminé l’installation unique pour accéder à votre compartiment S3 en utilisant un rôle AWS.

Option 3 : Configuration d’informations d’identification IAM AWS

Cette section décrit comment configurer une stratégie de sécurité pour un compartiment S3 et des identifiants d’accès d’un utilisateur IAM spécifique pour accéder à une zone de préparation externe de manière sécurisée.

Étape 1 : Configuration d’une politique d’accès au compartiment S3

Exigences en matière de contrôle d’accès AWS

Snowflake requiert les permissions suivantes sur un compartiment S3 et un dossier pour accéder aux fichiers dans le dossier (et tout sous-dossier) :

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

Note

Les autorisations supplémentaires s3:PutObject et s3:DeleteObject ne sont nécessaires que si vous prévoyez de décharger des fichiers dans le compartiment ou de purger automatiquement les fichiers après les avoir chargés dans une table.

Comme bonne pratique, Snowflake recommande la création d’une politique IAM et d’un utilisateur pour l’accès de Snowflake au compartiment S3. Vous pouvez alors joindre la politique à l’utilisateur, et utiliser les identifiants de sécurité générés par AWS pour que l’utilisateur puisse accéder aux fichiers dans le compartiment.

Création d’une politique IAM

Les instructions étape par étape suivantes décrivent comment configurer les permissions d’accès pour Snowflake dans votre console de gestion AWS de sorte que vous puissiez utiliser un compartiment S3 pour charger et décharger les données :

  1. Connectez-vous à la console de gestion AWS.

  2. Dans le tableau de bord d’accueil, sélectionnez Identity & Access Management (IAM) :

    Identity & Access Management in AWS Management Console
  3. Cliquez sur Account settings dans le volet de navigation de gauche.

  4. Développez la liste Security Token Service Regions, recherchez la région AWS qui correspond à la région où se trouve votre compte et choisissez Activate si le statut est Inactive.

  5. Cliquez sur Policies dans le volet de navigation de gauche.

  6. Cliquez sur Create Policy :

    Create Policy button on Policies page
  7. Cliquez sur l’onglet JSON.

  8. Ajoutez le document de politique qui permettra à Snowflake d’accéder au compartiment et au dossier S3.

    La politique suivante (au format JSON) fournit à Snowflake les autorisations d’accès requises pour le compartiment et le chemin de dossier spécifiés. Vous pouvez copier et coller le texte dans l’éditeur de stratégies :

    Note

    Assurez-vous de remplacer nom_compartiment et préfixe par votre nom de compartiment réel et le préfixe du chemin du dossier.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                  "s3:PutObject",
                  "s3:GetObject",
                  "s3:GetObjectVersion",
                  "s3:DeleteObject",
                  "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket_name>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::<bucket_name>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    

Important

Définir la condition "s3:prefix": sur ["*"] accorde l’accès à tous les préfixes dans le compartiment spécifié. Si plus de 1 000 objets existent dans le compartiment, vous pourriez rencontrer l’erreur suivante : Access Denied (Status Code: 403; Error Code: AccessDenied).

Pour éviter cette erreur, supprimez la condition de la politique IAM :

"Condition": {
      "StringLike": {
          "s3:prefix": [
              "*"
          ]
      }
  }

La politique accorde toujours l’accès aux fichiers du compartiment, mais S3 ne renvoie pas d’erreur si le compartiment contient plus de 1 000 objets.

  1. Cliquez sur Review policy.

  2. Entrez le nom de la stratégie (ex. : snowflake_access) et une description facultative. Cliquez ensuite sur Create policy pour créer la politique.

    Create Policy button in Review Policy page

Étape 2 : Créer un utilisateur IAM AWS

  1. Choisissez Users dans le volet de navigation de gauche, puis Add user.

  2. Sur la page Add user, entrez un nouveau nom d’utilisateur (par ex. snowflake1). Sélectionnez Programmatic access comme type d’accès, puis cliquez sur Next :

    Add user page
  3. Cliquez sur Attach existing policies directly, et sélectionnez la stratégie que vous avez créée précédemment. Puis cliquez sur Next :

    Set permissions page
  4. Examinez les détails de l’utilisateur, puis cliquez sur Create user.

    Review user details page
  5. Enregistrez les identifiants d’accès. La façon la plus simple de les enregistrer est de cliquer sur Download Credentials pour les écrire dans un fichier (par ex. credentials.csv)

    Attach policy on the user details page

    Attention

    Une fois que vous quittez cette page, la clé d’accès secrète ne sera plus disponible dans la console AWS. Si vous perdez la clé, vous devez générer un nouvel ensemble d’identifiants pour l’utilisateur.

Désormais, vous avez accompli les opérations suivantes :

  • J’ai créé une politique IAM pour un compartiment.

  • J’ai créé un utilisateur IAM et lui ai généré des identifiants d’accès.

  • J’ai associé la politique à l’utilisateur.

Avec la clé AWS et la clé secrète pour le compartiment S3, vous avez les identifiants nécessaires pour accéder à votre compartiment S3 dans Snowflake en utilisant une zone de préparation externe.

Étape 3 : Création d’une zone de préparation externe (c.-à-d. S3)

Créez une zone de préparation externe qui fait référence aux informations d’identification AWS que vous avez créées.

Créez une zone de préparation à l’aide de la commande CREATE STAGE, ou vous pouvez choisir de modifier une zone de préparation externe existante et définir l’option CREDENTIALS.

Note

Les informations d’identification sont traitées séparément des autres paramètres de la zone de préparation tels que ENCRYPTION et FILE_FORMAT. La prise en charge de ces autres paramètres est la même quel que soit l’identifiant utilisé pour accéder à votre compartiment S3 externe.

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_S3_stage. Dans cet exemple, la zone de préparation fait référence au compartiment S3 et au chemin mybucket/load/files. Les fichiers du compartiment S3 sont chiffrés avec le chiffrement côté serveur (AWS_SSE_KMS) :

USE SCHEMA mydb.public;

CREATE OR REPLACE STAGE my_S3_stage
  URL='s3://mybucket/load/files/'
  CREDENTIALS=(AWS_KEY_ID='1a2b3c' AWS_SECRET_KEY='4x5y6z')
  ENCRYPTION=(TYPE='AWS_SSE_KMS' KMS_KEY_ID = 'aws/key');

Suivant : Chiffrement des fichiers de données AWS