Konfigurieren Sie eine Katalogintegration für Apache Iceberg™ REST-Kataloge

Eine Apache Iceberg™ REST Katalogintegration ermöglicht Snowflake den Zugriff auf Apache Iceberg™-Tabellen, die in einem Remote-Katalog verwaltet wird, der mit der Open Source Apache Iceberg REST OpenAPI-Spezifikation übereinstimmt.

Verbindung zu REST-Katalogen

Sie können eine Verbindung zu einer Iceberg REST API herstellen, die einen öffentlichen Endpunkt oder ein privates Netzwerk verwendet.

Öffentlicher Endpunkt

Um eine Verbindung zu einem Iceberg REST API über einen öffentlichen Endpunkt herzustellen, können Sie eine Katalogintegration erstellen, die die folgenden Authentifizierungsmethoden verwendet:

  • OAuth

  • Bearer-Token oder Personal Access Token (PAT)

  • SigV4

Privates Netzwerk

Um eine Verbindung zu einem Iceberg REST API herzustellen, das in einem privaten Netzwerk gehostet wird, können Sie eine Katalogintegration erstellen, die die Authentifizierung mit Signatur Version 4 (SigV4) verwendet.

Katalogintegration erstellen

Erstellen Sie mit dem Befehl CREATE CATALOG INTEGRATION (Apache Iceberg™ REST) eine Katalogintegration für die von Ihnen gewählte Authentifizierungsmethode. Die Werte, die Sie für die Argumente REST_CONFIG und REST_AUTHENTICATION angeben, unterscheiden sich je nach der von Ihnen gewählten Authentifizierungsmethode.

OAuth

Das folgende Beispiel erstellt eine REST-Katalogintegration, die OAuth zur Verbindung mit Tabular verwendet.

CREATE OR REPLACE CATALOG INTEGRATION tabular_catalog_int
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'default'
  REST_CONFIG = (
    CATALOG_URI = 'https://api.tabular.io/ws'
    WAREHOUSE = '<tabular_warehouse_name>'
  )
  REST_AUTHENTICATION = (
    TYPE = OAUTH
    OAUTH_TOKEN_URI = 'https://api.tabular.io/ws/v1/oauth/tokens'
    OAUTH_CLIENT_ID = '<oauth_client_id>'
    OAUTH_CLIENT_SECRET = '<oauth_secret>'
    OAUTH_ALLOWED_SCOPES = ('catalog')
  )
  ENABLED = TRUE;
Copy

Das folgende Beispiel erstellt eine REST-Katalogintegration, die OAuth verwendet, um eine Verbindung zu Databricks Unity Catalog herzustellen.

CREATE OR REPLACE CATALOG INTEGRATION unity_catalog_int_oauth
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'default'
  REST_CONFIG = (
    CATALOG_URI = 'https://my-api/api/2.1/unity-catalog/iceberg'
    WAREHOUSE = '<catalog_name>'
  )
  REST_AUTHENTICATION = (
    TYPE = OAUTH
    OAUTH_TOKEN_URI = 'https://my-api/oidc/v1/token'
    OAUTH_CLIENT_ID = '123AbC ...'
    OAUTH_CLIENT_SECRET = '1365910ab ...'
    OAUTH_ALLOWED_SCOPES = ('all-apis', 'sql')
  )
  ENABLED = TRUE;
Copy

Bearer-Token oder PAT

Das folgende Beispiel erstellt eine REST-Katalogintegration, die ein PAT-Token verwendet, um eine Verbindung zu Databricks Unity Catalog herzustellen.

CREATE OR REPLACE CATALOG INTEGRATION unity_catalog_int_pat
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'my_namespace'
  REST_CONFIG = (
    CATALOG_URI = 'https://my-api/api/2.1/unity-catalog/iceberg'
    WAREHOUSE = '<catalog_name>'
  )
  REST_AUTHENTICATION = (
    TYPE = BEARER
    BEARER_TOKEN = 'eyAbCD...eyDeF...'
  )
  ENABLED = TRUE;
Copy

SigV4 (API-Gateway)

Das folgende Diagramm zeigt, wie Snowflake mit Ihrem REST-Katalogserver über API Gateway und SigV4-Authentifizierung interagiert.

Das Diagramm zeigt, wie ein Iceberg REST-Katalog mit Amazon API-Gateway, IAM und S3 funktioniert.

