Automatisches Aktualisieren externer Tabellen für Amazon S3

Unter diesem Thema finden Sie Anweisungen zum Erstellen externer Tabellen und zum automatischen Aktualisieren der Metadaten externer Tabellen mithilfe von Amazon SQS (Simple Queue Service)-Benachrichtigungen für einen S3-Bucket. Diese Operation synchronisiert die Metadaten mit dem neuesten Satz zugeordneter Dateien im externen Stagingbereich und Pfad, d. h.:

  • Neue Dateien im Pfad werden zu den Tabellenmetadaten hinzugefügt.

  • Änderungen an Dateien im Pfad werden in den Tabellenmetadaten aktualisiert.

  • Dateien, die sich nicht mehr im Pfad befinden, werden aus den Tabellenmetadaten entfernt.

Bemerkung

  • Diese Funktion ist auf Snowflake-Konten auf AWS beschränkt.

  • Um die unter diesem Thema beschriebenen Aufgaben auszuführen, müssen Sie eine Rolle verwenden, die über die Berechtigungen CREATE STAGE und CREATE EXTERNAL TABLE für ein Schema verfügt.

    Außerdem benötigen Sie Administratorzugriff auf AWS. Wenn Sie kein AWS-Administrator sind, bitten Sie Ihren AWS-Administrator, die erforderlichen Schritte zum Konfigurieren von AWS-Ereignisbenachrichtigungen auszuführen.

Unter diesem Thema:

Einschränkungen der automatischen Aktualisierung externer Tabellen mit Amazon SQS

  • Kunden von Virtual Private Snowflake (VPS) und AWS PrivateLink: Amazon SQS wird von AWS derzeit nicht als VPC-Endpunkt unterstützt. Obwohl AWS-Dienste innerhalb einer VPC (einschließlich VPS) mit SQS kommunizieren können, befindet sich dieser Datenverkehr nicht innerhalb der VPC und wird daher nicht durch die VPC geschützt.

  • SQS-Benachrichtigungen informieren Snowflake, wenn neue Dateien in überwachten S3-Buckets eintreffen und ladebereit sind. SQS-Benachrichtigungen enthalten das S3-Ereignis und eine Liste der Dateinamen. Sie enthalten nicht die tatsächlich in den Dateien vorliegenden Daten.

Konfigurieren des sicheren Zugriffs auf Cloudspeicher

Bemerkung

Wenn Sie bereits den sicheren Zugriff auf den S3-Bucket konfiguriert haben, in dem Ihre Datendateien gespeichert sind, können Sie diesen Abschnitt überspringen.

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

Bemerkung

Diese Option wird dringend empfohlen, um beim Zugriff auf Cloudspeicher keine IAM-Anmeldeinformationen angeben zu müssen. Weitere Speicherzugriffsoptionen finden Sie unter Konfigurieren des sicheren Zugriffs auf Amazon S3.

In diesem Abschnitt 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.

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

Amazon S3 Stage Integration Flow
  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:

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:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

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. Melden Sie sich bei der AWS Management Console an.

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

    Identity & Access Management in AWS Management Console
  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:

    Create Policy button on Policies page
  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.

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

    Bemerkung

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

    {
        "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>/*"
                        ]
                    }
                }
            }
        ]
    }
    

    Wichtig

    Durch Setzen der "s3:prefix":-Bedingung auf ["*"] wird Zugriff auf alle Präfixe im angegebenen Bucket gewährt. Wenn mehr als 1.000 Objekte im Bucket vorhanden sind, kann folgender Fehler auftreten: Access Denied (Status Code: 403; Error Code: AccessDenied).

    Um den Fehler zu vermeiden, entfernen Sie die Bedingung aus der IAM-Richtlinie, z. B.:

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

    Die Richtlinie gewährt weiterhin Zugriff auf die Dateien im Bucket, aber S3 gibt keinen Fehler zurück, wenn mehr als 1.000 Objekte im Bucket vorhanden sind.

    Beachten Sie, dass AWS-Richtlinien eine Vielzahl von verschiedenen Sicherheitsanwendungen 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: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",
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    
  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.

    Create Policy button in Review Policy page

