REST 카탈로그 구성 확인하기¶
다음 시나리오를 사용하여 Snowflake가 카탈로그 서버와 상호 작용할 수 있도록 Iceberg REST 카탈로그에 대한 인증 및 액세스 제어를 올바르게 구성했는지 확인할 수 있습니다.
SYSTEM$VERIFY_CATALOG_INTEGRATION 사용¶
SYSTEM$VERIFY_CATALOG_INTEGRATION 함수를 사용하여 카탈로그 통합 구성을 확인할 수 있습니다.
다음 예제는 시스템 함수가 부적절하게 구성된 카탈로그 통합의 문제를 포착하고 보고하는 방법을 보여줍니다.
다음 예제 문은 잘못된 OAuth 클라이언트 시크릿을 사용하여 REST 카탈로그 통합을 생성합니다(오류 없이 실행됨):
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;
시스템 함수를 사용하여 카탈로그 통합을 확인하고 실패를 예상합니다.
SELECT SYSTEM$VERIFY_CATALOG_INTEGRATION('my_rest_cat_int');
출력:
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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'.." |
| } |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
OAuth 에 대한 구성 확인¶
원격 REST 카탈로그를 사용하여 OAuth 구성을 확인하려면 다음 단계를 따르십시오.
1단계: 엑세스 토큰 검색하기¶
curl 명령을 사용하여 카탈로그에서 엑세스 토큰을 검색합니다. 다음 예제는 Snowflake Open Catalog 에서 엑세스 토큰을 요청합니다.
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
여기서
https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens는 OAuth 토큰을 검색하는 엔드포인트입니다(getToken).scope은 카탈로그 통합을 생성할 때OAUTH_ALLOWED_SCOPES매개 변수에 지정하는 값과 동일합니다. 범위가 여러 개인 경우 공백을 구분 기호로 사용합니다.my_client_id는 카탈로그 통합을 생성할 때OAUTH_CLIENT_ID매개 변수에 지정한 것과 동일한 클라이언트 ID 입니다.my_client_secret은 카탈로그 통합을 만들 때OAUTH_CLIENT_SECRET매개 변수에 지정한 것과 동일한 클라이언트 시크릿입니다.
반환 값 예제:
{
"access_token": "xxxxxxxxxxxxxxxx",
"token_type": "bearer",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"expires_in": 3600
}
2단계: 엑세스 토큰 권한 확인하기¶
이전 단계에서 검색한 엑세스 토큰을 사용하여 카탈로그 서버에 액세스할 수 있는 권한이 있는지 확인합니다.
curl 명령을 사용하여 카탈로그의 구성 설정을 목록으로 만들 수 있습니다.
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
여기서
?warehouse=warehouse는 선택적으로 카탈로그에서 요청할 웨어하우스 이름을 지정합니다(지원되는 경우). Snowflake Open Catalog 의 경우 웨어하우스 이름은 카탈로그 이름입니다.ACCESS_TOKEN은 이전 단계에서 검색한access_token을 포함하는 변수입니다.
반환 값 예제:
{
"defaults": {
"default-base-location": "s3://my-bucket/polaris/"
},
"overrides": {
"prefix": "my-catalog"
}
}
3단계: 카탈로그에서 테이블 로드하기¶
GET 으로 요청하여 테이블을 로딩할 수도 있습니다. Snowflake는 loadTable 작업을 사용하여 REST 카탈로그에서 테이블 데이터를 로드합니다.
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
여기서
prefix는 선택적으로 이전getConfig응답에서 얻은 접두사를 지정합니다.namespace는 검색하려는 테이블의 네임스페이스입니다. 네임스페이스가 중첩된 경우%1F구분 기호를 사용합니다(예:parentNamespace%1FchildNamespace).table은 테이블 이름입니다.
무기명 토큰에 대한 구성 확인¶
다음 단계에 따라 원격 REST 카탈로그에서 무기명 토큰 사용에 대한 구성을 확인하십시오.
1단계: 엑세스 토큰 권한 확인하기¶
curl 명령을 사용하여 카탈로그 서버에 액세스할 수 있는 권한이 있는지 확인합니다.
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
여기서
https://xx123xx.us-west-2.aws.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens는 OAuth 토큰을 검색하는 엔드포인트입니다(getToken).?warehouse=warehouse는 선택적으로 카탈로그에서 요청할 웨어하우스 이름을 지정합니다(지원되는 경우).BEARER_TOKEN은 이전 단계에서 검색한access_token을 포함하는 변수입니다.
반환 값 예제:
{
"defaults": {
"default-base-location": "s3://my-bucket/polaris"
},
"overrides": {
"prefix": "my-catalog"
}
}
2단계: 카탈로그에서 테이블 로드하기¶
GET 으로 요청하여 테이블을 로딩할 수도 있습니다. Snowflake는 loadTable 작업을 사용하여 REST 카탈로그에서 테이블 데이터를 로드합니다.
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
여기서
prefix는 선택적으로 이전getConfig응답에서 얻은 접두사를 지정합니다.namespace는 검색하려는 테이블의 네임스페이스입니다. 네임스페이스가 중첩된 경우%1F구분 기호를 사용합니다(예:parentNamespace%1FchildNamespace).table은 테이블 이름입니다.
SigV4 에 대한 구성 확인¶
AWS 로 SigV4 에 대한 구성을 확인하려면 다음 단계를 따르십시오.
1단계: IAM 역할 신뢰 관계에 사용자를 추가합니다¶
SigV4 에 대한 REST 카탈로그 통합을 생성하면 Snowflake는 AWS IAM 사용자를 Snowflake 계정에 프로비저닝합니다. API 게이트웨이 리소스에 액세스할 수 있는 권한이 있는 IAM 역할 에 대한 IAM 사용자를 신뢰 관계에 추가 합니다.
구성을 테스트하려면 사용자는 역할의 신뢰 정책 문서에 AWS 사용자를 추가한 후 AWS 계정에서 사용자로 역할을 맡을 수 있습니다. 현재 IAM 사용자를 검색하려면 ARN, AWS 명령줄 인터페이스(CLI)에 sts get-caller-identity 명령을 사용합니다. :
aws sts get-caller-identity
출력 예:
{
"UserId": "ABCDEFG1XXXXXXXXXXX",
"Account": "123456789XXX",
"Arn": "arn:aws:iam::123456789XXX:user/managed/my_user"
}
업데이트된 신뢰 정책 문서에는 다음과 같이 Snowflake 사용자(ARN)와 사용자(ARN)가 모두 포함되어야 합니다.
{
"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"
}
}
}
]
}
전체 지침은 AWS IAM 설명서의 역할 신뢰 정책 업데이트 섹션을 참조하십시오.
2단계: 임시 자격 증명을 얻기 위해 IAM 역할을 가정합니다.¶
AWS 에 대한 임시 보안 자격 증명을 얻으려면 sts assume-role 명령을 사용하여 AWS CLI 에 대한 임시 보안 자격 증명을 얻습니다.
aws sts assume-role \
--role-arn <my_role_arn> \
--role-session-name <session_name>
여기서
my_role_arn는 Snowflake에 대해 구성한 IAM 역할의 Amazon 리소스 이름(ARN)입니다.session_name는 가정된 역할 세션에 대해 사용자가 선택한 문자열 식별자입니다(예:my_rest_session).
출력 예:
{
"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"
}
}
참고
assume-role 명령이 실패하면 현재 AWS 사용자가 역할의 신뢰 정책에 허용된 주체로 포함되어 있지 않다는 의미입니다.
마찬가지로 Snowflake IAM 사용자 ARN 이 신뢰 정책에 포함되지 않은 경우 Snowflake는 API 게이트웨이 리소스에 연결할 수 없습니다. 자세한 내용은 IAM에서 신뢰 관계 구성 섹션을 참조하십시오.
3단계: IAM 역할에 올바른 권한이 있는지 확인합니다¶
이전 단계에서 검색한 임시 자격 증명을 사용하여 IAM 역할에 API 게이트웨이 APIs 를 호출할 수 있는 권한이 있는지 확인합니다.
curl 명령을 사용하여 카탈로그의 구성 설정을 목록으로 만들 수 있습니다.
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"
여기서
123xxxxxxx.execute-api.us-west-2.amazonaws.com은 API 게이트웨이 호스트 이름입니다.test_v2는 API 가 배포되는 스테이지의 이름입니다.v1/config는 Iceberg 카탈로그 OpenAPI 정의에서 getConfig 작업을 지정합니다.?warehouse=warehouse는 선택적으로 카탈로그에서 요청할 웨어하우스 이름을 지정합니다(지원되는 경우).$AWS_ACCESS_KEY_ID는sts assume-role명령을 사용하여 검색한AccessKeyId를 포함하는 변수입니다.$AWS_SECRET_ACCESS_KEY는sts assume-role명령을 사용하여 검색한SecretAccessKey를 포함하는 변수입니다.aws:amz:us-west-2:execute-api는 SigV4 프로토콜의 서명 이름입니다. AWS Glue의 경우aws:amz:us-west-2:glue를 대신 사용하십시오.$AWS_SESSION_TOKEN는sts assume-role명령을 사용하여 검색한SessionToken을 포함하는 변수입니다.
반환 값 예제:
{
"defaults": {},
"overrides": {
"prefix": "my-catalog"
}
}
GET 으로 요청하여 테이블을 로딩할 수도 있습니다. Snowflake는 loadTable 작업을 사용하여 REST 카탈로그에서 테이블 데이터를 로드합니다.
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"
여기서
prefix는 선택적으로 이전getConfig응답에서 얻은 접두사를 지정합니다.namespace는 검색하려는 테이블의 네임스페이스입니다. 네임스페이스가 중첩된 경우%1F구분 기호를 사용합니다(예:parentNamespace%1FchildNamespace).table은 테이블 이름입니다.
비공개 API
비공개 API 의 경우 동일한 curl 명령에서 VPC 엔드포인트와 비공개 Amazon API 게이트웨이 호스트 이름을 지정할 수 있습니다.
예:
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"
여기서
https://vpce-xxxxxxxxxxxxxxxxxxxxxxxxxx.execute-api.us-west-2.vpce.amazonaws.com/...은 VPC 엔드포인트의 호스트 이름입니다.abc1defgh2.execute-api.us-west-2.amazonaws.com은 Amazon API 게이트웨이에서 비공개 API 의 호스트 이름입니다.