Folgen Sie den Schritten in diesem Abschnitt, um eine REST API im Amazon API Gateway und Signature Version 4 (SigV4) Authentifizierung zu verwenden, um Snowflake sicher mit einem Iceberg-REST-Katalog zu verbinden, der nicht öffentlich zugänglich ist.

  1. Erstellen Sie eine REST API in Amazon API Gateway

  2. Eine IAM-Richtlinie erstellen und mit einer Rolle verknüpfen

  3. API-Gateway-Ressourcenrichtlinie hinzufügen (nur private APIs)

  4. Wählen Sie IAM-basierte Autorisierung für Ihre API aus.

  5. Abrufen der Endpunkt-URL

  6. Katalogintegration für SigV4 erstellen

  7. Vertrauensstellung in IAM konfigurieren

Erstellen Sie eine REST API in Amazon API Gateway

Um Snowflake mit Ihrem Iceberg REST-Katalog zu verbinden, benötigen Sie eine REST API-Ressource in Amazon API Gateway.

Wenn Sie noch keine REST API-Ressource in Amazon API Gateway für Ihren Iceberg-Katalog haben, können Sie eine einfache REST API erstellen, indem Sie eine OpenAPI-Definitionsdatei des Iceberg-Katalogs modifizieren und importieren oder Endpunkte manuell hinzufügen.

Bemerkung

Um die OpenAPI-Definition des Iceberg-Katalogs zu importieren, müssen Sie die YAML-Datei ändern. Amazon API Gateway unterstützt nicht alle Komponenten der OpenAPI 2.0 oder 3.0 Spezifikationen. Unter Amazon API Gateway finden Sie weitere Informationen und wichtige Hinweise für REST APIs.

  1. Suchen Sie in der AWS Management-Konsole nach API Gateway und wählen Sie es aus.

  2. Wählen Sie Create API aus.

  3. Wählen Sie Build unter REST API. Um eine private REST API zu erstellen, wählen Sie Build unter REST API Private.

  4. Wählen Sie eine der folgenden Optionen aus:

    • Um eine API durch manuelles Hinzufügen von Endpunkten zu erstellen, wählen Sie New API.

    • Um eine API unter Verwendung einer OpenAPI-Definitionsdatei zu erstellen, wählen Sie Import API, laden Sie die Datei hoch oder fügen Sie die Definition in den Code-Editor ein.

  5. Geben Sie einen API name und optional eine Description ein.

    Bemerkung

    Sie müssen keine VPC-Endpunkt-ID eingeben, wenn Sie eine private REST API erstellen.

  6. Wählen Sie Create API aus.

Weitere Informationen zum Erstellen und Entwickeln einer REST API in API Gateway finden Sie im Amazon API Gateway Developer Guide.

Eine IAM-Richtlinie erstellen und mit einer Rolle verknüpfen

In diesem Schritt erstellen Sie eine AWS IAM-Rolle, mit der Snowflake eine Verbindung zum API-Gateway herstellen kann. Sie fügen der Rolle eine Richtlinie hinzu, die die Berechtigung zum Aufruf Ihrer API erteilt.

  1. Suchen Sie in der AWS Management-Konsole nach IAM und wählen Sie es aus.

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

  3. Wählen Sie Create policy und dann JSON für die Policy editor aus.

  4. Ersetzen Sie die leere Richtlinie durch eine Richtlinie, die die Berechtigung hat, Ihre API-Methoden aufzurufen. Die folgende allgemeine Richtlinie erlaubt beispielsweise die Aktion „Aufrufen“ für alle API Gateway-Ressourcen in einem AWS-Konto.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke"
            ],
            "Resource": "arn:aws:execute-api:*:<aws_account_id>:*"
        }
      ]
    }
    
    Copy

    Wichtig

    Verwenden Sie am besten eine Richtlinie, die die für Ihren Anwendungsfall mindestens erforderlichen Berechtigungen gewährt. Weitere Anleitungen und Beispielrichtlinien finden Sie unter Steuerung des Zugriffs auf eine API mit IAM-Berechtigungen.

  5. Wählen Sie Next aus.

  6. Geben Sie unter Policy name den Namen der Richtlinie (z. B. snowflake_access) und unter Description eine optionale Beschreibung ein.

  7. Wählen Sie Create policy aus.

  8. Wählen Sie im linken Navigationsbereich des IAM-Dashboards die Option Roles.

  9. Wählen Sie eine Rolle aus, der die Richtlinie zugeordnet werden soll. Wenn Sie eine Katalogintegration erstellen, geben Sie diese Rolle an. Wenn Sie keine Rolle haben, erstellen Sie eine neue Rolle.

  10. Wählen Sie auf der Summary Seite „Rolle“ auf der Registerkarte Permissions die Option Add permissions » Attach policies aus.

  11. Suchen Sie nach der Richtlinie, die Sie für API Gateway erstellt haben, und markieren Sie das Kästchen neben der Richtlinie. Wählen Sie dann Add permissions.

  12. Kopieren Sie auf der Seite der Rolle Summary die Rolle ARN. Sie geben diesen ARN an, wenn Sie eine Katalogintegration erstellen.

