Ü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;
Verwenden Sie die Systemfunktion, um die Katalogintegration zu überprüfen – der Vorgang sollte fehlschlagen:
SELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('my_rest_cat_int');
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
Wobei:
https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokensist der Endpunkt für den Abruf eines OAuth-Tokens (getToken).scopeist derselbe Wert wie der, den Sie für den ParameterOAUTH_ALLOWED_SCOPESangeben, wenn Sie eine Katalogintegration erstellen. Für mehrere Bereiche verwenden Sie ein Leerzeichen als Trennzeichen.my_client_idist dieselbe Client-ID, die Sie für den ParameterOAUTH_CLIENT_IDangeben, wenn Sie eine Katalogintegration erstellen.my_client_secretist das gleiche Client-Geheimnis, das Sie für den ParameterOAUTH_CLIENT_SECRETangeben, 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
Wobei:
?warehouse=warehousegibt 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_TOKENist eine Variable, die dieaccess_tokenenthä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
Wobei:
prefixgibt optional das Präfix an, das aus der vorherigengetConfigAntwort stammt.namespaceist der Namespace der Tabelle, die Sie abrufen möchten. Wenn der Namespace verschachtelt ist, verwenden Sie das Trennzeichen%1F, zum BeispielparentNamespace%1FchildNamespace.tableist 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
Wobei:
https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokensist der Endpunkt für den Abruf eines OAuth-Tokens (getToken).?warehouse=warehousegibt optional den Namen des Warehouse an, das Sie aus Ihrem Katalog abfragen möchten (falls unterstützt).BEARER_TOKENist eine Variable, die dieaccess_tokenenthä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
Wobei:
prefixgibt optional das Präfix an, das aus der vorherigengetConfigAntwort stammt.namespaceist der Namespace der Tabelle, die Sie abrufen möchten. Wenn der Namespace verschachtelt ist, verwenden Sie das Trennzeichen%1F, zum BeispielparentNamespace%1FchildNamespace.tableist 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
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"
}
}
}
]
}
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>
Wobei:
my_role_arnist der Amazon Resource Name (ARN) der IAM-Rolle, die Sie für Snowflake konfiguriert haben.session_nameist 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"
Wobei:
123xxxxxxx.execute-api.us-west-2.amazonaws.comist Ihr API Gateway-Hostname.test_v2ist der Name des Stagingbereichs, in dem Ihr API eingesetzt wird.v1/configspezifiziert die Operation getConfig aus der Definition des Iceberg-Katalogs OpenAPI.?warehouse=warehousegibt optional den Namen des Warehouse an, das Sie aus Ihrem Katalog abfragen möchten (falls unterstützt).$AWS_ACCESS_KEY_IDist eine Variable, die dieAccessKeyIdenthält, die Sie mit dem Befehlsts assume-roleabgerufen haben.$AWS_SECRET_ACCESS_KEYist eine Variable, die dieSecretAccessKeyenthält, die Sie mit dem Befehlsts assume-roleabgerufen haben.aws:amz:us-west-2:execute-apiist der Signiername des SigV4-Protokolls. Verwenden Sie für AWS Glue stattdessenaws:amz:us-west-2:glue.$AWS_SESSION_TOKENist eine Variable, die dieSessionTokenenthält, die Sie mit dem Befehlsts assume-roleabgerufen 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"
Wobei:
prefixgibt optional das Präfix an, das aus der vorherigengetConfigAntwort stammt.namespaceist der Namespace der Tabelle, die Sie abrufen möchten. Wenn der Namespace verschachtelt ist, verwenden Sie das Trennzeichen%1F, zum BeispielparentNamespace%1FchildNamespace.tableist 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"
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.comist der Hostname Ihrer privaten API in Amazon API Gateway.