Option 2: Konfigurieren einer AWS-IAM-Rolle für Zugriff auf Amazon S3 – Veraltet

Bemerkung

Bei Verwendung der veralteten Authentifizierungsmethode kann möglicherweise ein assumeRole-Fehler auftreten.

In diesem Abschnitt wird beschrieben, wie Sie einen S3-Bucket, eine IAM-Rolle und Richtlinien für Snowflake konfigurieren, um im Namen eines oder mehrerer einzelner Benutzer in Ihrem Snowflake-Konto sicher auf einen externen Stagingbereich zugreifen zu können.

Als Best Practice sollten Sie den Zugriff auf den S3-Bucket auf eine bestimmte IAM-Rolle mit den minimal erforderlichen Berechtigungen beschränken. Die IAM-Rolle wird in Ihrem AWS-Konto erstellt, zusammen mit den Berechtigungen für den Zugriff auf Ihren S3-Bucket und der Vertrauensrichtlinie, damit Snowflake die IAM-Rolle übernehmen kann.

Trust policies allowing IAM user access to S3 bucket
  1. Ein AWS IAM-Benutzer, der für Ihr Snowflake-Konto erstellt wurde, ist mit einer IAM-Rolle verknüpft, die Sie über eine Vertrauensbeziehung konfigurieren.

  2. Der Rolle wird durch IAM-Richtlinien, die Sie konfigurieren, begrenzter Zugriff auf einen S3-Bucket gewährt.

Bemerkung

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

Unter diesem Thema:

Schritt 1: S3-Bucket-Zugriffsberechtigungen konfigurieren

Anforderungen an die AWS-Zugriffssteuerung