Schritt 2: IAM-Rolle in AWS erstellen

Erstellen Sie über die AWS Management Console eine AWS-IAM-Rolle, um Berechtigungen für den S3-Bucket mit Ihren Datendateien zu vergeben.

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

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

    Identity & Access Management in AWS Management Console
  3. Wählen Sie im linken Navigationsbereich Roles aus.

  4. Klicken Sie auf die Schaltfläche Create role.

    Select Trusted Entity Page in AWS Management Console
  5. Wählen Sie Another AWS account als vertrauenswürdigen Entitätstyp aus.

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

  7. Wählen Sie die Option Require external ID aus. Geben Sie eine Dummy-ID ein, wie z. B. 0000. Später werden Sie die vertrauenswürdige Beziehung ändern und die externe ID für Ihren Snowflake-Stagingbereich angeben. Eine externe ID ist erforderlich, um einem Dritten (d. h. Snowflake) Zugriff auf Ihre AWS-Ressourcen (d. h. S3) zu gewähren.

  8. Klicken Sie auf die Schaltfläche Next.

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

  10. Klicken Sie auf die Schaltfläche Next.

    Review Page in AWS Management Console
  11. Geben Sie einen Namen und eine Beschreibung für die Rolle ein, und klicken Sie auf die Schaltfläche Create role.

    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 Role ARN-Wert, der auf der Übersichtsseite der Rolle angegeben ist. Im nächsten Schritt erstellen Sie eine Snowflake-Integration, die auf diese Rolle verweist.

    IAM Role

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

Wobei:

  • Integrationsname ist der Name der neuen Integration.

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

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

Im folgenden Beispiel wird eine Integration erstellt, die externe Stagingbereiche, die die Integration nutzen, explizit darauf beschränkt, auf einen von zwei Buckets und Pfaden zu verweisen: In einem späteren Schritt werden wir einen externen Stagingbereich erstellen, der auf einen dieser Buckets und Pfade verweist.

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

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

  1. Führen Sie den Befehl DESCRIBE INTEGRATION aus, um den ARN für den AWS-IAM-Benutzer abzurufen, der für Ihr Snowflake-Konto automatisch erstellt wurde:

    DESC INTEGRATION <integration_name>;
    

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

    Wert

    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. Wir stellen einen einzelnen IAM-Benutzer für Ihr gesamtes Snowflake-Konto bereit. Alle S3-Speicherintegrationen verwenden diesen IAM-Benutzer.

    STORAGE_AWS_EXTERNAL_ID

    Die externe ID, die zum Herstellen einer vertrauenswürdigen Beziehung erforderlich ist.

    Diese Werte werden Sie im nächsten Abschnitt angeben.

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 auf dem Startseiten-Dashboard die Option Identity & Access Management (IAM) aus:

    Identity & Access Management in AWS Management Console
  3. Wählen Sie im linken Navigationsbereich Roles aus.

  4. Klicken Sie auf die Rolle, die Sie in Schritt 2: IAM-Rolle in AWS erstellen (unter diesem Thema) erstellt haben.

  5. Klicken Sie auf die Registerkarte Trust relationships.

  6. Klicken Sie auf die Schaltfläche Edit trust relationship.

  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>"
            }
          }
        }
      ]
    }
    

    Wobei:

    • snowflake_external_id ist der von Ihnen notierte STORAGE_AWS_EXTERNAL_ID-Wert.

    • snowflake_user_arn ist der von Ihnen notierte STORAGE_AWS_IAM_USER_ARN-Wert.

  8. Klicken Sie auf die Schaltfläche Update Trust Policy. Die Änderungen werden gespeichert.

Konfigurieren der automatischen Aktualisierung externer Tabellen mit Amazon SQS

Ermitteln Sie vor dem Fortfahren, ob für den Zielpfad (oder in AWS-Terminologie das „Präfix“) in dem S3-Bucket, in dem sich Ihre Datendateien befinden, eine S3-Ereignisbenachrichtigung vorhanden ist. AWS-Regeln verbieten das Erstellen widersprüchlicher Benachrichtigungen für denselben Pfad.

