Konfigurieren eines Azure-Containers zum Laden von Daten

Unter diesem Thema wird beschrieben, wie Sie den sicheren Zugriff auf Datendateien konfigurieren, die in einem Microsoft Azure-Container gespeichert sind.

Folgende Optionen werden unterstützt:

Option 1

Konfigurieren Sie ein Speicherintegrationsobjekt, um die Authentifizierungsverantwortung für den externen Cloudspeicher an einen Azure-Dienstprinzipal zu delegieren. Ein Dienstprinzipal ist eine Identität, mit der Dienste wie Snowflake auf Azure-Ressourcen zugreifen können.

Bemerkung

  • Diese Option wird dringend empfohlen, da sonst beim Erstellen von Stagingbereichen oder Laden von Daten ein SAS-Token erforderlich ist.

  • Der Zugriff auf Azure-Blobspeicher in Regionen für Regierungsbehörden unter Verwendung einer Speicherintegration ist derzeit auf Snowflake-Konten beschränkt, die auf Azure in derselben Regierungsregion gehostet werden. Der Zugriff auf Ihren Blobspeicher von einem Konto, das außerhalb der Region der Regierungsbehörden gehostet wird, wird unter Verwendung direkter Anmeldeinformationen aber unterstützt.

Option 2

Generieren Sie ein SAS-Token (Shared Access Signatur), um Snowflake eingeschränkten Zugriff auf Objekte in Ihrem Speicherkonto zu gewähren. Sie können dann mithilfe des SAS-Token auf einen externen (Azure-)Stagingbereich zugreifen, der den Container referenziert.

Bemerkung

Das Ausführen der Anweisungen unter diesem Thema erfordert Administratorzugriff auf Azure. Wenn Sie kein Azure-Administrator sind, bitten Sie Ihren Azure-Administrator, diese Aufgaben auszuführen.

Unter diesem Thema:

Option 1: Konfigurieren einer Snowflake-Speicherintegration

In diesem Abschnitt wird beschrieben, wie Sie mit Speicherintegrationen dafür sorgen können, dass Snowflake Daten in einem Azure-Container lesen und in einen Azure-Container schreiben kann, auf den in einem externen (Azure) 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 die Benutzer-ID aus der Identitäts- und Zugriffsverwaltung (IAM) von Azure. Diese wird als App-Registrierung bezeichnet. Ein Administrator in Ihrer Organisation erteilt dieser App die erforderlichen Berechtigungen für das Azure-Konto.

Eine Integration muss auch Container (und optionale Pfade) angeben, um die Speicherorte einzuschränken, die Benutzer beim Erstellen externer Stagingbereiche zur Verwendung mit der Integration angeben können.

Bemerkung

Zum Ausführen der Anweisungen in diesem Abschnitt sind Berechtigungen zum Verwalten von Speicherkonten in Azure erforderlich. Wenn Sie kein Azure-Administrator sind, bitten Sie Ihren Azure-Administrator, diese Aufgaben auszuführen.

Unter diesem Thema:

