

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Snowflake Iceberg 카탈로그에 페더레이션
<a name="catalog-federation-snowflake"></a>

AWS Glue Data Catalog 는 Snowflake 서비스 보안 주체의 OAuth2 자격 증명을 Snowflake 사용하여에 페더레이션합니다. 이 페더레이션을 사용하여 Snowflake Horizon 및 Snowflake Polaris 카탈로그에 연결할 수 있습니다. 이 인증 메커니즘을 사용하면 Data Catalog가 서비스 보안 주체와 연결된 권한을 기반으로 카탈로그에 있는 다양한 객체(예: 카탈로그, 데이터베이스 및 테이블)의 메타데이터에 액세스할 수 있습니다. 올바른 객체에 대한 액세스를 보장하려면의 서비스 보안 주체에게 이러한 객체의 메타데이터Snowflake를 읽는 데 필요한 권한을 부여해야 합니다.

## 사전 조건
<a name="catalog-federation-snowflake-prerequisites"></a>

Lake Formation에서 관리하는 데이터 카탈로그에서 페더레이션 카탈로그를 생성하기 전에 다음 권한이 있는지 확인합니다.

IAM 보안 주체(사용자 또는 역할)에는 다음 권한이 있어야 합니다.
+ **Lake Formation 권한** - `lakeformation:RegisterResource`, `lakeformation:DescribeResource` 
+ **AWS Glue 권한** - `glue:CreateConnection`, `glue:CreateCatalog`, `glue:GetConnection`, `glue:PassConnection` 
+ **Secrets Manager 권한** - `secretsmanager:CreateSecret`, `secretsmanager:GetSecretValue` 
+ **IAM 권한** - `iam:CreateRole`, `iam:AttachRolePolicy`, `iam:PassRole` 

Lake Formation 데이터 레이크 관리자이거나 데이터 카탈로그에 대한 `CREATE_CATALOG` 권한이 있어야 합니다.

## 페더레이션 카탈로그 생성
<a name="catalog-federation-snowflake-create"></a>

### 콘솔 사용
<a name="catalog-federation-snowflake-console"></a>

1. 콘솔에 로그인하고 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) Lake Formation 콘솔을 엽니다.

1. 오른쪽 상단 페이지에서 원하는 AWS 리전을 선택합니다.

1. 왼쪽 탐색 창에서 카탈로그를 선택합니다.

1. **카탈로그 생성을** 선택하여 **카탈로그 생성 워크플로**를 엽니다.

1. **데이터 소스 선택** 단계에서 사용 가능한 옵션 Snowflake 중에서 선택합니다.

1. **카탈로그 세부 정보 설정** 단계에서 카탈로그 세부 정보, 연결 세부 정보 및 등록 세부 정보의 세 가지 정보를 제공합니다.

1. **카탈로그 세부 정보** 컨테이너에서 AWS Glue 페더레이션 카탈로그에 고유한 이름을 제공하고 기존 Snowflake 카탈로그의 이름을 입력합니다.

1. **연결 세부 정보** 컨테이너에서 액세스 권한이 있는 기존 연결 중에서 선택하거나 구성을 제공하여 새 커넥터를 생성할 수 있습니다.

1. 새로운 연결 구성은 다음과 같습니다.
   + 연결 이름 - AWS Glue 연결 객체의 고유한 이름입니다.
   + 인스턴스 URL - 기존 Snowflake 계정의 엔드포인트 URL입니다.
   + 인증 -가 원격 카탈로그 서버에 연결하는 데 AWS Glue 사용하는 인증 구성을 지정합니다.는 OAuth2 인증과 사용자 지정 인증을 모두 AWS Glue 지원합니다.
   + 토큰 URL - 원격 카탈로그의 자격 증명 공급자의 URL을 지정합니다.
   + OAuth2 클라이언트 ID - 원격 카탈로그와 연결된 OAuth2 자격 증명의 클라이언트 ID를 지정합니다.
   + 보안 암호 -를 사용하여 OAuth2 클라이언트 보안 암호를 저장하고 AWS Secrets Manager 사용하거나 텍스트 상자에 보안 암호 값을 입력합니다. 콘솔에 보안 암호를 수동으로 입력하면가 사용자를 대신하여 보안 암호를 AWS Glue 생성합니다.
   + 토큰 URL 범위 - 인증을 위한 OAuth 범위를 지정합니다.
   + 카탈로그 케이싱 필터 - 원격 카탈로그에서 데이터 카탈로그로 소문자 또는 대문자 객체를 가져올지 여부를 선택합니다.

1.  AWS Glue 및 Lake Formation 서비스 보안 주체가 원격 Iceberg 테이블의 AWS Secrets Manager 및 Amazon S3 위치에서 각각 보안 암호에 액세스하는 데 사용할 수 있는 IAM 역할을 생성합니다. 등록 드롭다운에서 IAM 역할을 선택합니다. IAM 정책 세부 정보는 다음 CLI 섹션의 2단계 및 3단계를 참조하세요.

1. 연결 테스트를 선택하여 연결 속성과 IAM 역할 액세스가 올바르게 구성되었는지 테스트합니다.