Die folgenden Optionen zum automatischen Aktualisieren externer Tabellenmetadaten werden unterstützt:

  • Option 1: Neue S3-Ereignisbenachrichtigung: Erstellen Sie eine Ereignisbenachrichtigung für den Zielpfad in Ihrem S3-Bucket. Die Ereignisbenachrichtigung informiert Snowflake über eine SQS-Warteschlange, wenn dem angegebenen Bucket und Pfad neue Dateien hinzugefügt werden.

    Dies ist die am häufigsten verwendete Option.

    Wichtig

    Wenn für Ihren S3-Bucket eine widersprüchliche Ereignisbenachrichtigung vorliegt, verwenden Sie stattdessen Option 2.

  • Option 2: Bestehende Ereignisbenachrichtigung: Konfigurieren Sie Amazon Simple Notification Service (SNS) als Broadcaster, um Benachrichtigungen für einen bestimmten Pfad mit mehreren Endpunkten (oder „Abonnenten“, z. B. SQS-Warteschlangen oder AWS Lambda-Workloads) freizugeben, einschließlich der Snowflake SQS-Warteschlange für die automatische Aktualisierung externer Tabellen. Eine von SNS veröffentlichte S3-Ereignisbenachrichtigung informiert Snowpipe über eine SQS-Warteschlange, wenn Dateien ladebereit sind.

Option 1: Erstellen einer neuen S3-Ereignisbenachrichtigung

In diesem Abschnitt wird die am häufigsten verwendete Option zum automatischen Aktualisieren der Metadaten externer Tabellen mithilfe von Amazon SQS (Simple Queue Service)-Benachrichtigungen für einen S3-Bucket beschrieben. In den Schritten wird erläutert, wie Sie eine Ereignisbenachrichtigung für den Zielpfad (oder in AWS-Terminologie das „Präfix“) in dem S3-Bucket erstellen, in dem Ihre Datendateien gespeichert sind.

Wichtig

Wenn für Ihren S3-Bucket eine Benachrichtigung über widersprüchliche Ereignisse vorhanden ist, verwenden Sie stattdessen Option 2: Konfigurieren von Amazon SNS (unter diesem Thema). AWS-Regeln verbieten das Erstellen widersprüchlicher Benachrichtigungen für denselben Zielpfad.

Schritt 1: Stagingbereich erstellen (falls erforderlich)

Erstellen Sie mit dem Befehl CREATE STAGE einen externen Stagingbereich, der auf Ihren S3-Bucket verweist. Snowflake liest Ihre Staging-Datendateien in die Metadaten der externen Tabelle. Alternativ können Sie einen vorhandenen externen Stagingbereich verwenden.

Bemerkung

Informationen zum Konfigurieren des sicheren Zugriffs auf den Speicherort in der Cloud finden Sie unter Konfigurieren des sicheren Zugriffs auf Cloudspeicher (unter diesem Thema).

Im folgenden Beispiel wird im aktiven Schema der Benutzersitzung ein Stagingbereich mit dem Namen mystage erstellt. Die Cloudspeicher-URL enthält den Pfad files. Der Stagingbereich verweist auf eine Speicherintegration mit dem Namen myint.

USE SCHEMA mydb.public;

CREATE STAGE mystage
  URL = 's3://mybucket/files'
  STORAGE_INTEGRATION = myint;

Schritt 2: Externe Tabelle erstellen

Erstellen Sie mit dem Befehl CREATE EXTERNAL TABLE TYPE = CSV | JSON | AVRO | ORC | PARQUET [ ... ] eine externe Tabelle. Erstellen Sie beispielsweise eine externe Tabelle im Schema mydb.public, die JSON-Daten aus den Stagingdateien liest.

Die Stagingbereichsreferenz enthält einen Ordnerpfad mit dem Namen path1. Die externe Tabelle hängt diesen Pfad an die Stagingbereichsdefinition an, d. h. die externe Tabelle verweist auf die Datendateien in @mystage/files/path1:

Beachten Sie, dass der Parameter AUTO_REFRESH standardmäßig TRUE lautet:

CREATE OR REPLACE EXTERNAL TABLE ext_table
 WITH LOCATION = @mystage/path1/
 FILE_FORMAT = (TYPE = JSON);

Schritt 3: Ereignisbenachrichtigungen konfigurieren

Konfigurieren Sie Ereignisbenachrichtigungen für Ihren S3-Bucket, um Snowflake zu benachrichtigen, wenn neue oder aktualisierte Daten zum Lesen in die Metadaten der externen Tabelle verfügbar sind. Die automatische Aktualisierungsfunktion nutzt SQS-Warteschlangen, um Ereignisbenachrichtigungen von S3 an Snowflake zu senden.

Zur Vereinfachung der Verwendung werden diese SQS-Warteschlangen von Snowflake erstellt und verwaltet. Die Ausgabe des Befehls SHOW EXTERNAL TABLES zeigt den Amazon Resource Name (ARN) Ihrer SQS-Warteschlange an.

  1. Führen Sie den Befehl SHOW EXTERNAL TABLES aus:

    SHOW EXTERNAL TABLES;
    

    Beachten Sie den ARN der SQS-Warteschlange für die externe Tabelle in der Spalte notification_channel. Kopieren Sie den ARN an einen geeigneten Speicherort.

    Bemerkung

    Gemäß AWS-Richtlinien weist Snowflake genau eine SQS-Warteschlange pro S3-Bucket zu. Diese SQS-Warteschlange kann von mehreren Buckets in demselben AWS-Konto gemeinsam genutzt werden. Die SQS-Warteschlange koordiniert Benachrichtigungen für alle externen Tabellen, die Datendateien aus demselben S3-Bucket lesen. Wenn eine neue oder geänderte Datendatei in den Bucket hochgeladen wird, lesen alle externen Tabellendefinitionen, die mit dem Verzeichnispfad des Stagingbereichs übereinstimmen, die Dateidetails in ihre Metadaten.

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

  3. Konfigurieren Sie anhand der Anweisungen in der Amazon S3-Dokumentation eine Ereignisbenachrichtigung für Ihren S3-Bucket. Füllen Sie die Felder wie folgt aus:

    • Name: Name der Ereignisbenachrichtigung (z. B. Auto-ingest Snowflake).

    • Events: Wählen Sie die Optionen ObjectCreate (All) und ObjectRemoved aus.

    • Send to: Wählen Sie SQS Queue in der Dropdown-Liste aus.

    • SQS: Wählen Sie Add SQS queue ARN in der Dropdown-Liste aus.

    • SQS queue ARN: Fügen Sie den SQS-Warteschlangennamen aus der SHOW EXTERNAL TABLES-Ausgabe ein.

Bemerkung

Mit diesen Anweisungen wird eine einzelne Ereignisbenachrichtigung erstellt, die die Aktivität für den gesamten S3-Bucket überwacht. Dies ist der einfachste Ansatz. Diese Benachrichtigung handhabt alle externen Tabellen, die im S3-Bucket-Verzeichnis auf einer granulareren Ebene konfiguriert wurden.

Alternativ können Sie in den obigen Schritten einen oder mehrere Pfade und/oder Dateierweiterungen (bzw. Präfixe und Suffixe in der AWS-Terminologie) konfigurieren, um Ereignisaktivitäten zu filtern. Anweisungen dazu finden Sie in den Informationen zum Filtern von Objektschlüsselnamen im entsprechenden AWS-Dokumentationsthema. Wiederholen Sie diese Schritte für jeden weiteren Pfad oder jede weitere Dateierweiterung, den bzw. die die Benachrichtigung überwachen soll.

Beachten Sie, dass AWS die Anzahl dieser Benachrichtigungs-Warteschlangenkonfigurationen auf maximal 100 pro S3-Bucket begrenzt.