API-Gateway-Ressourcenrichtlinie hinzufügen (nur private APIs)

Wenn Ihre REST API privat ist, müssen Sie eine Amazon API Gateway-Ressourcenrichtlinie mit Ihrer API verknüpfen. Die Ressourcenrichtlinie ermöglicht es Snowflake, Ihr API von der Amazon Virtual Private Cloud (VPC) aus aufzurufen, in der sich Ihr Snowflake-Konto befindet.

  1. Rufen Sie in Snowflake die Funktion SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO auf, um die ID für dieVPC abzurufen, in der sich Ihr Snowflake-Konto befindet. Kopieren Sie die VPC-ID aus der Ausgabe der Funktion.

    SELECT SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO();
    
    Copy

    Ausgabe:

    {"snowflake-vpc-id":["vpc-c1c234a5"]}
    
  2. Folgen Sie den Anweisungen unter Anhängen von API Gateway-Ressourcenrichtlinien, um eine Ressourcenrichtlinie an Ihre REST API anzuhängen.

    Fügen Sie die folgende Beispielrichtlinie ein und ändern Sie sie.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Deny",
          "Principal": "*",
          "Action": "execute-api:Invoke",
          "Resource": "<api_gateway_arn>",
          "Condition": {
            "StringNotEquals": {
              "aws:sourceVpc": "<snowflake_vpc_id>"
            }
          }
        },
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:sts::123456789XXX:assumed-role/<my_api_permissions_role_name>/snowflake"
          },
          "Action": "execute-api:Invoke",
          "Resource": "<api_gateway_arn>/*/*/*",
          "Condition": {
            "StringEquals": {
              "aws:sourceVpc": "<snowflake_vpc_id>"
            }
          }
        }
      ]
    }
    
    Copy

Die erste Anweisung in der Richtlinie verweigert alle Anfragen, die nicht von Snowflake VPC stammen. Die zweite Anweisung erlaubt die „invoke“-Aktion (für alle Methoden) von Anfragen, die von Snowflake VPC stammen und die angenommene Rolle „Sessionprinzipal“ verwenden.

Weitere Informationen zur API-Gateway-Ressourcenrichtlinie finden Sie unter:

Wählen Sie IAM-basierte Autorisierung für Ihre API aus.

Wählen Sie IAM-basierte Autorisierung für jede Methode, auf die Sie in Ihrem REST API Zugriff gewähren möchten. Mit der IAM-basierten Autorisierung kann Snowflake die von Ihnen konfigurierte IAM -Rolle verwenden, um Anrufe an die API zu tätigen.

  1. Wählen Sie in der Amazon API Gateway-Konsole Ihre REST API.

  2. Für jede Methode:

    1. Wählen Sie unter Resources eine Methode aus der Liste aus.

    2. Wählen Sie unter Method request settings die Option Edit aus.

    3. Wählen Sie unter Authorization die Option AWS IAM aus.

    4. Wählen Sie Save aus.

  3. Um die Autorisierungsänderungen zu übernehmen, wählen Sie Deploy API aus. Weitere Informationen finden Sie unter Bereitstellen einer REST API über die API Gateway-Konsole.

Abrufen der Endpunkt-URL

Rufen Sie Ihren REST API-Endpunkt-URL (oder invoke-URL) ab. Ihre API muss in einem Stagingbereich bereitgestellt werden, bevor Sie die-Endpunkt-URL abrufen können.

  1. Wählen Sie in der Amazon API Gateway-Konsole Ihre REST API.

  2. Wählen Sie im linken Navigationsbereich Stages aus.

  3. Kopieren Sie unter Stage details die Invoke URL.

Sie geben den Endpunkt URL an, wenn Sie eine Katalogintegration erstellen.

Katalogintegration für SigV4 erstellen

Nachdem Sie über eine REST API in Amazon API Gateway verfügen und die ersten Schritte zur Steuerung des Zugriffs auf Ihre API mit IAM-Berechtigungen abgeschlossen haben, können Sie eine Katalogintegration in Snowflake erstellen.

Die Syntax des Befehls und die Beschreibung der Parameter finden Sie unter CREATE CATALOG INTEGRATION (Apache Iceberg™ REST).

Öffentliche REST API

Um eine Katalogintegration für eine öffentliche REST API zu erstellen, geben Sie ICEBERG_REST als CATALOG_SOURCE an und verwenden Sie die Authentifizierung SIGV4.

Geben Sie Details wie Ihre API-Endpunkt-URL und die Ihre IAM-Rollen-ARN an.

