Ü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'
    CATALOG_NAME = 'my_catalog_name'
  )
  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.