Beachten Sie auch, dass AWS für denselben S3-Bucket keine überlappenden Warteschlangenkonfigurationen (über Ereignisbenachrichtigungen hinweg) zulässt. Wenn beispielsweise eine vorhandene Benachrichtigung für s3://mybucket/files/path1 konfiguriert ist, können Sie keine weitere Benachrichtigung auf einer höheren Ebene erstellen (z. B. s3://mybucket/files) oder umgekehrt.

Der externe Stagingbereich mit automatischer Aktualisierung ist jetzt konfiguriert!

Wenn neue oder aktualisierte Datendateien zum S3-Bucket hinzugefügt werden, weist die Ereignisbenachrichtigung Snowflake an, sie in die Metadaten der externen Tabelle zu scannen.

Schritt 4: Metadaten externer Tabellen manuell aktualisieren

Aktualisieren Sie die Metadaten der externen Tabelle einmal manuell, indem Sie ALTER EXTERNAL TABLE mit dem Parameter REFRESH verwenden, z. B.:

ALTER EXTERNAL TABLE ext_table REFRESH;

Dadurch wird sichergestellt, dass die Metadaten mit allen Änderungen an der Dateiliste synchronisiert werden, die seit Schritt 2 vorgenommen wurden. Danach lösen die S3-Ereignisbenachrichtigungen die Aktualisierung der Metadaten automatisch aus.

Schritt 5: Sicherheit konfigurieren

Erteilen Sie mit GRANT <Berechtigungen> … TO ROLE für jede zusätzliche Rolle, die zum Abfragen der externen Tabelle verwendet wird, ausreichende Zugriffssteuerungsrechte für die verschiedenen Objekte (d. h. Datenbanken, Schemas, Stagingbereich und Tabelle):

Objekt

Berechtigung

Anmerkungen

Datenbank

USAGE

Schema

USAGE

Benannter Stagingbereich

USAGE , READ

Benanntes Dateiformat

USAGE

Externe Tabelle

SELECT

Option 2: Konfigurieren von Amazon SNS

In diesem Abschnitt wird beschrieben, wie das automatische Laden von Snowpipe-Daten mithilfe von Amazon SQS (Simple Queue Service)-Benachrichtigungen für einen S3-Bucket ausgelöst wird. In den Schritten wird erläutert, wie Sie Amazon Simple Notification Service (SNS) als Broadcaster konfigurieren, um Ereignisbenachrichtigungen für Ihren S3-Bucket für mehrere Abonnenten zu veröffentlichen (z. B. SQS-Warteschlangen oder AWS Lambda-Workloads), einschließlich der Snowflake-SQS-Warteschlange für die automatische Aktualisierung externer Tabellen.

Bemerkung

Diese Anweisungen setzen voraus, dass für den Zielpfad in Ihrem S3-Bucket, in dem sich Ihre Datendateien befinden, eine Ereignisbenachrichtigung vorhanden ist. Wenn keine Ereignisbenachrichtigung vorhanden ist, gehen Sie wie folgt vor:

Vorbereitung: Amazon-SNS-Thema und Abonnement erstellen.

  1. Erstellen Sie ein SNS-Thema in Ihrem AWS-Konto, um alle Nachrichten für den Snowflake-Stagingbereich in Ihrem S3-Bucket zu verwalten.

  2. Abonnieren Sie Ihre Zieldestinationen für die S3-Ereignisbenachrichtigungen (z. B. andere SQS-Warteschlangen oder AWS Lambda-Workloads) zu diesem Thema. SNS veröffentlicht Ereignisbenachrichtigungen für Ihren Bucket an alle Abonnenten des Themas.

Anweisungen dazu finden Sie in der SNS-Dokumentation.