CREATE OR REPLACE CATALOG INTEGRATION my_rest_catalog_integration
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'my_namespace'
  REST_CONFIG = (
    CATALOG_URI = 'https://asdlkfjwoalk-execute-api.us-west-2-amazonaws.com/MyApiStage'
    CATALOG_API_TYPE = AWS_API_GATEWAY
  )
  REST_AUTHENTICATION = (
    TYPE = SIGV4
    SIGV4_IAM_ROLE = 'arn:aws:iam::123456789XXX:role/my_api_permissions_role'
    SIGV4_EXTERNAL_ID = 'my_iceberg_external_id'
  )
  ENABLED = TRUE;
Copy

Private REST API

Um eine Katalogintegration für eine private REST API zu erstellen, müssen Sie den Parameter CATALOG_API_TYPE auf AWS_PRIVATE_API_GATEWAY setzen.

CREATE OR REPLACE CATALOG INTEGRATION my_rest_catalog_integration
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'my_namespace'
  REST_CONFIG = (
    CATALOG_URI = 'https://asdlkfjwoalk-execute-api.us-west-2-amazonaws.com/MyApiStage'
    CATALOG_API_TYPE = AWS_PRIVATE_API_GATEWAY
  )
  REST_AUTHENTICATION = (
    TYPE = SIGV4
    SIGV4_IAM_ROLE = 'arn:aws:iam::123456789XXX:role/my_api_permissions_role'
    SIGV4_EXTERNAL_ID = 'my_iceberg_external_id'
  )
  ENABLED = TRUE;
Copy

Bemerkung

In beiden Beispielen wird eine externe ID (SIGV4_EXTERNAL_ID = 'my_iceberg_external_id') angegeben, die Sie in der Vertrauensbeziehung für Ihre IAM-Rolle (im nächsten Schritt) verwenden können.

Wenn Sie eine externe ID angeben, können Sie dieselbe IAM-Rolle für mehrere Katalogintegrationen verwenden, ohne die Vertrauensrichtlinie der IAM-Rolle zu aktualisieren. Dies ist besonders in Testszenarien nützlich, wenn Sie eine Katalogintegration mehrmals erstellen oder ersetzen müssen.

Vertrauensstellung in IAM konfigurieren

Rufen Sie Informationen über den Benutzer der AWS IAM ab, der für Ihr Snowflake-Konto erstellt wurde, als Sie die Katalogintegration erstellt haben, und konfigurieren Sie die Vertrauensbeziehung für Ihre IAM-Rolle.

  1. Rufen Sie in Snowflake den Befehl DESCRIBE CATALOG INTEGRATION auf:

    DESCRIBE CATALOG INTEGRATION my_rest_catalog_integration;
    
    Copy

    Notieren Sie die folgenden Werte:

    Wert

    Beschreibung

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

    API_AWS_EXTERNAL_ID

    Die externe ID, die notwendig ist, um eine Vertrauensbeziehung aufzubauen. Wenn Sie bei der Erstellung der Katalogintegration keine externe ID (SIGV4_EXTERNAL_ID) angegeben haben, generiert Snowflake eine ID, das Sie verwenden können. Notieren Sie sich den Wert, damit Sie Ihre IAM-Rollen-Vertrauensrichtlinie mit der generierten externen ID aktualisieren können.

  2. Suchen Sie in der AWS Management-Konsole nach IAM und wählen Sie es aus.

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

  4. Wählen Sie die IAM-Rolle, die Sie für Ihre Katalogintegration erstellt haben.

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

  6. Wählen Sie Edit trust policy aus.

  7. Ändern Sie das Richtliniendokument mit den Werten, die Sie aufgezeichnet haben.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<api_aws_iam_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<api_aws_external_id>"
            }
          }
        }
      ]
    }
    
    Copy
  8. Wählen Sie Update policy aus, um Ihre Änderungen zu speichern.

SigV4 (Glue)

Folgen Sie den Schritten in diesem Abschnitt, um eine Katalogintegration für den AWS Glue Iceberg REST-Endpunkt mit Signatureversion 4 (SigV4)-Authentifizierung zu erstellen.

Schritt 1: Zugriffsberechtigungen für den AWS Glue-Datenkatalog konfigurieren

Erstellen Sie eine IAM-Richtlinie für Snowflake für den Zugriff auf den AWS Glue Data Catalog. Verbinden Sie die Richtlinie mit einer IAM-Rolle, die Sie bei der Erstellung einer Katalogintegration angeben. Eine Anleitung dazu finden Sie unter Erstellen von IAM-Richtlinien und Ändern von Rollenberechtigungsrichtlinien im AWS-Benutzerhandbuch für die Identitäts- und Zugriffsverwaltung.

Snowflake benötigt mindestens die folgenden Berechtigungen für den AWS Glue Data Catalog, um auf Informationen über den Glue Iceberg REST-Katalog zuzugreifen.

  • glue:GetConfig

  • glue:GetDatabase

  • glue:GetDatabases

  • glue:GetTable

  • glue:GetTables

