本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS Glue 基于身份的 (IAM) 访问控制策略示例
本节包含用于向各种 AWS Glue 操作和资源授予权限的 AWS Identity and Access Management (IAM) 策略示例。您可以复制这些示例并在 IAM 控制台中对其进行编辑。然后可将其附加到 IAM 身份,如用户、角色和组。
这些示例都使用 us-west-2
区域。可将此区域替换为您正在使用的任何 AWS 区域。
示例 1:授予对表的只读权限
以下策略授予对数据库 books
中的 db1
表的只读权限。 有关资源 Amazon 资源名称 (ARN) 的更多信息,请参阅数据目录 ARNs。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetTablesActionOnBooks", "Effect": "Allow", "Action": [ "glue:GetTables", "glue:GetTable" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:database/db1", "arn:aws:glue:us-west-2:123456789012:table/db1/books" ] } ] }
此策略授予对名为 books
的数据库中名为 db1
的表的只读权限。 请注意,要授予对表的 Get
权限,还需要对目录和数据库资源的权限。
以下策略授予在数据库 db1
中创建表 tb1
所需的最低权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:CreateTable" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:table/db1/tbl1", "arn:aws:glue:us-west-2:123456789012:database/db1", "arn:aws:glue:us-west-2:123456789012:catalog" ] } ] }
示例 2:按 GetTables 权限筛选表
假定数据库 — 中有三个表customers
、stores
和 store_sales
。—db1
以下策略向 GetTables
和 stores
授予 store_sales
权限,但不向 customers
授予权限。 当您使用此策略调用 GetTables
时,结果仅包含两个授权表(不返回 customers
表)。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetTablesExample", "Effect": "Allow", "Action": [ "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:database/db1", "arn:aws:glue:us-west-2:123456789012:table/db1/store_sales", "arn:aws:glue:us-west-2:123456789012:table/db1/stores" ] } ] }
通过使用 store*
匹配以 store
开头的任何表名称,可简化上面的策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetTablesExample2", "Effect": "Allow", "Action": [ "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:database/db1", "arn:aws:glue:us-west-2:123456789012:table/db1/store*" ] } ] }
同样,使用 /db1/*
匹配 db1
中的所有表,以下策略将授予对 db1
中所有表的 GetTables
访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetTablesReturnAll", "Effect": "Allow", "Action": [ "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:database/db1", "arn:aws:glue:us-west-2:123456789012:table/db1/*" ] } ] }
如果未提供表 ARN,调用 GetTables
将成功,但会返回空列表。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetTablesEmptyResults", "Effect": "Allow", "Action": [ "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:database/db1" ] } ] }
如果策略中缺少数据库 ARN,则调用 GetTables
将失败,并出现 AccessDeniedException
。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetTablesAccessDeny", "Effect": "Allow", "Action": [ "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:table/db1/*" ] } ] }
示例 3:授予对表和所有分区的完整访问权限
以下策略授予对数据库 books
中名为 db1
的表的所有权限。 这包括对表本身、对其存档版本及其所有分区的读取和写入权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "FullAccessOnTable", "Effect": "Allow", "Action": [ "glue:CreateTable", "glue:GetTable", "glue:GetTables", "glue:UpdateTable", "glue:DeleteTable", "glue:BatchDeleteTable", "glue:GetTableVersion", "glue:GetTableVersions", "glue:DeleteTableVersion", "glue:BatchDeleteTableVersion", "glue:CreatePartition", "glue:BatchCreatePartition", "glue:GetPartition", "glue:GetPartitions", "glue:BatchGetPartition", "glue:UpdatePartition", "glue:DeletePartition", "glue:BatchDeletePartition" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:database/db1", "arn:aws:glue:us-west-2:123456789012:table/db1/books" ] } ] }
在实践中,可以简化上述策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "FullAccessOnTable", "Effect": "Allow", "Action": [ "glue:*Table*", "glue:*Partition*" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:database/db1", "arn:aws:glue:us-west-2:123456789012:table/db1/books" ] } ] }
请注意,精细访问控制的最小粒度在表级别。这意味着,您不能向用户授予对表中某些分区的访问权限,而不授予对表中其他分区的访问权限,或授予对表中部分列的访问权限,而不授予对其他列的访问权限。用户要么可以访问表的所有内容,要么不能访问表的任何内容。
示例 4:通过名称前缀和显式拒绝控制访问
在本示例中,假设您的 AWS Glue 数据目录中的数据库和表使用名称前缀来组织。开发阶段中的数据库具有名称前缀 dev-
,生产阶段中的数据库具有名称前缀 prod-
。 您可以使用以下策略向开发人员授予对具有 UDFs 前缀的所有数据库、表、dev-
等的完全访问权限。但是,您会对带有 prod-
前缀的所有内容授予只读访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DevAndProdFullAccess", "Effect": "Allow", "Action": [ "glue:*Database*", "glue:*Table*", "glue:*Partition*", "glue:*UserDefinedFunction*", "glue:*Connection*" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:catalog", "arn:aws:glue:us-west-2:123456789012:database/dev-*", "arn:aws:glue:us-west-2:123456789012:database/prod-*", "arn:aws:glue:us-west-2:123456789012:table/dev-*/*", "arn:aws:glue:us-west-2:123456789012:table/*/dev-*", "arn:aws:glue:us-west-2:123456789012:table/prod-*/*", "arn:aws:glue:us-west-2:123456789012:table/*/prod-*", "arn:aws:glue:us-west-2:123456789012:userDefinedFunction/dev-*/*", "arn:aws:glue:us-west-2:123456789012:userDefinedFunction/*/dev-*", "arn:aws:glue:us-west-2:123456789012:userDefinedFunction/prod-*/*", "arn:aws:glue:us-west-2:123456789012:userDefinedFunction/*/prod-*", "arn:aws:glue:us-west-2:123456789012:connection/dev-*", "arn:aws:glue:us-west-2:123456789012:connection/prod-*" ] }, { "Sid": "ProdWriteDeny", "Effect": "Deny", "Action": [ "glue:*Create*", "glue:*Update*", "glue:*Delete*" ], "Resource": [ "arn:aws:glue:us-west-2:123456789012:database/prod-*", "arn:aws:glue:us-west-2:123456789012:table/prod-*/*", "arn:aws:glue:us-west-2:123456789012:table/*/prod-*", "arn:aws:glue:us-west-2:123456789012:userDefinedFunction/prod-*/*", "arn:aws:glue:us-west-2:123456789012:userDefinedFunction/*/prod-*", "arn:aws:glue:us-west-2:123456789012:connection/prod-*" ] } ] }
上述策略中的第二个语句使用显式 deny
。 您可以使用显式 deny
覆盖已授予委托人的任何 allow
权限。这样,您就可以锁定关键资源的访问权限,并阻止其他策略意外授予这些资源的访问权限。
在上述示例中,尽管第一条语句授予对 prod-
资源的完整访问权限,第二条语句则显式撤消这些资源的写入访问权限,只保留 prod-
资源的读取访问权限。