Schritt 1: Snowflake-SQS-Warteschlange zum SNS-Thema abonnieren

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

  2. Wählen Sie auf dem Startseiten-Dashboard die Option Simple Notification Service (SNS) aus.

  3. Wählen Sie im linken Navigationsbereich Topics aus.

  4. Suchen Sie das Thema für Ihren S3-Bucket. Beachten Sie das Thema ARN.

  5. Fragen Sie mithilfe eines Snowflake-Clients die SYSTEM$GET_AWS_SNS_IAM_POLICY-Systemfunktion mit Ihrem SNS-Thema ARN ab:

    select system$get_aws_sns_iam_policy('<sns_topic_arn>');
    

    Die Funktion gibt eine IAM-Richtlinie zurück, die einer Snowflake-SQS-Warteschlange die Berechtigung zum Abonnieren des SNS-Themas erteilt.

    Beispiel:

    select system$get_aws_sns_iam_policy('arn:aws:sns:us-west-2:001234567890:s3_mybucket');
    
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | SYSTEM$GET_AWS_SNS_IAM_POLICY('ARN:AWS:SNS:US-WEST-2:001234567890:S3_MYBUCKET')                                                                                                                                                                   |
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | {"Version":"2012-10-17","Statement":[{"Sid":"1","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"},"Action":["sns:Subscribe"],"Resource":["arn:aws:sns:us-west-2:001234567890:s3_mybucket"]}]}                 |
    +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    
  6. Kehren Sie zur AWS Management Console zurück. Wählen Sie im linken Navigationsbereich Topics aus.

  7. Aktivieren Sie das Kontrollkästchen neben dem Thema für Ihren S3-Bucket, und klicken Sie im Menü Actions auf Edit topic policy. Klicken Sie auf die Registerkarte Advanced view, um das JSON-Format der Richtlinie zu bearbeiten.

  8. Fügen Sie den IAM-Richtlinienzusatz aus den SYSTEM$GET_AWS_SNS_IAM_POLICY-Funktionsergebnissen in das JSON-Dokument ein.

    Beispiel:

    Ursprüngliche IAM-Richtlinie (abgekürzt):

    {
      "Version":"2008-10-17",
      "Id":"__default_policy_ID",
      "Statement":[
         {
            "Sid":"__default_statement_ID",
            "Effect":"Allow",
            "Principal":{
               "AWS":"*"
            }
            ..
         }
       ]
     }
    

    Zusammengeführte IAM-Richtlinie:

    {
      "Version":"2008-10-17",
      "Id":"__default_policy_ID",
      "Statement":[
         {
            "Sid":"__default_statement_ID",
            "Effect":"Allow",
            "Principal":{
               "AWS":"*"
            }
            ..
         },
         {
            "Sid":"1",
            "Effect":"Allow",
            "Principal":{
              "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"
             },
             "Action":[
               "sns:Subscribe"
             ],
             "Resource":[
               "arn:aws:sns:us-west-2:001234567890:s3_mybucket"
             ]
         }
       ]
     }
    
  9. Fügen Sie eine zusätzliche Richtlinienberechtigung hinzu, damit S3 Ereignisbenachrichtigungen für den Bucket im SNS-Thema veröffentlichen kann.

    Beispiel (unter Verwendung des in diesen Anweisungen verwendeten SNS-Thema-ARN und S3-Bucket):

    {
        "Sid":"s3-event-notifier",
        "Effect":"Allow",
        "Principal":{
           "Service":"s3.amazonaws.com"
        },
        "Action":"SNS:Publish",
        "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket",
        "Condition":{
           "ArnLike":{
              "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket"
           }
        }
     }
    

    Zusammengeführte IAM-Richtlinie:

    {
      "Version":"2008-10-17",
      "Id":"__default_policy_ID",
      "Statement":[
         {
            "Sid":"__default_statement_ID",
            "Effect":"Allow",
            "Principal":{
               "AWS":"*"
            }
            ..
         },
         {
            "Sid":"1",
            "Effect":"Allow",
            "Principal":{
              "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"
             },
             "Action":[
               "sns:Subscribe"
             ],
             "Resource":[
               "arn:aws:sns:us-west-2:001234567890:s3_mybucket"
             ]
         },
         {
            "Sid":"s3-event-notifier",
            "Effect":"Allow",
            "Principal":{
               "Service":"s3.amazonaws.com"
            },
            "Action":"SNS:Publish",
            "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket",
            "Condition":{
               "ArnLike":{
                  "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket"
               }
            }
          }
       ]
     }
    
  10. Klicken Sie auf die Schaltfläche Update policy.