Die folgende Beispielrichtlinie (im JSON-Format) bietet die erforderlichen Berechtigungen für den Zugriff auf alle Tabellen in einer bestimmten Datenbank.

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "AllowGlueCatalogTableAccess",
         "Effect": "Allow",
         "Action": [
           "glue:GetConfig",
           "glue:GetDatabase",
           "glue:GetDatabases",
           "glue:GetTable",
           "glue:GetTables"
         ],
         "Resource": [
            "arn:aws:glue:*:<accountid>:table/*/*",
            "arn:aws:glue:*:<accountid>:catalog",
            "arn:aws:glue:*:<accountid>:database/<database-name>"
         ]
      }
   ]
}
Copy

Bemerkung

  • Sie können das Resource-Element dieser Richtlinie ändern, um die zulässigen Ressourcen weiter einzuschränken (z. B. Katalog, Datenbanken oder Tabellen). Weitere Informationen dazu finden Sie unter Von AWS Glue definierte Ressourcentypen

  • Wenn Sie die Verschlüsselung für AWS Glue verwenden, müssen Sie die Richtlinie ändern, um AWS-KMS-Berechtigungen (AWS Key Management Service) hinzuzufügen. Weitere Informationen dazu finden Sie unter Einrichten der Verschlüsselung in AWS Glue.

Schritt 2: Katalogintegration in Snowflake erstellen

Erstellen Sie eine Katalogintegration für den Endpunkt AWS Glue Iceberg REST mit dem Befehl CREATE CATALOG INTEGRATION (Apache Iceberg™ REST). Geben Sie die IAM-Rolle an, die Sie konfiguriert haben. Für WAREHOUSE verwenden Sie Ihre AWS-Konto-ID.

CREATE CATALOG INTEGRATION glue_rest_catalog_int
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'rest_catalog_integration'
  REST_CONFIG = (
    CATALOG_URI = 'https://glue.us-west-2.amazonaws.com/iceberg'
    CATALOG_API_TYPE = AWS_GLUE
    WAREHOUSE = '123456789012'
  )
  REST_AUTHENTICATION = (
    TYPE = SIGV4
    SIGV4_IAM_ROLE = 'arn:aws:iam::123456789012:role/my-role'
    SIGV4_SIGNING_REGION = 'us-west-2'
  )
  ENABLED = TRUE;
Copy

Überprüfen Sie Ihre REST-Katalogkonfiguration

Anhand der folgenden Szenarien können Sie überprüfen, ob Sie die Autorisierung und Zugriffssteuerung für Ihren Iceberg REST-Katalog korrekt konfiguriert haben, sodass Snowflake mit Ihrem Katalogserver interagieren kann.

Verwenden Sie SYSTEM$VERIFY_CATALOG_INTEGRATION

Sie können die Funktion SYSTEM$VERIFY_CATALOG_INTEGRATION verwenden, um die Konfiguration Ihrer Katalogintegration zu überprüfen.

Das folgende Beispiel zeigt, wie die Systemfunktion Probleme mit einer nicht ordnungsgemäß konfigurierten Katalogintegration erkennt und meldet.

Die folgende Beispielanweisung erstellt eine REST-Katalogintegration unter Verwendung eines ungültigen OAuth-Client-Geheimnisses (dies läuft ohne Fehler):

CREATE CATALOG INTEGRATION my_rest_cat_int
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'default'
  REST_CONFIG = (
    CATALOG_URI = 'https://abc123.us-west-2.aws.myapi.com/polaris/api/catalog'
    WAREHOUSE = 'my_warehouse'
  )
  REST_AUTHENTICATION = (
    TYPE = OAUTH
    OAUTH_CLIENT_ID = '123AbC ...'
    OAUTH_CLIENT_SECRET = '1365910abIncorrectSecret ...'
    OAUTH_ALLOWED_SCOPES = ('all-apis', 'sql')
  )
  ENABLED = TRUE;
Copy

Verwenden Sie die Systemfunktion, um die Katalogintegration zu überprüfen – der Vorgang sollte fehlschlagen:

SELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('my_rest_cat_int');
Copy

Ausgabe:

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                              SYSTEM$VERIFY_CATALOG_INTEGRATION('MY_REST_CAT_INT')                                                                                                               |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {                                                                                                                                                                                                                                                                               |
|  "success" : false,                                                                                                                                                                                                                                                             |                                                                                                                                                                                                                                                                    |
|   "errorCode" : "004155",                                                                                                                                                                                                                                                       |
|   "errorMessage" : "SQL Execution Error: Failed to perform OAuth client credential flow for the REST Catalog integration MY_REST_CAT_INT due to error: SQL execution error: OAuth2 Access token request failed with error 'unauthorized_client:The client is not authorized'.." |
| }                                                                                                                                                                                                                                                                               |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Überprüfen Sie eine Konfiguration für OAuth