Schritt 1: 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 Azure-Cloudspeicher generierter Dienstprinzipal zusammen mit einem optionalen Satz zulässiger oder blockierter Speicherorte (d. h. Container) gespeichert wird. Cloudanbieter-Administratoren Ihrer Organisation erteilen dem generierten Dienstprinzipal 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. Azure) Stagingbereiche unterstützen. Die URL in der Stagingbereichsdefinition muss mit den für den Parameter STORAGE_ALLOWED_LOCATIONS angegebenen Azure-Containern (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 = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = '<tenant_id>'
  STORAGE_ALLOWED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/') ]
Copy

Wobei:

  • integration_name ist der Name der neuen Integration.

  • tenant_id ist die ID Ihres Office 365-Mandanten, zu dem die zulässigen und gesperrten Speicherkonten gehören. Die Authentifizierung einer Speicherintegration kann nur für einen einzigen Mandanten erfolgen. Daher müssen sich die zulässigen und blockierten Speicherorte auf Speicherkonten beziehen, die alle diesem einen Mandanten gehören.

    Melden Sie sich beim Azure-Portal an, und klicken Sie auf Azure Active Directory » Properties, um Ihre Mandanten-ID zu ermitteln. Die Mandanten-ID wird im Feld Tenant ID angezeigt.

  • container ist der Name des Azure-Containers, in dem Ihre Datendateien gespeichert sind (z. B. mycontainer). Die Parameter STORAGE_ALLOWED_LOCATIONS und STORAGE_BLOCKED_LOCATIONS beschränken bzw. blockieren den Zugriff auf diese Container, wenn Stagingbereiche, die auf diese Integration verweisen, erstellt oder geändert werden.

  • path ist ein optionaler Pfad, mit dem Sie logische Verzeichnisse im Container genauer steuern können.

Im folgenden Beispiel wird eine Integration erstellt, die die externen Stagingbereiche, die die Integration verwenden, explizit darauf beschränkt, auf zwei Container oder Pfade zu verweisen: In einem späteren Schritt werden wir einen externen Stagingbereich erstellen, der auf einen dieser Container und Pfade verweist. Es können auch mehrere externe Stagingbereiche, die diese Integration verwenden, auf die zulässigen Container und Pfade verweisen:

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

Schritt 2: Snowflake Zugriff auf die Speicherorte gewähren

  1. Führen Sie den Befehl DESCRIBE INTEGRATION aus, um die Zustimmungs-URL abzurufen:

    DESC STORAGE INTEGRATION <integration_name>;
    
    Copy

    Wobei:

Beachten Sie die Werte in den folgenden Spalten:

AZURE_CONSENT_URL

URL der Microsoft-Berechtigungsanforderungsseite.

AZURE_MULTI_TENANT_APP_NAME

Name der Snowflake-Clientanwendung, die für Ihr Konto erstellt wurde. In einem späteren Schritt in dieser Anleitung müssen Sie dieser Anwendung die erforderlichen Berechtigungen erteilen, um ein Zugriffstoken für die zulässigen Speicherorte zu erhalten.

  1. Navigieren Sie in einem Webbrowser zu der in der Spalte AZURE_CONSENT_URL angegebenen URL. Es wird eine Microsoft-Berechtigungsanforderungsseite angezeigt.

  2. Klicken Sie auf die Schaltfläche Accept. Mit dieser Aktion kann dem Azure-Dienstprinzipal, der für Ihr Snowflake-Konto erstellt wurde, ein Zugriffstoken für die angegebenen Ressourcen in Ihrem Mandantenbereich zugewiesen werden. Das Abrufen eines Zugriffstokens ist nur erfolgreich, wenn Sie dem Dienstprinzipal die entsprechenden Berechtigungen für den Container erteilen (siehe nächster Schritt).

    Die Microsoft-Berechtigungsanforderungsseite leitet auf die Snowflake-Firmenwebsite (snowflake.com) um.

  3. Melden Sie sich beim Microsoft Azure-Portal an.

  4. Navigieren Sie zu Azure Services » Storage Accounts. Klicken Sie auf den Namen des Speicherkontos, auf das Sie dem Snowflake-Dienstprinzipal Zugriff gewähren.

  5. Klicken Sie auf Access Control (IAM) » Add role assignment.

  6. Wählen Sie die gewünschte Rolle aus, die dem Snowflake-Dienstprinzipal gewährt werden soll:

    • Storage Blob Data Reader gewährt nur Lesezugriff. Dies ermöglicht das Laden von Daten aus Stagingdateien, die im Speicherkonto bereitgestellt wurden.

    • Storage Blob Data Contributor gewährt Lese- und Schreibzugriff. Dies ermöglicht das Laden oder Entladen von Daten in/aus Dateien, die im Speicherkonto bereitgestellt sind. Die Rolle ermöglicht auch die Ausführung des Befehls REMOVE zum Entfernen von Dateien, die im Speicherkonto bereitgestellt sind.

  7. Suchen Sie nach dem Snowflake-Dienstprinzipal. Dies ist die Identität in der Eigenschaft AZURE_MULTI_TENANT_APP_NAME der Ausgabe von DESC STORAGE INTEGRATION (in Schritt 1). Suchen Sie in der Eigenschaft AZURE_MULTI_TENANT_APP_NAME nach der Zeichenfolge vor dem Unterstrich.

    Wichtig

    • Es kann eine Stunde oder länger dauern, bis Azure den über die oben genannte Microsoft-Anforderungsseite angeforderten Snowflake-Dienstprinzipal erstellt hat. Wenn der Dienstprinzipal nicht sofort verfügbar ist, empfehlen wir, ein bis zwei Stunden zu warten und ihn dann erneut zu suchen.

    • Wenn Sie den Dienstprinzipal löschen, funktioniert die Speicherintegration nicht mehr.

    Add role assignment in Azure Storage Console
  8. Klicken Sie auf die Schaltfläche Review + assign.

    Bemerkung

    • Gemäß der Microsoft Azure-Dokumentation kann die Weitergabe von Rollenzuweisungen bis zu fünf Minuten dauern.

    • 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 3: Externen Stagingbereich erstellen

Erstellen Sie einen externen (Azure) Stagingbereich, der auf die Speicherintegration verweist, die Sie in Schritt 1: 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 Integration verfügt. Beispiel:

    GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;
    
    GRANT USAGE ON INTEGRATION azure_int TO ROLE myrole;
    
    Copy
  • Um in der CREATE STAGE-Anweisung auf eine Speicherintegration zu verweisen, muss die Rolle über USAGE-Berechtigung für das Speicherintegrationsobjekt 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.

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_azure_stage. In diesem Beispiel verweist der Stagingbereich auf den Azure-Container und den Pfad mycontainer1/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_azure_stage
  STORAGE_INTEGRATION = azure_int
  URL = 'azure://myaccount.blob.core.windows.net/container1/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.

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

  • Verwenden Sie den Endpunkt blob.core.windows.net für alle unterstützten Typen von Azure-Blob-Speicherkonten, einschließlich Data Lake Storage Gen2.

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

Option 2: Generieren eines SAS-Tokens

Schritt 1: SAS-Token generieren

Die folgende Schritt-für-Schritt-Anleitung beschreibt, wie Sie ein SAS-Token generieren, um Snowflake eingeschränkten Zugriff auf Objekte in Ihrem Speicherkonto zu gewähren:

  1. Melden Sie sich beim Azure-Portal an.

  2. Wählen Sie auf dem Startseiten-Dashboard die Option Storage Accounts » <Speicherkonto> aus. Wählen Sie unter Security + networking die Option Shared access signature aus.

    Storage Account Details in Azure Storage Console
  3. Wählen Sie die folgenden Zulässigen Dienste aus:

    • Blob

  4. Wählen Sie die folgenden Zulässigen Ressourcentypen aus:

    • Container (erforderlich, um Objekte im Speicherkonto aufzulisten)

    • Object (erforderlich zum Lesen/Schreiben von Objekten von/auf das Speicherkonto)

  5. Wählen Sie die folgenden zulässigen Berechtigungen zum Laden von Datendateien aus Azure-Ressourcen:

    • Lesen

    • Liste

    Die Berechtigungen Write, Add und Create sind auch erforderlich, wenn Sie Dateien in einen Container entladen möchten. Zur Verwendung der Option PURGE = TRUE ist außerdem die Permanent Delete-Berechtigung erforderlich.

  6. Geben Sie Datum und Uhrzeit für Start und Ablauf des SAS-Tokens an. Als Teil eines allgemeinen Sicherheitsplans können Sie periodisch ein anderes SAS-Token generieren.

  7. Lassen Sie das Feld Zulässige IP-Adressen leer, und geben Sie unter Allowed protocols die Option HTTPS only oder HTTPS and HTTP an.

    Shared Access Signature Details in Azure Storage Console
  8. Klicken Sie auf die Schaltfläche Generate SAS and connection string. Notieren Sie den vollständigen Wert im Feld SAS token, beginnend mit und einschließlich ?. Das ist Ihr SAS-Token. Sie benötigen dieses Token beim Erstellen eines externen Stagingbereichs.

Schritt 2: Externen Stagingbereich erstellen

Erstellen Sie einen externen (Azure-)Stagingbereich, der auf das SAS-Token verweist, das Sie in Schritt 1: SAS-Token generieren (unter diesem Thema) generiert haben.

Im folgenden Beispiel wird SQL verwendet, um einen externen Stagingbereich namens my_azure_stage zu erstellen, der Azure-Anmeldeinformationen und einen Hauptverschlüsselungsschlüssel enthält. Die URL des Stagingbereichs verweist auf das Azure-Konto myaccount. Die Datendateien werden im Container mycontainer und im Pfad /load/files gespeichert. Der Stagingbereich verweist auf ein benanntes Dateiformatobjekt mit dem Namen my_csv_format. Beachten Sie, dass das Beispiel den Wert MASTER_KEY abschneidet:

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

Beachten Sie, dass die in diesem Beispiel verwendeten Werte AZURE_SAS_TOKEN und MASTER_KEY nur zur Veranschaulichung dienen.

Bemerkung

Durch die Angabe eines benannten Dateiformatobjekts (oder einzelner Dateiformatoptionen) für den Stagingbereich ist es nicht erforderlich, später die gleichen Dateiformatoptionen im Befehl COPY anzugeben, mit dem Daten aus dem Stagingbereich geladen werden. Weitere Informationen zu Dateiformatobjekten und -optionen finden Sie unter CREATE FILE FORMAT.

Datendatei-Verschlüsselung

Aktivieren Sie Azure Storage Service Encryption (SSE) für „Data at Rest“ (Daten im Ruhezustand) direkt in Ihrem Speicherkonto, und Snowflake wird sie korrekt behandeln. Weitere Informationen dazu finden Sie in der Azure-Dokumentation zu SSE.

Darüber hinaus unterstützt Snowflake die clientseitige Verschlüsselung zum Entschlüsseln von in Azure-Containern bereitgestellten Stagingsdateien.

  • Clientseitige Verschlüsselung:

    • AZURE_CSE: Erfordert einen MASTER_KEY-Wert. Weitere Informationen dazu finden Sie unter Informationen zur clientseitigen Verschlüsselung in der Microsoft Azure-Dokumentation.

      Bemerkung

      Block-Blobs und Anhangs-Blobs unterstützen die clientseitige Verschlüsselung, Seiten-Blobs jedoch nicht.

Nächstes Thema: Erstellen eines Azure-Stagingbereichs