1. **다음을** 선택하여 설정을 검토합니다.

1. 검토 페이지에서 **카탈로그 생성을** 선택합니다.

### CLI 사용
<a name="snowflake-federation-cli"></a>

1. <a name="snowflake-step-1"></a>** AWS Secrets Manager 보안 암호 생성**

    AWS Glue 커넥터는 **OAuth2**와 **Custom**이라는 두 가지 인증 유형을 지원합니다. OAuth2 옵션을 사용하는 경우 AWS Secrets Manager 를 사용하여 Snowflake 서비스 보안 주체의 클라이언트 암호를 저장합니다. 나중에 AWS Glue 연결을 생성할 때이 보안 암호를 사용합니다. 사용자 지정 인증의 경우 AWS Secrets Manager 를 사용하여 액세스 토큰을 저장하고 검색합니다.

   다음 예제에서는 , `your-snowflake-secret``client_secret``region`를 사용자 고유의 정보로 바꿉니다.

   ```
   aws secretsmanager create-secret \
   --name your-snowflake-secret \
   --description "Snowflake secret" \
   --secret-string '{
   "USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET": "client_secret"
   }' \
   --region region
   ```
**참고**  
`USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`는가 보안 암호의 클라이언트 보안 암호 값을 참조하는 데 AWS Glue 사용하는 예약된 키워드입니다. Lake Formation 콘솔에서 보안 암호를 생성할 때도 동일한 키워드를 사용합니다.

1. <a name="snowflake-step-2"></a>**이전 단계에서 생성된 보안 암호에 대한 AWS Glue 연결 객체 액세스 권한을 부여하는 IAM 역할 생성**

    AWS Glue 연결 객체는를 사용하여 OAuth AWS Secrets Manager 보안 암호 토큰을 저장, 검색 및 새로 고칠 때 보안 암호 AWS Secrets Manager 에 대한 액세스 권한이 필요합니다. 또한 AWS Glue 연결 객체는 Amazon VPC 엔드포인트를 사용하여 Snowflake 계정에 대한 연결을 제한할 때 Amazon VPC 네트워크 인터페이스를 생성, 설명 및 사용할 수 있는 액세스 권한이 필요합니다.

   IAM 정책을 생성하여 IAM 역할에 연결합니다. 신뢰 정책에 AWS Glue 서비스 보안 주체를 추가합니다.

   다음 예제에서는 , `your-vpc-id`및 `your-secrets-manager-ARN``your-subnet-id1`를 자체 정보로 바꿉니다.  
**Example IAM 정책**  

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [{
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue",
                   "secretsmanager:DescribeSecret",
                   "secretsmanager:PutSecretValue"
               ],
               "Resource": [
                   "your-secrets-manager-ARN"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:CreateNetworkInterface",
                   "ec2:DeleteNetworkInterface",
                   "ec2:DescribeNetworkInterfaces"
               ],
               "Resource": "*",
               "Condition": {
                   "ArnEquals": {
                       "ec2:Vpc": "arn:aws:ec2:region:account-id:vpc/your-vpc-id",
                       "ec2:Subnet": ["arn:aws:ec2:region:account-id:subnet/your-subnet-id1"]
                   }
               }
           }
       ]
   }
   ```  
**Example 신뢰 정책**  

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [{
           "Effect": "Allow",
           "Principal": {
               "Service": "glue.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
       }]
   }
   ```

1. <a name="snowflake-step-3"></a>**카탈로그의 Amazon S3 위치에 대한 읽기 액세스 권한을 Lake Formation에 부여하는 IAM 정책 생성**

   데이터 카탈로그에서 페더레이션 카탈로그의 카탈로그 소유자는 Lake Formation을 사용하여 데이터 팀에 대략적인 테이블 액세스, 세분화된 열 수준, 행 수준 및 셀 수준 액세스, 태그 기반 액세스 권한을 부여합니다. Lake Formation은 원격 Iceberg 테이블의 기본 Amazon S3 위치에 대한 액세스 권한을 부여하는 IAM 역할을 사용합니다. 이 액세스를 통해 Lake Formation은 원격 테이블을 쿼리하는 분석 엔진에 범위가 지정된 액세스 자격 증명을 제공할 수 있습니다.

   IAM 정책을 생성하고 IAM 역할에 연결합니다. Lake Formation 서비스 보안 주체를 역할 신뢰 정책에 추가합니다.

   다음 예제에서는 `amzn-s3-demo-bucketN` 및 `your-kms-key`을 고유한 정보로 바꿉니다.  