Führen Sie diese Schritte aus, um Ihre Konfiguration für OAuth mit Ihrem Remote-REST-Katalog zu überprüfen.

Schritt 1: Abrufen eines Zugriffstokens

Verwenden Sie einen curl-Befehl, um ein Zugriffstoken aus Ihrem Katalog abzurufen. Das folgende Beispiel fordert ein Zugriffstoken von Snowflake Open Catalog an:

curl -X POST https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens \
    -H "Accepts: application/json" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    --data-urlencode "grant_type=client_credentials" \
    --data-urlencode "scope=PRINCIPAL_ROLE:ALL" \
    --data-urlencode "client_id=<my_client_id>" \
    --data-urlencode "client_secret=<my_client_secret>" | jq
Copy

Wobei:

  • https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens ist der Endpunkt für den Abruf eines OAuth-Tokens (getToken).

  • scope ist derselbe Wert wie der, den Sie für den Parameter OAUTH_ALLOWED_SCOPES angeben, wenn Sie eine Katalogintegration erstellen. Für mehrere Bereiche verwenden Sie ein Leerzeichen als Trennzeichen.

  • my_client_id ist dieselbe Client-ID, die Sie für den Parameter OAUTH_CLIENT_ID angeben, wenn Sie eine Katalogintegration erstellen.

  • my_client_secret ist das gleiche Client-Geheimnis, das Sie für den Parameter OAUTH_CLIENT_SECRET angeben, wenn Sie eine Katalogintegration erstellen.

Beispiel Rückgabewert:

{
  "access_token": "xxxxxxxxxxxxxxxx",
  "token_type": "bearer",
  "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
  "expires_in": 3600
}

Schritt 2: Überprüfen Sie die Zugriffsberechtigungen für das Token

Vergewissern Sie sich anhand des Zugriffstokens, das Sie im vorherigen Schritt erhalten haben, dass Sie die Berechtigung haben, auf Ihren Katalogserver zuzugreifen.

Sie können einen curl-Befehl verwenden, um die Konfigurationseinstellungen für Ihren Katalog aufzulisten:

curl -X GET "https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/config?warehouse=<warehouse>" \
    -H "Accepts: application/json" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -H "Authorization: Bearer ${ACCESS_TOKEN}" | jq
Copy

Wobei:

  • ?warehouse=warehouse gibt optional den Namen des Warehouse an, das Sie aus Ihrem Katalog abfragen möchten (falls unterstützt). Bei Snowflake Open Catalog ist der Name des Warehouse der Name Ihres Katalogs.

  • ACCESS_TOKEN ist eine Variable, die die access_token enthält, die Sie im vorherigen Schritt abgerufen haben.

Beispiel Rückgabewert:

{
  "defaults": {
    "default-base-location": "s3://my-bucket/polaris/"
  },
  "overrides": {
    "prefix": "my-catalog"
  }
}

Schritt 3: Laden Sie eine Tabelle aus dem Katalog

Sie können auch eine GET-Anfrage stellen, um eine Tabelle zu laden. Snowflake verwendet die loadTable-Operation, um Tabellendaten aus Ihrem REST-Katalog zu laden.

curl -X GET "https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/<prefix>/namespaces/<namespace>/tables/<table>" \
    -H "Accepts: application/json" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -H "Authorization: Bearer ${ACCESS_TOKEN}" | jq
Copy

Wobei:

  • prefix gibt optional das Präfix an, das aus der vorherigen getConfig Antwort stammt.

  • namespace ist der Namespace der Tabelle, die Sie abrufen möchten. Wenn der Namespace verschachtelt ist, verwenden Sie das Trennzeichen %1F, zum Beispiel parentNamespace%1FchildNamespace.

  • table ist der Name der Tabelle.

Überprüfen einer Konfiguration für ein Bearer-Token

Führen Sie die folgenden Schritte aus, um Ihre Konfiguration mit Ihrem remoten REST-Katalog für die Verwendung eines Bearer-Tokens zu überprüfen.

Schritt 1: Überprüfen Sie die Zugriffsberechtigungen für das Token

Verwenden Sie den Befehl curl, um zu überprüfen, ob Sie die Berechtigung haben, auf Ihren Katalogserver zuzugreifen:

curl -X GET "https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/config?warehouse=<warehouse>" \
    -H "Accepts: application/json" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -H "Authorization: Bearer ${BEARER_TOKEN}" | jq
Copy

