

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

# Federate to Snowflake Iceberg 目录
联合到 Snowflake

Amazon Glue Data Catalog 联合Snowflake使用Snowflake服务主 OAuth2 体的凭证。您可以使用此联合来连接Snowflake Horizon和Snowflake Polaris目录。这种身份验证机制允许 Data Catalog 根据与服务主体关联的权限访问目录中各种对象（例如目录、数据库和表）的元数据。为确保访问正确的对象，必须向服务主体授予读取这些对象元数据的必要权限。Snowflake

## 先决条件


在数据目录中创建受 Lake Formation 管理的联合目录之前，请确保您拥有以下权限：

您的 IAM 委托人（用户或角色）必须具有以下权限：
+ **Lake Formation 权限** —`lakeformation:RegisterResource`，`lakeformation:DescribeResource`
+ **Amazon Glue 权限** — `glue:CreateConnection`、`glue:CreateCatalog`、`glue:GetConnection`、`glue:PassConnection`
+ S@@ **ecrets Manager 权限** —`secretsmanager:CreateSecret`，`secretsmanager:GetSecretValue`
+ **IAM 权限** — `iam:CreateRole`、`iam:AttachRolePolicy`、`iam:PassRole`

您必须是 Lake Formation 数据湖管理员或拥有数据目录的`CREATE_CATALOG`权限

## 创建联合目录


### 使用控制台


1. 登录控制台并打开 Lake Formation 控制台，网址为[https://console.aws.amazon.com/lakeformation/](https://console.amazonaws.cn/lakeformation/)。

1. 在右上角的页面部分中选择首选 Amazon 区域。

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

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

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

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

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

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

1. 新的连接配置包括：
   + 连接名称- Amazon Glue 连接对象的唯一名称。
   + 实例 URL-您现有Snowflake账户的终端节点 URL。
   + 身份验证-指定 Amazon Glue 用于连接到远程目录服务器的身份验证配置。 Amazon Glue 同时支持 OAuth2 和自定义身份验证。
   + 令牌 URL-指定远程目录的身份提供商的 URL。
   + OAuth2 客户端 ID-指定与您的远程目录关联的 OAuth2 凭据的客户端 ID。
   + 密钥-使用 Amazon Secrets Manager 或在文本框中输入密码值来存储和使用 OAuth2 客户端密钥。当您在控制台中手动输入密钥时， Amazon Glue 会代表您创建密钥。
   + 令牌 URL 范围-指定身份验证的 OAuth 范围。
   + 目录大小写筛选器-选择是将小写还是大写对象从远程目录带到数据目录。

1. 创建一个 IAM 角色，该角色 Amazon Glue 和 Lake Formation 服务委托人可以使用该角色分别访问远程 Iceberg 表 Amazon Secrets Manager 和 Amazon S3 位置的密钥。在注册下拉列表中选择 IAM 角色。有关 IAM 策略的详细信息，请参阅以下 CLI 部分中的步骤 2 和步骤 3。

1. 选择 “测试连接” 以测试您的连接属性和 IAM 角色访问权限配置是否正确。

1. 选择 “**下一步**” 以查看您的设置。

1. 在查看页面中选择 “**创建目录**”。

### 使用 CLI


1. <a name="snowflake-step-1"></a>**创建密 Amazon Secrets Manager 钥**

   该 Amazon Glue 连接器支持两种身份验证类型-**OAuth2**和**自定义**。使用 opti OAuth2 on 时，使用 Amazon Secrets Manager 来存储Snowflake服务主体的客户端密钥。稍后您将在创建 Amazon Glue 连接时使用此密钥。对于自定义身份验证， Amazon 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`是一个保留关键字， Amazon Glue 用于引用密钥中的客户机密值。在 Lake Formation 控制台中创建密钥时，也要使用相同的关键字。

1. <a name="snowflake-step-2"></a>**创建一个 IAM 角色以向 Amazon Glue 连接对象提供对上一步中创建的密钥的访问权限**

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

   创建 IAM 策略并将其附加到 IAM 角色。将 Amazon 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 位置的读取权限**

   作为数据目录中联合目录的目录所有者，您可以使用 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>**创建 Amazon Glue 连接对象**

   Amazon Glue 连接器支持 OAuth2 和自定义身份验证方法。数据目录连接对象支持允许您将远程目录中的小写或大写对象带到数据目录的`CATALOG_CASING_FILTER`配置。

   以下示例使用 OAuth2 身份验证配置来创建 Amazon 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>**将 Amazon Glue 连接注册为 Lake Formation 资源**

   使用 Amazon Glue 连接对象（在步骤 4 中创建）和 IAM 角色（在步骤 3 中创建），您现在可以将 Amazon 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>**在数据目录中创建联合目录**

   创建 Amazon 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

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