

# 查询注册到 Lake Formation 的数据时的注意事项和限制
<a name="lf-athena-limitations"></a>

使用 Athena 查询在 Lake Formation 中注册的数据时，请考虑以下因素。有关更多信息，请参阅《Amazon Lake Formation 开发人员指南**》中的 [Amazon Lake Formation 的已知问题](https://docs.amazonaws.cn/lake-formation/latest/dg/limitations.html)。

**Topics**
+ [在某些情况下，对列没有数据权限的用户可以看到列元数据](#lf-athena-limitations-column-metadata)
+ [使用 Lake Formation 权限查看视图](#lf-athena-limitations-permissions-to-views)
+ [Iceberg DDL 支持](#lf-athena-limitations-iceberg-ddl-operations)
+ [Lake Formation 精细访问控制和 Athena 工作组](#lf-athena-limitations-fine-grained-access-control)
+ [Amazon S3 中的 Athena 查询结果位置未向 Lake Formation 注册](#lf-athena-limitations-query-results-location)
+ [使用 Athena 工作组限制对查询历史记录的访问](#lf-athena-limitations-use-workgroups-to-limit-access-to-query-history)
+ [无法在 Athena 中查询向 Lake Formation 注册的 CSE-KMS Amazon S3](#lf-athena-limitations-cse-kms)
+ [向 Lake Formation 注册的分区数据位置必须在表子目录中](#lf-athena-limitations-partioned-data-locations)
+ [Create Table As Select (CTAS) 查询需要 Amazon S3 写入权限](#lf-athena-limitations-ctas-queries)
+ [默认数据库需要 DESCRIBE 权限](#lf-athena-limitations-describe-default)

## 在使用 Avro 和自定义 SerDe 的某些情况下，未经授权的用户可以看到列元数据
<a name="lf-athena-limitations-column-metadata"></a>

Lake Formation 列级授权可防止用户访问自己没有 Lake Formation 权限的列中的数据。但是，在某些情况下，用户可以访问描述表中所有列的元数据，包括他们对其中的数据没有权限的列。

当列元数据使用 Avro 存储格式或使用自定义序列化程序/反序列化程序（SerDe）存储在表的表属性中（其中表架构在表属性中与 SerDe 定义一起定义）时，会发生这种情况。在将 Athena 与 Lake Formation 一起使用时，我们建议您查看向 Lake Formation 注册的表属性的内容，并在可能的情况下限制存储在表属性中的信息，以防止任何敏感元数据对用户可见。

## 了解 Lake Formation 和视图
<a name="lf-athena-limitations-permissions-to-views"></a>

对于向 Lake Formation 注册的数据，Athena 用户只有在对 `VIEW` 所基于的表、列和源 Amazon S3 数据位置具有 Lake Formation 权限时，才能创建 `VIEW`。在 Athena 中创建 `VIEW` 后，Lake Formation 权限可以应用于 `VIEW`。列级权限不可用于 `VIEW`。对 `VIEW` 具有 Lake Formation 权限但对视图所基于的表和列没有权限的用户无法使用 `VIEW` 查询数据。但是，具有此权限组合的用户可以使用语句（如 `DESCRIBE VIEW`、`SHOW CREATE VIEW` 和 `SHOW COLUMNS`）查看 `VIEW` 元数据。因此，请确保对于每个 `VIEW` 的 Lake Formation 权限与基础表权限一致。表中定义的单元格筛选条件不适用于该表的 `VIEW`。资源链接名称必须与原始账户中的资源名称相同。在跨账户设置中使用视图时还存在其他限制。有关跨账户设置共享视图的权限的更多信息，请参阅 [配置跨账户数据目录存取](lf-athena-limitations-cross-account.md)。

## Iceberg DDL 支持
<a name="lf-athena-limitations-iceberg-ddl-operations"></a>

Athena 目前不支持在位置注册为 Lake Formation 的 Iceberg 表上进行 DDL 操作。尝试对其中一个 Iceberg 表运行 DDL 查询可能会返回 Amazon S3 访问被拒绝错误，或可能因查询超时而失败。对 Iceberg 表进行 DDL 操作要求用户具有直接访问 Amazon S3 的 Iceberg 表位置的访问。

## Lake Formation 精细访问控制和 Athena 工作组
<a name="lf-athena-limitations-fine-grained-access-control"></a>

同一 Athena 工作组中的用户可以查看由 Lake Formation 精细访问控制配置为可供工作组访问的数据。有关在 Lake Formation 中使用精细访问控制的更多信息，请参阅 *Amazon 大数据博客*中的[使用 Amazon Lake Formation 管理精细访问控制](https://www.amazonaws.cn/blogs/big-data/manage-fine-grained-access-control-using-aws-lake-formation/)。

## Amazon S3 中的 Athena 查询结果位置未向 Lake Formation 注册
<a name="lf-athena-limitations-query-results-location"></a>

Amazon S3 中针对 Athena 的查询结果位置无法向 Lake Formation 注册。Lake Formation 权限不限制对这些位置的访问。除非您限制访问，否则，如果 Athena 用户拥有数据的 Lake Formation 权限，则可以访问查询结果文件和元数据。为避免这种情况，我们建议您使用工作组指定查询结果的位置，并将工作组成员身份与 Lake Formation 权限对齐。然后，您可以使用 IAM 权限策略限制对查询结果位置的访问。有关查询结果的更多信息，请参阅 [使用查询结果和最近查询](querying.md)。

## 使用 Athena 工作组限制对查询历史记录的访问
<a name="lf-athena-limitations-use-workgroups-to-limit-access-to-query-history"></a>

Athena 查询历史记录显示已保存查询和完整查询字符串的列表。除非您使用工作组来分离查询历史记录的访问权限，否则即使 Athena 用户没有获得授权查询 Lake Formation 中的数据，仍可以查看对该数据运行的查询字符串，包括列名、选择条件等。我们建议您使用工作组来分隔查询历史记录，并将 Athena 工作组成员资格与 Lake Formation 权限对齐以限制访问。有关更多信息，请参阅 [使用工作组控制查询访问和成本](workgroups-manage-queries-control-costs.md)。

## 查询注册到 Lake Formation 的 CSE\_KMS 加密表
<a name="lf-athena-limitations-cse-kms"></a>

Athena 无法查询 Apache Iceberg 等具有以下特征的 Open Table Format（OTF）表：
+ 这些表以向 Lake Formation 注册的 Amazon S3 数据位置为基础。
+ 使用客户端加密（CSE）对 Amazon S3 中的对象进行加密。
+ 使用 Amazon KMS 客户托管密钥 (`CSE_KMS`) 进行加密。

要查询使用 `CSE_KMS` 密钥加密的非 OTF 表，请将以下块添加到用于 CSE 加密的 Amazon KMS 密钥策略中。{{<KMS\_KEY\_ARN>}} 是加密数据的 Amazon KMS 密钥的 ARN。{{<IAM-ROLE-ARN>}} 是在 Lake Formation 中注册 Amazon S3 位置的 IAM 角色的 ARN。

```
{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "*"
    },
    "Action": "kms:Decrypt",
    "Resource": "{{<KMS-KEY-ARN>}}",
    "Condition": {
        "ArnLike": {
            "aws:PrincipalArn": "{{<IAM-ROLE-ARN>}}"
        }
    }
}
```

## 向 Lake Formation 注册的分区数据位置必须在表子目录中
<a name="lf-athena-limitations-partioned-data-locations"></a>

向 Lake Formation 注册的分区表必须在作为 Amazon S3 中该表的子目录的目录中具有分区数据。例如，可以向 Lake Formation 注册并使用 Athena 查询具有位置 `s3://amzn-s3-demo-bucket/mytable` 和分区 `s3://amzn-s3-demo-bucket/mytable/dt=2019-07-11`、`s3://amzn-s3-demo-bucket/mytable/dt=2019-07-12` 等的表。另一方面，无法向 Lake Formation 注册具有位置 `s3://amzn-s3-demo-bucket/mytable` 和分区（位于`s3://amzn-s3-demo-bucket/dt=2019-07-11`、`s3://amzn-s3-demo-bucket/dt=2019-07-12` 等等中）的表。因为这样的分区不是 `s3://amzn-s3-demo-bucket/mytable` 的子目录，它们也无法从 Athena 读取。

## Create Table As Select (CTAS) 查询需要 Amazon S3 写入权限
<a name="lf-athena-limitations-ctas-queries"></a>

Create Table As Statements (CTAS) 需要对表的 Amazon S3 位置进行写入访问。要对向 Lake Formation 注册的数据运行 CTAS 查询，Athena 用户除了具有相应的 Lake Formation 权限以读取数据位置以外，还必须具有写入表 Amazon S3 位置的 IAM 权限。有关更多信息，请参阅 [从查询结果创建表（CTAS）](ctas.md)。

## 默认数据库需要 DESCRIBE 权限
<a name="lf-athena-limitations-describe-default"></a>

`default` 数据库需要具有 Lake Formation `DESCRIBE` 权限，以便 Lake Formation 可以查看它。以下示例 Amazon CLI 命令对 Amazon 账户 `111122223333` 中的用户 `datalake_user1` 授予对 `default` 数据库的 `DESCRIBE` 权限。

```
aws lakeformation grant-permissions --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:user/datalake_user1 --permissions "DESCRIBE" --resource '{ "Database": {"Name":"default"}}
```

有关更多信息，请参阅《*Amazon Lake Formation 开发人员指南*》中的 [DESCRIBE](https://docs.amazonaws.cn/lake-formation/latest/dg/lf-permissions-reference.html#perm-describe)。