Option 1: Konfigurieren einer Snowflake-Speicherintegration für Zugriff auf Amazon S3

Unter diesem Thema wird beschrieben, wie Sie mit Speicherintegrationen dafür sorgen können, dass Snowflake Daten aus einem Amazon S3-Bucket lesen und in einen S3-Bucket schreiben kann, auf den in einem externen (d. h. S3) Stagingbereich verwiesen wird. Integrationen sind benannte First-Class-Snowflake-Objekte, bei denen keine expliziten Cloudanbieter-Anmeldeinformationen wie geheime Schlüssel oder Zugriffstoken übergeben werden müssen. Integrationsobjekte speichern eine AWS Identity and Access Management (IAM)-Benutzer-ID. Ein Administrator in Ihrem Unternehmen gewährt die Integrationsberechtigungen für IAM-Benutzer im AWS-Konto.

Eine Integration kann auch Buckets (und optionale Pfade) auflisten, um so die Speicherorte zu beschränken, die von Benutzern beim Erstellen der von der Integration verwendeten externen Stagingbereiche angeben werden können.

Bemerkung

  • Zum Ausführen der Anweisungen unter diesem Thema sind Berechtigungen in AWS zum Erstellen und Verwalten von IAM-Richtlinien und -Rollen erforderlich. Wenn Sie kein AWS-Administrator sind, bitten Sie Ihren AWS-Administrator, diese Aufgaben auszuführen.

  • Beachten Sie, dass derzeit der Zugriff auf S3-Speicher in Regionen für Regierungsbehörden über eine Speicherintegration auf Snowflake-Konten beschränkt ist, die auf AWS in derselben Region gehostet werden. Der Zugriff auf Ihren S3-Speicher von einem Konto, das außerhalb der Region der Regierungsbehörden gehostet wird, wird unter Verwendung direkter Anmeldeinformationen aber unterstützt.

Die folgende Abbildung zeigt den Integrationsablauf für einen S3-Stagingbereich:

Ablauf der Integration von Amazon S3-Stagingbereichen
  1. Ein externer (d. h. S3) Stagingbereich verweist in seiner Definition auf ein Speicherintegrationsobjekt.

  2. Snowflake ordnet die Speicherintegration automatisch einem für Ihr Konto erstellten S3-IAM-Benutzer zu. Snowflake erstellt einen einzelnen IAM-Benutzer, auf den von allen S3-Speicherintegrationen in Ihrem Snowflake-Konto verwiesen wird.

  3. Ein AWS-Administrator in Ihrem Unternehmen gewährt dem IAM-Benutzer die Berechtigung, auf den in der Stagingbereichsdefinition angegebenen Bucket zuzugreifen. Beachten Sie, dass viele externe Stagingbereichsobjekte auf unterschiedliche Buckets und Pfade verweisen und dieselbe Speicherintegration zur Authentifizierung verwenden können.

Wenn ein Benutzer Daten aus einem oder in einen Stagingbereich lädt, überprüft Snowflake erst die Berechtigungen, die dem IAM-Benutzer für den Bucket erteilt wurden, bevor Zugriff gewährt oder verweigert wird.

Unter diesem Thema:

Konfigurieren des sicheren Zugriffs auf Cloudspeicher

In diesem Abschnitt wird beschrieben, wie Sie ein Snowflake-Speicherintegrationsobjekt konfigurieren, um die Authentifizierungsverantwortung für den Cloudspeicher an eine Snowflake-Entität für die Identitäts- und Zugriffsverwaltung (IAM) zu delegieren.

Schritt 1: Zugriffsberechtigungen für den S3-Bucket konfigurieren

Anforderungen an die AWS-Zugriffssteuerung

Snowflake benötigt die folgenden Berechtigungen für einen S3-Bucket und -Ordner, um auf Dateien im Ordner (und in Unterordnern) zugreifen zu können:

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

Bemerkung

Die folgenden zusätzlichen Berechtigungen sind erforderlich, um zusätzliche SQL-Aktionen auszuführen:

Berechtigung

