

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 联合到 Snowflake 冰山目录
<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 委托人（用户或角色）必须具有以下权限：
+ **湖泊形成权限 ** —`lakeformation:RegisterResource`，`lakeformation:DescribeResource`
+ **AWS Glue 权限 ** — `glue:CreateConnection`、`glue:CreateCatalog`、`glue:GetConnection`、`glue:PassConnection`
+ **密钥管理器权限 ** —`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. 登录控制台并在以下位置打开 Lake Formation 控制台[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在 AWS 地区选择器中选择首选区域。

1. 在左侧导航窗格中，选择目录。

1. 选择 “**创建目录” ** 以打开 “**创建目录” 工作流程**。

1. 在**选择数据源**步骤中，Snowflake从可用选项中进行选择。

1. 在 ** “设置目录详细信息” ** 步骤中，您提供三个信息：目录详细信息、连接详细信息和注册详细信息。

1. 在**目录详细信息**容器中，为您的 AWS Glue 联合目录提供一个唯一的名称，然后输入现有Snowflake目录的名称。

1. 在**连接详细信息**容器中，您可以从有权访问的现有连接中进行选择，也可以提供配置以创建新的连接器。

1. 新的连接配置包括：
   + 连接名称- AWS Glue 连接对象的唯一名称。
   + 实例 URL — 您现有Snowflake账户的终端节点 URL。
   + 身份验证-指定用于连接远程目录服务器的身份验证配置。 AWS Glue AWS Glue 支持 OAuth2 和自定义身份验证。
   + 令牌 URL：指定远程目录的身份提供者的 URL。
   + OAuth2 客户端 ID —（可选）指定与您的远程目录关联的 OAuth2 凭据的客户端 ID。如果您不提供客户端 ID，则令牌请求仅使用存储在中的 AWS Secrets Manager客户端密钥进行身份验证。
   + 密钥 — 使用 AWS Secrets Manager 或在文本框中输入密钥值来存储和使用 OAuth2 客户端密钥。当您在控制台中手动输入密钥时，将代表您 AWS Glue 创建密钥。
   + 令牌 URL 范围：指定用于身份验证的 OAuth 范围。
   + 目录大小写过滤器-选择将小写或大写对象从远程目录引入数据目录。

1. 创建一个 IAM 角色， AWS Glue Lake Formation 服务委托人可以使用该角色分别访问远程 Iceberg 表 AWS Secrets Manager 和 Amazon S3 位置的密钥。在注册下拉列表中选择 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 ** 和自定义。** **使用 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>**创建一个 IAM 角色，向 AWS Glue 连接对象提供对上一步中创建的密钥的访问权限 **

   当您用于 AWS Secrets Manager 存储、检索和刷新 OAuth AWS Secrets Manager 密钥令牌时， AWS Glue 连接对象需要访问密钥。当您使用亚马逊 VPC 终端节点限制与Snowflake账户的 AWS Glue 连接时，连接对象还需要访问权限才能创建、描述和使用 Amazon VPC 网络接口。

   创建 IAM 策略并将其附加到 IAM 角色。将 AWS Glue 服务主体添加到信任策略中。

   在以下示例中，将`{{your-secrets-manager-ARN}}``{{your-vpc-id}}`、和`{{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>**创建一个 IAM 策略，授予 Lake Formation 对目录的 Amazon S3 位置的读取权限 **

   作为 Data Catalog 中联合目录的目录所有者，您可以使用 Lake Formation 向数据团队授予粗粒度表访问权限、细粒度（列级、行级和单元格级）访问权限以及基于标签的访问权限。Lake Formation 使用 IAM 角色来允许其访问您的远程 Iceberg 表的底层 Amazon S3 位置。这种访问权限允许 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}}"
   }
   }'
   ```
**注意**  
`OAuth2ClientApplication` 字段为可选项。如果省略它，则令牌请求仅使用存储在中的客户端密钥进行身份验证 AWS Secrets Manager，而不会发送客户端 ID。

1. <a name="snowflake-step-5"></a>**将 AWS Glue 连接注册为 Lake Formation 资源 **

   使用 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>
+ 当您删除资源（如数据库和表）时Snowflake，Lake Formation 不会自动撤消授予该联合资源的权限。要删除访问权限，您需要明确撤消先前使用 Lake Formation 授予联合资源的权限。
+ 当您使用`CATALOG_CASING_FILTER='UPPERCASE_ONLY'`配置装载远程目录时，标识符为大写的数据库和表是联合的，但标识符为小写的对象不是。
+ 您可以重复使用同一个 AWS Glue 连接来创建多个联合目录。删除目录不会删除关联的连接。要删除连接，请使用 AWS CLI `aws glue delete-connection` 命令并确保首先删除所有关联的目录。
+ 不支持Polaris目录中的嵌套命名空间。也就是说，目录联合可以访问遵循三部分表示法`catalog.database.table`的远程Iceberg表。