Schritt 2: Stagingbereich erstellen (falls erforderlich)

Erstellen Sie mit dem Befehl CREATE STAGE einen externen Stagingbereich, der auf Ihren S3-Bucket verweist. Snowflake liest Ihre Staging-Datendateien in die Metadaten der externen Tabelle.

Alternativ können Sie einen vorhandenen externen Stagingbereich verwenden.

Bemerkung

Informationen zum Konfigurieren des sicheren Zugriffs auf den Speicherort in der Cloud finden Sie unter Konfigurieren des sicheren Zugriffs auf Cloudspeicher (unter diesem Thema).

Im folgenden Beispiel wird im aktiven Schema der Benutzersitzung ein Stagingbereich mit dem Namen mystage erstellt. Die Cloudspeicher-URL enthält den Pfad files. Der Stagingbereich verweist auf eine Speicherintegration mit dem Namen myint:

USE SCHEMA mydb.public;

CREATE STAGE mystage
  URL = 's3://mybucket/files'
  STORAGE_INTEGRATION = myint;

Schritt 3: Externe Tabelle erstellen

Erstellen Sie mit CREATE EXTERNAL TABLE TYPE = CSV | JSON | AVRO | ORC | PARQUET [ ... ] eine externe Tabelle. Identifizieren Sie den SNS-Thema-ARN aus Voraussetzung: Amazon-SNS-Thema und Abonnement erstellen.

CREATE EXTERNAL TABLE <table_name>
 ..
 AWS_SNS_TOPIC = '<sns_topic_arn>';

Wobei:

AWS_SNS_TOPIC = '<SNS-Themen-ARN>'

Gibt den ARN für das SNS-Thema Ihres S3-Buckets an. Mit der CREATE EXTERNAL TABLE-Anweisung wird die Snowflake-SQS-Warteschlange für das angegebene SNS-Thema abonniert.

Erstellen Sie beispielsweise eine externe Tabelle im Schema mydb.public, die JSON-Daten aus den Stagingdateien liest. Die Stagingbereichsreferenz enthält einen Ordnerpfad mit dem Namen path1. Die externe Tabelle hängt diesen Pfad an die Stagingbereichsdefinition an, d. h. die externe Tabelle verweist auf die Datendateien in @mystage/files/path1: Beachten Sie, dass der Parameter AUTO_REFRESH standardmäßig TRUE ist:

CREATE EXTERNAL TABLE ext_table
 WITH LOCATION = @mystage/path1/
 FILE_FORMAT = (TYPE = JSON)
 AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket';

Um diesen Parameter aus einer externen Tabelle zu entfernen, muss die externe Tabelle derzeit mit der Syntax CREATE OR REPLACE EXTERNAL TABLE neu erstellt werden.

Schritt 4: Metadaten externer Tabellen manuell aktualisieren

Aktualisieren Sie die Metadaten der externen Tabelle einmal manuell, indem Sie ALTER EXTERNAL TABLE mit dem Parameter REFRESH verwenden, z. B.:

ALTER EXTERNAL TABLE ext_table REFRESH;

Dadurch wird sichergestellt, dass die Metadaten mit allen Änderungen an der Dateiliste synchronisiert werden, die seit Schritt 3 aufgetreten sind. Danach lösen die S3-Ereignisbenachrichtigungen die Aktualisierung der Metadaten automatisch aus.

Schritt 5: Sicherheit konfigurieren

Erteilen Sie mit GRANT <Berechtigungen> … TO ROLE für jede zusätzliche Rolle, die zum Abfragen der externen Tabelle verwendet wird, ausreichende Zugriffssteuerungsrechte für die verschiedenen Objekte (d. h. Datenbanken, Schemas, Stagingbereich und Tabelle):

Objekt

Berechtigung

Anmerkungen

Datenbank

USAGE

Schema

USAGE

Benannter Stagingbereich

USAGE , READ

Benanntes Dateiformat

USAGE

Externe Tabelle

SELECT