SQL-Aktion

s3:PutObject

Entladen von Dateien in den Bucket.

s3:DeleteObject

Entweder automatisches Löschen von Dateien aus dem Stagingbereich nach erfolgreichem Laden oder Ausführen von REMOVE-Anweisungen zum manuellen Entfernen von Dateien.

Als Best Practice empfiehlt Snowflake für den Zugriff von Snowflake auf den S3-Bucket die Erstellung einer IAM-Richtlinie. Sie können dann die Richtlinie an die Rolle anhängen und die von AWS für die Rolle generierten Sicherheitsanmeldeinformationen verwenden, um auf Dateien im Bucket zuzugreifen.

Erstellen einer IAM-Richtlinie

Die folgende Schritt-für-Schritt-Anleitung beschreibt, wie Sie die Zugriffsberechtigungen für Snowflake über Ihre AWS Management Console so konfigurieren, dass Sie einen S3-Bucket zum Laden und Entladen von Daten verwenden können:

  1. Anmelden bei der AWS-Managementkonsole.

  2. Wählen Sie auf dem Startseiten-Dashboard die Option Identity & Access Management (IAM) aus:

    Identitäts- und Zugriffsverwaltung in der AWS-Managementkonsole
  3. Wählen Sie im linken Navigationsbereich Account settings aus.

  4. Erweitern Sie die Security Token Service Regions-Liste, suchen Sie die AWS-Region, die der Region entspricht, in der sich Ihr Konto befindet, und wählen Sie Activate, wenn der Status Inactive ist.

  5. Wählen Sie im linken Navigationsbereich Policies aus.

  6. Klicken Sie auf Create Policy:

    Schaltfläche „Richtlinie erstellen“ auf der Seite „Richtlinien“
  7. Klicken Sie auf die Registerkarte JSON.

  8. Fügen Sie ein Richtliniendokument hinzu, das Snowflake den Zugriff auf den S3-Bucket und -Ordner ermöglicht.

    Die folgende Richtlinie (im JSON-Format) gibt Snowflake die erforderlichen Berechtigungen zum Laden oder Entladen von Daten über einen einzigen Bucket- und Ordnerpfad. Sie können Datendateien auch mit der Kopieroption PURGE bereinigen.

    Kopieren Sie den Text, und fügen Sie ihn in den Richtlinieneditor ein:

    Bemerkung

    • Stellen Sie sicher, dass bucket und prefix durch Ihren tatsächlichen Bucket-Namen bzw. Ihr Ordnerpfad-Präfix ersetzt wurden.

    • Die Amazon Resource Names (ARN) für Buckets in Regionen für Regierungsbehörden haben das Präfix arn:aws-us-gov:s3:::.

    {
        "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",
                    "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy

    Bemerkung

    Durch Setzen der Bedingung "s3:prefix": auf entweder ["*"] oder ["<Pfad>/*"] wird Zugriff auf alle Präfixe im angegebenen Bucket bzw. Pfad im Bucket gewährt.

    Beachten Sie, dass AWS-Richtlinien eine Vielzahl von unterschiedlichen Sicherheitsanwendungsfällen unterstützen.

    Die folgende Richtlinie stellt Snowflake die erforderlichen Berechtigungen zum Laden von Daten aus einem einzigen schreibgeschützten Bucket- und Ordnerpfad zur Verfügung. Die Richtlinie enthält die Berechtigungen s3:GetBucketLocation, s3:GetObject, s3:GetObjectVersion und s3:ListBucket:

    Alternative Richtlinie: Aus einem schreibgeschützten S3-Bucket laden

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

  10. Geben Sie den Richtliniennamen (z. B. snowflake_access) und eine optionale Beschreibung ein. Klicken Sie auf Create policy.

    Schaltfläche „Richtlinie erstellen“ auf der Seite „Richtlinie überprüfen“

Schritt 2: IAM-Rolle in AWS erstellen

Um die Zugriffsberechtigungen für Snowflake in der AWS-Managementkonsole zu konfigurieren, gehen Sie wie folgt vor:

  1. Melden Sie sich bei der AWS Management Console an.

  2. Wählen Sie im Startseiten-Dashboard die Option Identity & Access Management (IAM) aus:

    Identitäts- und Zugriffsverwaltung in der AWS-Managementkonsole
  3. Wählen Sie im linken Navigationsbereich Roles aus.

  4. Wählen Sie Create role aus.

    Seite „Vertrauenswürdige Entität auswählen“ der AWS-Managementkonsole
  5. Wählen Sie Another AWS account als vertrauenswürdigen Entitätstyp aus.

  6. Geben Sie im Feld Account ID vorläufig Ihre eigene AWS-Konto-ID ein. Später werden Sie die Vertrauensstellung ändern und Snowflake Zugriff gewähren.

  7. Wählen Sie die Option Require external ID aus. Eine externe ID wird verwendet, um einer dritten Partei wie Snowflake Zugriff auf Ihre AWS-Ressourcen (wie S3-Buckets) zu gewähren.

    Geben Sie eine Platzhalter-ID ein, z. B. 0000. In einem späteren Schritt werden Sie die Vertrauensstellung für Ihre IAM-Rolle ändern und die externe ID Ihrer Speicherintegration angeben.

  8. Wählen Sie Next aus.

  9. Wählen Sie die Richtlinie aus, die Sie in Schritt 1: Zugriffsberechtigungen für den S3-Bucket konfigurieren (unter diesem Thema) erstellt haben.

  10. Wählen Sie Next aus.

    Übersichtsseite in AWS-Managementkonsole
  11. Geben Sie einen Namen und eine Beschreibung für die Rolle ein, und wählen Sie Create role aus.

    Sie haben nun eine IAM-Richtlinie für einen Bucket erstellt, eine IAM-Rolle erstellt und die Richtlinie an die Rolle angehängt.

  12. Notieren Sie den Wert von Role ARN, der auf der Übersichtsseite der Rolle angegeben ist. Im nächsten Schritt erstellen Sie eine Snowflake-Integration, die auf diese Rolle verweist.

    IAM-Rolle

Bemerkung

Snowflake speichert die temporären Anmeldeinformationen im Cache für einen Zeitraum, der die Ablaufzeit von 60 Minuten nicht überschreiten darf. Wenn Sie den Zugriff von Snowflake widerrufen, sind Benutzer vor Ablauf des Cache möglicherweise in der Lage, die am Cloudspeicherort befindlichen Dateien aufzulisten und auf die Daten zuzugreifen.

Schritt 3: Cloud Storage-Integration in Snowflake erstellen

Erstellen Sie mit dem Befehl CREATE STORAGE INTEGRATION eine Speicherintegration. Eine Speicherintegration ist ein Snowflake-Objekt, in dem ein für Ihren S3-Cloudspeicher generierter IAM-Benutzer (Identitäts- und Zugriffsverwaltung) zusammen mit einem optionalen Satz zulässiger oder blockierter Speicherorte (d. h. Buckets) gespeichert wird. Cloudanbieter-Administratoren in Ihrer Organisation erteilen dem generierten Benutzer Berechtigungen für die Speicherorte. Dank dieser Option müssen Benutzer beim Erstellen von Stagingbereichen oder beim Laden von Daten keine Anmeldeinformationen eingeben.

Eine einzelne Speicherintegration kann mehrere externe (d. h. S3) Stagingbereiche unterstützen. Die URL in der Stagingbereichsdefinition muss mit den für den Parameter STORAGE_ALLOWED_LOCATIONS angegebenen S3-Buckets (und optionalen Pfaden) übereinstimmen.

Bemerkung

Dieser SQL-Befehl kann nur von Kontoadministratoren (Benutzer mit der Rolle ACCOUNTADMIN) oder von Rollen mit der globalen Berechtigung CREATE INTEGRATION ausgeführt werden.

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>/') ]
Copy

Wobei:

  • integration_name ist der Name der neuen Integration.

  • iam_role ist der Amazon Resource Name (ARN) der Rolle, die Sie in Schritt 2: IAM-Rolle in AWS erstellen (unter diesem Thema) erstellt haben.

  • bucket ist der Name eines S3-Buckets, in dem Ihre Datendateien gespeichert sind (z. B. mybucket). Die erforderlichen Parameter STORAGE_ALLOWED_LOCATIONS und STORAGE_BLOCKED_LOCATIONS beschränken bzw. blockieren den Zugriff auf diese Buckets, wenn Stagingbereiche, die auf diese Integration verweisen, erstellt oder geändert werden.

  • path ist ein optionaler Pfad, mit dem Sie Objekte im Bucket genauer steuern können.

Das folgende Beispiel erstellt eine Integration, die den Zugriff auf alle Buckets im Konto erlaubt, aber den Zugriff auf die definierten sensitivedata-Ordner blockiert.

Zusätzliche externe Stagingbereiche, die diese Integration ebenfalls verwenden, können auf die zulässigen Buckets und Pfade verweisen:

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 = ('*')
  STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');
Copy

Bemerkung

Optional können Sie den Parameter STORAGE_AWS_EXTERNAL_ID verwenden, um Ihre eigene externe ID anzugeben. Sie können diese Option wählen, um dieselbe externe ID für mehrere externe Volumes und/oder Speicherintegrationen zu verwenden.

Schritt 4: AWS-IAM-Benutzer für Ihr Snowflake-Konto abrufen

  1. Um den ARN des IAM-Benutzers abzurufen, der für Ihr Snowflake-Konto automatisch erstellt wurde, verwenden Sie den Befehl DESCRIBE INTEGRATION.

    DESC INTEGRATION <integration_name>;
    
    Copy

    Wobei:

    Beispiel:

    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=                               |                  |
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
    
    Copy
  2. Notieren Sie sich die Werte der folgenden Eigenschaften:

    Eigenschaft

    Beschreibung

    STORAGE_AWS_IAM_USER_ARN

    Der AWS-IAM-Benutzer, der für Ihr Snowflake-Konto erstellt wurde, in diesem Beispiel arn:aws:iam::123456789001:user/abc1-b-self1234. Snowflake stellt genau einen IAM-Benutzer für Ihr gesamtes Snowflake-Konto bereit. Alle S3-Speicherintegrationen in Ihrem Konto verwenden diesen IAM-Benutzer.

    STORAGE_AWS_EXTERNAL_ID

    Die externe ID, die Snowflake verwendet, um eine Vertrauensstellung mit AWS einzurichten. Wenn Sie beim Erstellen der Speicherintegration keine externe ID (STORAGE_AWS_EXTERNAL_ID) angegeben haben, generiert Snowflake eine ID, die Sie verwenden können.

    Diese Werte geben Sie im nächsten Abschnitt an.

Schritt 5: IAM-Benutzerberechtigungen für den Zugriff auf Bucket-Objekte erteilen

Die folgende schrittweise Anleitung beschreibt, wie Sie die IAM-Zugriffsberechtigungen für Snowflake über Ihre AWS Management Console so konfigurieren, dass Sie einen S3-Bucket zum Laden und Entladen von Daten verwenden können:

  1. Melden Sie sich bei der AWS Management Console an.

  2. Wählen Sie Identity & Access Management (IAM) aus.

    Identitäts- und Zugriffsverwaltung in der AWS-Managementkonsole
  3. Wählen Sie im linken Navigationsbereich Roles aus.

  4. Wählen Sie die Rolle aus, die Sie in Schritt 2: IAM-Rolle in AWS erstellen (unter diesem Thema) erstellt haben.

  5. Wählen Sie die Registerkarte Trust relationships aus.

  6. Wählen Sie Edit trust relationship aus.

  7. Ändern Sie das Richtliniendokument mit den DESC STORAGE INTEGRATION-Ausgabewerten, die Sie in Schritt 4: AWS-IAM-Benutzer für Ihr Snowflake-Konto abrufen (unter diesem Thema) ermittelt haben.

    Richtliniendokument für die IAM-Rolle

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

    Wobei:

    • snowflake_user_arn ist der von Ihnen notierte STORAGE_AWS_IAM_USER_ARN-Wert.

    • snowflake_external_id ist der von Ihnen notierte STORAGE_AWS_EXTERNAL_ID-Wert.

      In diesem Beispiel hat snowflake_external_id den Wert MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=.

      Bemerkung

      Wenn Sie aus Sicherheitsgründen eine neue Speicherintegration erstellen (oder eine bestehende Speicherintegration mit der CREATE OR REPLACE STORAGE INTEGRATION-Syntax neu erstellen) und dabei keine externe ID angeben, hat die neue Speicherintegration eine andere externe ID und kann daher die Vertrauensstellung nicht auflösen, es sei denn, Sie aktualisieren die Vertrauensrichtlinie.

  8. Wählen Sie die Schaltfläche Update Trust Policy aus. Die Änderungen werden gespeichert.

Bemerkung

Snowflake speichert die temporären Anmeldeinformationen im Cache für einen Zeitraum, der die Ablaufzeit von 60 Minuten nicht überschreiten darf. Wenn Sie den Zugriff von Snowflake widerrufen, sind Benutzer vor Ablauf des Cache möglicherweise in der Lage, Dateien auflisten und Daten vom Cloudspeicherort zu laden.

Schritt 6: Externen Stagingbereich erstellen

Erstellen Sie einen externen (S3) Stagingbereich, der auf die Speicherintegration verweist, die Sie in Schritt 3: Cloud Storage-Integration in Snowflake erstellen (unter diesem Thema) erstellt haben.

Bemerkung

Zum Erstellen eines Stagingbereichs, der eine Speicherintegration nutzt, ist eine Rolle erforderlich, die über die Berechtigung CREATE STAGE für das Schema sowie die Berechtigung USAGE für die Speicherintegration verfügt. Beispiel:

GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;

GRANT USAGE ON INTEGRATION s3_int TO ROLE myrole;
Copy

Erstellen Sie den Stagingbereich mit dem Befehl CREATE STAGE.

Legen Sie beispielsweise mydb.public als aktuelle Datenbank und aktuelles Schema für die Benutzersitzung fest, und erstellen Sie dann einen Stagingbereich namens my_s3_stage. In diesem Beispiel verweist der Stagingbereich auf den S3-Bucket und den Pfad mybucket1/path1, die von der Integration unterstützt werden. Der Stagingbereich verweist außerdem auf ein benanntes Dateiformatobjekt mit dem Namen 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;
Copy

Bemerkung

  • Der Eigentümer des Stagingbereichs (d. h. die Rolle mit der Berechtigung OWNERSHIP für den Stagingbereich) muss über die Berechtigung USAGE für die Speicherintegration verfügen.

  • Hängen Sie einen Schrägstrich (/) an den URL-Wert an, um nach dem angegebenen Ordnerpfad zu filtern. Wenn der Schrägstrich weggelassen wird, werden alle Dateien und Ordner einbezogen, die mit dem Präfix für den angegebenen Pfad beginnen.

    Beachten Sie, dass der Schrägstrich erforderlich ist, um auf unstrukturierte Datendateien im Stagingbereich zuzugreifen und diese abzurufen.

  • Zum Laden oder Entladen von Daten aus oder in einen Stagingbereich, der eine Integration nutzt, muss eine Rolle über die Berechtigung USAGE für den Stagingbereich verfügen. Es ist nicht erforderlich, dass die Rolle auch über die Berechtigung USAGE für die Speicherintegration verfügt.

  • Der Parameter STORAGE_INTEGRATION wird getrennt von anderen Parametern des Stagingbereichs (wie z. B. FILE_FORMAT) behandelt. Die Unterstützung dieser anderen Parameter ist dieselbe, unabhängig von der Integration, die für den Zugriff auf Ihren S3-Bucket verwendet wird.

Nächstes Thema: Verschlüsselung von AWS-Datendateien