Wobei:

  • https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens ist der Endpunkt für den Abruf eines OAuth-Tokens (getToken).

  • ?warehouse=warehouse gibt optional den Namen des Warehouse an, das Sie aus Ihrem Katalog abfragen möchten (falls unterstützt).

  • BEARER_TOKEN ist eine Variable, die die access_token enthält, die Sie im vorherigen Schritt abgerufen haben.

Beispiel Rückgabewert:

{
  "defaults": {
    "default-base-location": "s3://my-bucket/polaris"
  },
  "overrides": {
    "prefix": "my-catalog"
  }
}

Schritt 2: Laden Sie eine Tabelle aus dem Katalog

Sie können auch eine GET-Anfrage stellen, um eine Tabelle zu laden. Snowflake verwendet die loadTable-Operation, um Tabellendaten aus Ihrem REST-Katalog zu laden.

curl -X GET "https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/<prefix>/namespaces/<namespace>/tables/<table>" \
    -H "Accepts: application/json" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -H "Authorization: Bearer ${BEARER_TOKEN}" | jq
Copy

Wobei:

  • prefix gibt optional das Präfix an, das aus der vorherigen getConfig Antwort stammt.

  • namespace ist der Namespace der Tabelle, die Sie abrufen möchten. Wenn der Namespace verschachtelt ist, verwenden Sie das Trennzeichen %1F, zum Beispiel parentNamespace%1FchildNamespace.

  • table ist der Name der Tabelle.

Überprüfen Sie eine Konfiguration für SigV4

Gehen Sie folgendermaßen vor, um Ihre Konfiguration auf SigV4 mit AWS zu überprüfen.

Schritt 1: Fügen Sie Ihren Benutzer zur Vertrauensbeziehung der IAM-Rolle hinzu

Wenn Sie eine REST-Katalogintegration für SigV4 erstellen, stellt Snowflake einen AWS IAM-Benutzer für Ihr Snowflake-Konto bereit. Sie fügen diesen Snowflake IAM-Benutzer der Vertrauensbeziehung für eine IAM-Rolle mit der Berechtigung zum Zugriff auf Ihre API Gateway-Ressourcen hinzu.

Um Ihre Konfiguration zu testen, können Sie die Rolle als Benutzer in Ihrem AWS-Konto übernehmen, nachdem Sie Ihren AWS-Benutzer zum Vertrauensrichtliniendokument der Rolle hinzugefügt haben. Um Ihren aktuellen IAM-Benutzer-ARN abzurufen, verwenden Sie den Befehl sts get-caller-identity für die AWS Befehlszeilenschnittstelle (CLI) :

aws sts get-caller-identity
Copy

Beispielausgabe:

{
  "UserId": "ABCDEFG1XXXXXXXXXXX",
  "Account": "123456789XXX",
  "Arn": "arn:aws:iam::123456789XXX:user/managed/my_user"
}

Das aktualisierte Vertrauensrichtliniendokument sollte sowohl den Snowflake Benutzer-ARN als auch Ihren Benutzer-ARN wie folgt enthalten:

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

Eine ausführliche Anweisung finden Sie unter Aktualisieren einer Rollenvertrauensrichtlinie in der Dokumentation AWS IAM.

Schritt 2: Nehmen Sie Ihre IAM-Rolle an, um temporäre Anmeldeinformationen zu erhalten

Um temporäre Sicherheitsanmeldeinformationen für AWS zu erhalten, verwenden Sie den Befehl sts assume-role für AWS CLI.

aws sts assume-role \
  --role-arn <my_role_arn> \
  --role-session-name <session_name>
Copy

Wobei:

  • my_role_arn ist der Amazon Resource Name (ARN) der IAM-Rolle, die Sie für Snowflake konfiguriert haben.

  • session_name ist die Zeichenfolge eines von Ihnen gewählten Bezeichners für die Sitzung mit der angenommenen Rolle, z. B. my_rest_session.

Beispielausgabe:

{
  "Credentials": {
      "AccessKeyId": "XXXXXXXXXXXXXXXXXXXXX",
      "SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXX",
      "SessionToken": "XXXXXXXXXXXXXXXXXXXXX",
      "Expiration": "2024-10-09T08:13:15+00:00"
  },
  "AssumedRoleUser": {
      "AssumedRoleId": "{AccessKeyId}:my_rest_catalog_session",
      "Arn": "arn:aws:sts::123456789XXX:assumed-role/my_catalog_role/my_rest_catalog_session"
  }
}

Bemerkung

Wenn der Befehl assume-role fehlschlägt, bedeutet dies, dass Ihr aktueller AWS-Benutzer nicht in der Vertrauensrichtlinie der Rolle als erlaubter Prinzipal enthalten ist.