**Example IAM 정책**  

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [{
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket1/*",
                   "arn:aws:s3:::amzn-s3-demo-bucket2/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket1",
                   "arn:aws:s3:::amzn-s3-demo-bucket2"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt",
                   "kms:Encrypt"
               ],
               "Resource": [
                   "your-kms-key"
               ]
           }
       ]
   }
   ```  
**Example 신뢰 정책**  

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [{
           "Sid": "",
           "Effect": "Allow",
           "Principal": {
               "Service": "lakeformation.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
       }]
   }
   ```
**참고**  
Lake Formation 콘솔을 사용하여 페더레이션 카탈로그를 생성하면 콘솔은 두 정책이 모두 연결된 단일 IAM 역할을 사용하여 설정을 완료합니다.

1. <a name="snowflake-step-4"></a>** AWS Glue 연결 객체 생성**

   AWS Glue 커넥터는 OAuth2 및 사용자 지정 인증 방법을 지원합니다. 데이터 카탈로그 연결 객체는 원격 카탈로그의 소문자 또는 대문자 객체를 데이터 카탈로그로 가져올 수 있는 `CATALOG_CASING_FILTER` 구성을 지원합니다.

   다음 예제에서는 OAuth2 인증 구성을 사용하여 AWS Glue 연결을 생성합니다. `highlighted sections`를 자신의 정보로 대체합니다.

   ```
   aws glue create-connection \
       --connection-input '{
   "Name": "your-glue-connection-to-snowflake-account",
   "ConnectionType": "SNOWFLAKEICEBERGRESTCATALOG",
   "ConnectionProperties": {
       "INSTANCE_URL": "your-snowflake-account-URL",
       "ROLE_ARN": "your-IAM-role-for-secrets-and-VPC-access",
       "CATALOG_CASING_FILTER": "LOWERCASE_ONLY"
   },
   "AuthenticationConfiguration": {
       "AuthenticationType": "OAUTH2",
       "OAuth2Properties": {
           "OAuth2GrantType": "CLIENT_CREDENTIALS",
           "TokenUrl": "your-internal-or-external-token-server-url",
           "OAuth2ClientApplication": {
               "UserManagedClientApplicationClientId": "our-client-id"
           },
           "TokenUrlParametersMap": {
               "scope": "all-apis"
           }
       },
       "SecretArn": "arn:aws:secretsmanager:your-aws-region:your-aws-account-id:secret:snowflake-secret"
   }
   }'
   ```

1. <a name="snowflake-step-5"></a>**Lake Formation 리소스로 AWS Glue 연결 등록**

    AWS Glue 연결 객체(4단계에서 생성됨) 및 IAM 역할(3단계에서 생성됨)을 사용하여 이제 AWS Glue 연결 객체를 Lake Formation 관리형 리소스로 등록할 수 있습니다.

   `your-glue-connector-arn` 및 `your-IAM-role-ARN-having-LF-access`을(를) 자신의 정보로 대체합니다.

   ```
   aws lakeformation register-resource \
       --resource-arn your-glue-connector-arn \
       --role-arn your-IAM-role-ARN-having-LF-access \
       --with-federation \
       --with-privileged-access
   ```

1. <a name="snowflake-step-6"></a>**데이터 카탈로그에서 페더레이션 카탈로그 생성**

    AWS Glue 연결 객체를 생성하고 Lake Formation에 등록한 후 데이터 카탈로그에서 페더레이션 카탈로그를 생성할 수 있습니다.

   페더레이션 카탈로그에에서 고유한 이름을 제공하고`your-federated-catalog-name`,에서 카탈로그를 참조하고`catalog-name-in-Snowflake`, Snowflake에서 이전에 생성한 연결 이름을 입력합니다`your-glue-connection-name`.

   ```
   aws glue create-catalog \
       --name your-federated-catalog-name \
       --catalog-input '{
       "FederatedCatalog": {
           "Identifier": catalog-name-in-Snowflake",
           "ConnectionName": your-glue-connection-name"
       },
       "CreateTableDefaultPermissions": [],
       "CreateDatabaseDefaultPermissions": []
   }'
   ```

## 와 통합 시 고려 사항 Snowflake
<a name="snowflake-considerations"></a>
+ 에서 리소스(예: 데이터베이스 및 테이블)를 삭제해도 SnowflakeLake Formation은 해당 페더레이션 리소스에 부여된 권한을 자동으로 취소하지 않습니다. 액세스 권한을 제거하려면 Lake Formation을 사용하여 페더레이션 리소스에 대해 이전에 부여된 권한을 명시적으로 취소해야 합니다.
+ `CATALOG_CASING_FILTER='UPPERCASE_ONLY'` 구성으로 원격 카탈로그를 탑재하면 대문자 식별자가 있는 데이터베이스와 테이블이 페더레이션되지만 소문자 식별자가 있는 객체는 페더레이션되지 않습니다.
+ 동일한 AWS Glue 연결을 재사용하여 여러 페더레이션 카탈로그를 생성할 수 있습니다. 카탈로그를 삭제해도 연결된 연결은 삭제되지 않습니다. 연결을 삭제하려면 AWS CLI `aws glue delete-connection` 명령을 사용하고 연결된 모든 카탈로그를 먼저 삭제해야 합니다.
+ Polaris 카탈로그에 중첩된 네임스페이스는 지원되지 않습니다. 즉, 카탈로그 페더레이션은 3파트 표기법을 따르는 원격 Iceberg 테이블에 액세스할 수 있습니다`catalog.database.table`.