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.

Option 2

Generieren Sie ein SAS-Token (Signatur zum gemeinsame Zugriff), 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>/') ]

Wobei:

  • Integrationsname ist der Name der neuen Integration.

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

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

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

    Wobei:

Beachten Sie die URL in der Spalte AZURE_CONSENT_URL, die das folgende Format aufweist:

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

Notieren Sie sich auch den Wert in der Spalte AZURE_MULTI_TENANT_APP_NAME. Dies ist der Name der Snowflake-Clientanwendung, die für Ihr Konto erstellt wurde. Später 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 in der Spalte AZURE_CONSENT_URL URL zu der URL. Es wird eine Microsoft-Berechtigungsanforderungsseite angezeigt.

  2. Klicken Sie auf die Schaltfläche Accept. Auf diese Weise kann der Azure-Dienstprinzipal, der für Ihr Snowflake-Konto erstellt wurde, ein Zugriffstoken für eine beliebige Ressource in Ihrem Mandantenbereich erhalten. Das Abrufen eines Zugriffstokens ist nur erfolgreich, wenn Sie dem Dienstprinzipal die entsprechenden Berechtigungen für den Container erteilen (siehe nächster Schritt).

  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.

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

    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.

  8. Klicken Sie auf die Schaltfläche Save.

    Bemerkung

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

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;

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;

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 im Startseiten-Dashboard die Option Storage Accounts » <Speicherkonto> » Settings » Shared access signature aus.

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

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

    • Lesen

    • Liste

    Die zusätzlichen Berechtigungen Write, Add und Create sind auch erforderlich, wenn Sie planen, Dateien in einen Container zu entladen.

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

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

  7. Klicken Sie auf die Schaltfläche Generate SAS. 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:

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

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