Wenn der Snowflake IAM-Benutzer-ARN nicht in Ihrer Vertrauensrichtlinie enthalten ist, kann Snowflake auch keine Verbindung zu Ihren API Gateway-Ressourcen herstellen. Weitere Informationen dazu finden Sie unter Vertrauensstellung in IAM konfigurieren.

Schritt 3: Überprüfen Sie, ob Ihre IAM-Rolle die richtigen Berechtigungen hat

Vergewissern Sie sich anhand der temporären Anmeldeinformationen, die Sie im vorherigen Schritt abgerufen haben, dass Ihre IAM-Rolle die Berechtigung hat, Ihre API Gateway APIs aufzurufen.

Sie können einen curl-Befehl verwenden, um die Konfigurationseinstellungen für Ihren Katalog aufzulisten:

curl -v -X GET  "https://123xxxxxxx.execute-api.us-west-2.amazonaws.com/test_v2/v1/config?warehouse=<warehouse>" \
  --user "$AWS_ACCESS_KEY_ID":"$AWS_SECRET_ACCESS_KEY" \
  --aws-sigv4 "aws:amz:us-west-2:execute-api" \
  -H "x-amz-security-token: $AWS_SESSION_TOKEN"
Copy

Wobei:

  • 123xxxxxxx.execute-api.us-west-2.amazonaws.com ist Ihr API Gateway-Hostname.

  • test_v2 ist der Name des Stagingbereichs, in dem Ihr API eingesetzt wird.

  • v1/config spezifiziert die Operation getConfig aus der Definition des Iceberg-Katalogs OpenAPI.

  • ?warehouse=warehouse gibt optional den Namen des Warehouse an, das Sie aus Ihrem Katalog abfragen möchten (falls unterstützt).

  • $AWS_ACCESS_KEY_ID ist eine Variable, die die AccessKeyId enthält, die Sie mit dem Befehl sts assume-role abgerufen haben.

  • $AWS_SECRET_ACCESS_KEY ist eine Variable, die die SecretAccessKey enthält, die Sie mit dem Befehl sts assume-role abgerufen haben.

  • aws:amz:us-west-2:execute-api ist der Signiername des SigV4-Protokolls. Verwenden Sie für AWS Glue stattdessen aws:amz:us-west-2:glue.

  • $AWS_SESSION_TOKEN ist eine Variable, die die SessionToken enthält, die Sie mit dem Befehl sts assume-role abgerufen haben.

Beispiel Rückgabewert:

{
  "defaults": {},
  "overrides": {
    "prefix": "my-catalog"
  }
}

Sie können auch eine GET-Anfrage stellen, um eine Tabelle zu laden. Snowflake verwendet die loadTable-Operation, um Tabellendaten aus Ihrem REST-Katalog zu laden.

curl -v -X GET "https://123xxxxxxx.execute-api.us-west-2.amazonaws.com/test_v2/v1/<prefix>/namespaces/<namespace>/tables/<table>" \
    --user "$AWS_ACCESS_KEY_ID":"$AWS_SECRET_ACCESS_KEY" \
    --aws-sigv4 "aws:amz:us-west-2:execute-api" \
    -H "x-amz-security-token: $AWS_SESSION_TOKEN"
Copy

Wobei:

  • prefix gibt optional das Präfix an, das aus der vorherigen getConfig Antwort stammt.

  • namespace ist der Namespace der Tabelle, die Sie abrufen möchten. Wenn der Namespace verschachtelt ist, verwenden Sie das Trennzeichen %1F, zum Beispiel parentNamespace%1FchildNamespace.

  • table ist der Name der Tabelle.

Private API

Für eine private API können Sie Ihren VPC-Endpunkt und den privaten Amazon API Gateway-Hostnamen in denselben curl-Befehlen angeben.

Beispiel:

curl -v -X GET  "https://vpce-xxxxxxxxxxxxxxxxxxxxxxxxxx.execute-api.us-west-2.vpce.amazonaws.com/test_v2/v1/config?warehouse=<warehouse>" \
  --user "$AWS_ACCESS_KEY_ID":"$AWS_SECRET_ACCESS_KEY" \
  --aws-sigv4 "aws:amz:us-west-2:execute-api" \
  -H "x-amz-security-token: $AWS_SESSION_TOKEN"
  -H "Host: abc1defgh2.execute-api.us-west-2.amazonaws.com"
Copy

Wobei:

  • https://vpce-xxxxxxxxxxxxxxxxxxxxxxxxxx.execute-api.us-west-2.vpce.amazonaws.com/... ist der Hostname Ihres VPC-Endpunkts.

  • abc1defgh2.execute-api.us-west-2.amazonaws.com ist der Hostname Ihrer privaten API in Amazon API Gateway.