查询注册到 Lake Formation 的数据时的注意事项和限制
使用 Athena 查询在 Lake Formation 中注册的数据时,请考虑以下因素。有关更多信息,请参阅《AWS Lake Formation 开发人员指南》中的 AWS Lake Formation 的已知问题。
注意事项和限制
- 在某些情况下,对列没有数据权限的用户可以看到列元数据
- 使用 Lake Formation 权限查看视图
- Iceberg DDL 支持
- Lake Formation 精细访问控制和 Athena 工作组
- Amazon S3 中的 Athena 查询结果位置未向 Lake Formation 注册
- 使用 Athena 工作组限制对查询历史记录的访问
- 无法在 Athena 中查询向 Lake Formation 注册的 CSE-KMS Amazon S3
- 向 Lake Formation 注册的分区数据位置必须在表子目录中
- Create Table As Select (CTAS) 查询需要 Amazon S3 写入权限
- 默认数据库需要 DESCRIBE 权限
在使用 Avro 和自定义 SerDe 的某些情况下,未经授权的用户可以看到列元数据
Lake Formation 列级授权可防止用户访问自己没有 Lake Formation 权限的列中的数据。但是,在某些情况下,用户可以访问描述表中所有列的元数据,包括他们对其中的数据没有权限的列。
当列元数据使用 Avro 存储格式或使用自定义序列化程序/反序列化程序(SerDe)存储在表的表属性中(其中表架构在表属性中与 SerDe 定义一起定义)时,会发生这种情况。在将 Athena 与 Lake Formation 一起使用时,我们建议您查看向 Lake Formation 注册的表属性的内容,并在可能的情况下限制存储在表属性中的信息,以防止任何敏感元数据对用户可见。
了解 Lake Formation 和视图
对于向 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
。资源链接名称必须与原始账户中的资源名称相同。在跨账户设置中使用视图时还存在其他限制。有关跨账户设置共享视图的权限的更多信息,请参阅 配置跨账户数据目录存取。
Iceberg DDL 支持
Athena 目前不支持在位置注册为 Lake Formation 的 Iceberg 表上进行 DDL 操作。尝试对其中一个 Iceberg 表运行 DDL 查询可能会返回 Amazon S3 访问被拒绝错误,或可能因查询超时而失败。对 Iceberg 表进行 DDL 操作要求用户具有直接访问 Amazon S3 的 Iceberg 表位置的访问。
Lake Formation 精细访问控制和 Athena 工作组
同一 Athena 工作组中的用户可以查看由 Lake Formation 精细访问控制配置为可供工作组访问的数据。有关在 Lake Formation 中使用精细访问控制的更多信息,请参阅 AWS 大数据博客中的使用 AWS Lake Formation 管理精细访问控制
Amazon S3 中的 Athena 查询结果位置未向 Lake Formation 注册
Amazon S3 中针对 Athena 的查询结果位置无法向 Lake Formation 注册。Lake Formation 权限不限制对这些位置的访问。除非您限制访问权限,否则,如果 Athena 用户拥有数据的 Lake Formation 权限,则可以访问查询结果文件和元数据。为避免这种情况,我们建议您使用工作组指定查询结果的位置,并将工作组成员身份与 Lake Formation 权限对齐。然后,您可以使用 IAM 权限策略限制对查询结果位置的访问。有关查询结果的更多信息,请参阅 使用查询结果和最近查询。
使用 Athena 工作组限制对查询历史记录的访问
Athena 查询历史记录显示已保存查询和完整查询字符串的列表。除非您使用工作组来分离查询历史记录的访问权限,否则即使 Athena 用户没有获得授权查询 Lake Formation 中的数据,仍可以查看对该数据运行的查询字符串,包括列名、选择条件等。我们建议您使用工作组来分隔查询历史记录,并将 Athena 工作组成员资格与 Lake Formation 权限对齐以限制访问。有关更多信息,请参阅 使用工作组控制查询访问和成本。
查询注册到 Lake Formation 的 CSE_KMS 加密表
Athena 无法查询 Apache Iceberg 等具有以下特征的 Open Table Format(OTF)表:
-
这些表以向 Lake Formation 注册的 Amazon S3 数据位置为基础。
-
使用客户端加密(CSE)对 Amazon S3 中的对象进行加密。
-
使用 AWS KMS 客户托管密钥 (
CSE_KMS
) 进行加密。
要查询使用 CSE_KMS
密钥加密的非 OTF 表,请将以下块添加到用于 CSE 加密的 AWS KMS 密钥策略中。<KMS_KEY_ARN>
是加密数据的 AWS 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 注册的分区数据位置必须在表子目录中
向 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 写入权限
Create Table As Statements (CTAS) 需要对表的 Amazon S3 位置进行写入访问。要对向 Lake Formation 注册的数据运行 CTAS 查询,Athena 用户除了具有相应的 Lake Formation 权限以读取数据位置以外,还必须具有写入表 Amazon S3 位置的 IAM 权限。有关更多信息,请参阅 从查询结果创建表(CTAS)。
默认数据库需要 DESCRIBE 权限
default
数据库需要具有 Lake Formation DESCRIBE
权限,以便 Lake Formation 可以查看它。以下示例 AWS CLI 命令对 AWS 账户 111122223333
中的用户 datalake_user1
授予对 default
数据库的 DESCRIBE
权限。
aws lakeformation grant-permissions --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:user/datalake_user1 --permissions "DESCRIBE" --resource '{ "Database": {"Name":"default"}}
有关更多信息,请参阅《AWS Lake Formation 开发人员指南》中的 DESCRIBE。