Snowflake benötigt die folgenden Berechtigungen für einen S3-Bucket und -Ordner, um auf Dateien in dem Ordner (und allen seinen 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. 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. 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.

    {
        "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 dann auf Create policy, um die Richtlinie zu erstellen.

    Create Policy button in Review Policy page

Schritt 2: AWS-IAM-Rolle erstellen

Erstellen Sie über die AWS Management Console eine AWS-IAM-Rolle, die Berechtigungen für den S3-Bucket erteilt, der Ihre Datendateien enthält.

  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 im Feld Account ID Ihre eigene AWS-Konto-ID ein. Später werden Sie die vertrauenswürdige Beziehung ändern und Snowflake Zugriff gewähren. Eine externe ID ist erforderlich, um später in dieser Anleitung einem Dritten (d. h. Snowflake) Zugriff auf Ihre AWS-Ressourcen (d. h. S3) zu 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.

  8. Klicken Sie auf die Schaltfläche Next.

  9. Suchen Sie die Richtlinie, die Sie in Schritt 1: S3-Bucket-Zugriffsberechtigungen 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 einen Snowflake-Stagingbereich, der über die Sicherheitsanmeldeinformationen auf diese Rolle verweist.

    IAM Role

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

Erstellen Sie einen externen (d. h. S3) Stagingbereich, der die von Ihnen erstellte AWS-Rolle referenziert.

  1. Erstellen Sie einen externen Stagingbereich mit dem Befehl CREATE STAGE, oder ändern Sie einen vorhandenen externen Stagingbereich und legen Sie die Option CREDENTIALS fest.

    Bemerkung

    • Anmeldeinformationen werden getrennt von anderen Parametern des Stagingbereichs wie ENCRYPTION und FILE_FORMAT behandelt. Die Unterstützung für diese anderen Parameter ist dieselbe, unabhängig von den Anmeldeinformationen, die für den Zugriff auf Ihren externen S3-Bucket verwendet werden.

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

    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 mybucket/load/files. Dateien im S3-Bucket werden mit serverseitiger Verschlüsselung (AWS_SSE_KMS) verschlüsselt:

    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');
    
    Copy
  2. Führen Sie den Befehl DESCRIBE STAGE aus, um die Eigenschaften des Stagingbereichs anzuzeigen:

    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                 |                  |
    +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
    
    Copy
  3. Notieren Sie die Werte für die Eigenschaften SNOWFLAKE_IAM_USER und AWS_EXTERNAL_ID. Hierbei gilt Folgendes:

    SNOWFLAKE_IAM_USER

    Ein AWS-IAM-Benutzer, der für Ihr Snowflake-Konto erstellt wurde. Dieser Benutzer ist für jeden externen S3-Stagingbereich, der in Ihrem Konto angelegt wird, gleich.

    AWS_EXTERNAL_ID

    Eine eindeutige ID, die dem spezifischen Stagingbereich zugewiesen ist. Die ID hat das folgende Format:

    snowflakeAccount_SFCRole=snowflakeRoleId_randomId

    Beachten Sie, dass die in diesem Beispiel verwendeten Werte AWS_ROLE, AWS_EXTERNAL_ID und SNOWFLAKE_IAM_USER nur zur Veranschaulichung dienen.

    Im nächsten Schritt werden Sie Ihre AWS-IAM-Rolle so konfigurieren, dass sie dem Snowflake-IAM-Benutzer mithilfe der generierten externen AWS-ID Zugriff gewährt.

Schritt 4: AWS-IAM-Rolle für Zugriffsberechtigung auf Stagingbereich konfigurieren

Konfigurieren Sie über die AWS Management Console die IAM-Rolle, und verwenden Sie dabei die Eigenschaften des Stagingbereichs, den Sie in Schritt 3: Externen Stagingbereich erstellen (unter diesem Thema) erstellt haben:

  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, und klicken Sie auf die Rolle, die Sie in Schritt 2: AWS-IAM-Rolle erstellen (unter diesem Thema) erstellt haben.

  4. Klicken Sie auf die Registerkarte Trust relationships und dann auf die Schaltfläche Edit trust relationship.

  5. Aktualisieren Sie im Feld Policy Document die Richtlinie mit den Eigenschaftswerten für den Stagingbereich:

    • AWS: Geben Sie den ARN für die Eigenschaft SNOWFLAKE_IAM_USER des Stagingbereichs ein, d. h. arn:aws:iam::123456789001:user/vj4g-a-abcd1234 in diesem Beispiel.

    • sts:ExternalId: Geben Sie die generierte externe ID ein, d. h. MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw= in diesem Beispiel.

      {
          "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="
                    }
                }
            }
          ]
      }
      
      Copy

      Bemerkung

      Mit der oben genannten Vertrauensrichtlinie kann ein einzelner externer Stagingbereich in Ihrem Snowflake-Konto Ihre IAM-Rolle übernehmen. Sie ist die restriktivste Vertrauensrichtlinie und damit die sicherste.

      Die Berechtigung zur Übernahme der IAM-Rolle ist der externen ID zugeordnet. Eine externe ID hat das folgende Format:

      snowflake_account_SFCRole=snowflake_role_id_random_id

      Wobei:

      • snowflake_account ist der Name, der Ihrem Snowflake-Konto zugewiesen wurde.

      • snowflake_role_id ist eine ID, die der Snowflake-Rolle zugeordnet ist, die den Stagingbereich in Schritt 3: Externen Stagingbereich erstellen (unter diesem Thema) erstellt hat.

        Im aktuellen Beispiel hat snowflake_role_id den Wert 2. Diese ID ist mit einer einzelnen Rolle in Ihrem Snowflake-Konto verknüpft. Der Zweck dieser ID ist auf die Vertrauensrichtlinien für externe Stagingbereiche beschränkt. Eine Zuordnung von Snowflake-Rollen zu IDs ist daher nicht verfügbar. Die Rollen-ID einer bestimmten Rolle wird nur im Wert AWS_EXTERNAL_ID der DESCRIBE STAGE-Ausgabe angezeigt. Als Best Practice sollten Sie die Möglichkeit, externe S3-Stagingbereiche zu erstellen, auf eine einzige Snowflake-Rolle beschränken.

        Beachten Sie, dass die Rolle, die einen Stagingbereich erstellt, nicht unbedingt mit dem Eigentümer des Stagingbereichs identisch ist (d. h. der Rolle mit OWNERSHIP-Berechtigung für den Stagingbereich). Die Eigentümerschaft des Stagingbereichs kann später auf eine andere Rolle übertragen werden, ohne dass die Vertrauensrichtlinie entsprechend geändert werden muss.

      Wenn Sie aus Sicherheitsgründen eine neue Speicherintegration erstellen (oder eine bestehende Speicherintegration mit der CREATE OR REPLACE STORAGE INTEGRATION-Syntax neu erstellen), hat die resultierende Speicherintegration eine andere externe ID und kann daher die IAM-Rolle nicht übernehmen, es sei denn, die Vertrauensrichtlinie wird geändert.

      Wenn Sie eine Vertrauensrichtlinie mit weniger sicheren Einschränkungen benötigen (z. B. eine Richtlinie, die alle externen Stagingbereiche Ihres Kontos unterstützt), ersetzen Sie in der externen ID die random_id durch ein Platzhalterzeichen (*):

      snowflake_account_SFCRole=snowflake_role_id_*, z. B. MYACCOUNT_SFCRole=2_* im aktuellen Beispiel.

      Diese Form der externen ID ermöglicht jedem externen S3-Stagingbereich, der von einem Benutzer in Ihrem Konto mit derselben Snowflake-Rolle (d. h. SYSADMIN) erstellt wurde, die IAM-Rolle anzunehmen, und im Gegenzug jeden S3-Bucket, auf den die IAM-Rolle Zugriff hat. Wenn Sie diese weniger sichere Vertrauensrichtlinie implementieren, müssen Sie Condition von StringEquals in StringLike ändern.

  6. Klicken Sie auf die Schaltfläche Update Trust Policy.

Sie haben nun die einmalige Einrichtung des Zugriffs auf Ihren S3-Bucket unter Verwendung einer AWS-Rolle abgeschlossen.

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