用于在同一 AWS 账户中分隔 DynamoDB 环境的 IAM 策略 - Amazon DynamoDB
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

用于在同一 AWS 账户中分隔 DynamoDB 环境的 IAM 策略

假设您有单独的环境,其中每个环境都维护自己的名为 ProductCatalog 的表版本。 如果您在相同 AWS 账户中创建两个 ProductCatalog 表,则一个环境中的工作可能会影响另一个环境,因为权限的设置方式。例如,在 AWS 账户级别设置并发控制层面操作(如 CreateTable)数量的配额。

因此,一个环境中的每个操作都会减少另一个环境中可用的操作的数量。此外,一个环境中的代码还存在一个风险,即,一个环境中的代码可能会意外访问另一个环境中的表。

注意

如果您想单独生产工作负载和测试工作负载,以帮助控制事件的潜在“爆炸半径”,最佳实践是为测试和生产工作负载创建单独的 AWS 账户。有关更多信息,请参阅 AWS 账户管理和隔离

进一步假设您有两个开发人员(Amit 和 Alice),他们在测试 ProductCatalog 表。不是每个开发人员需要单独的 AWS 账户,开发人员可以共享同一个测试 AWS 账户。在此测试账户中,您可以创建同一个表的副本,以便每个开发人员都可以进行处理,例如 Alice_ProductCatalogAmit_ProductCatalog。 在这种情况下,您可以在为测试环境创建的 AWS 账户中创建 IAM 用户 Alice 和 Amit。然后,您可以向这些用户授予权限,以便对他们拥有的表执行 DynamoDB 操作。

要授予这些 IAM 用户权限,您可以执行以下任一操作:

  • 为每个用户创建一个单独的策略,然后将每个策略单独附加到用户。例如,您可以将以下策略附加到用户 Alice,以允许她访问 DynamoDB 表上的 Alice_ProductCatalog 操作:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllAPIActionsOnAliceTable", "Effect": "Allow", "Action": [ "dynamodb:DeleteItem", "dynamodb:DescribeContributorInsights", "dynamodb:RestoreTableToPointInTime", "dynamodb:ListTagsOfResource", "dynamodb:CreateTableReplica", "dynamodb:UpdateContributorInsights", "dynamodb:CreateBackup", "dynamodb:DeleteTable", "dynamodb:UpdateTableReplicaAutoScaling", "dynamodb:UpdateContinuousBackups", "dynamodb:TagResource", "dynamodb:DescribeTable", "dynamodb:GetItem", "dynamodb:DescribeContinuousBackups", "dynamodb:BatchGetItem", "dynamodb:UpdateTimeToLive", "dynamodb:BatchWriteItem", "dynamodb:ConditionCheckItem", "dynamodb:UntagResource", "dynamodb:PutItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:UpdateItem", "dynamodb:DeleteTableReplica", "dynamodb:DescribeTimeToLive", "dynamodb:RestoreTableFromBackup", "dynamodb:UpdateTable", "dynamodb:DescribeTableReplicaAutoScaling", "dynamodb:GetShardIterator", "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:DescribeLimits", "dynamodb:ListStreams" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Alice_ProductCatalog/*" } ] }

    然后,您可以使用不同的资源(Amit_ProductCatalog 表)为用户挂载创建类似的策略。

  • 您可以使用 IAM 策略变量编写一项策略并将其挂载到某个组,而不是为各个用户挂载策略。在此示例中,您需要创建一个组,并将用户 Alice 和 Amit 添加到该组中。以下示例授予对 ${aws:username}_ProductCatalog 表执行所有 DynamoDB 操作的权限。评估策略时,策略变量 ${aws:username} 将替换为请求者的用户名称。例如,如果 Alice 发送一个添加项目的请求,那么只有当 Alice 向 Alice_ProductCatalog 表中添加项目时才能执行这一操作。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ActionsOnUserSpecificTable", "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_ProductCatalog" }, { "Sid": "AdditionalPrivileges", "Effect": "Allow", "Action": [ "dynamodb:ListTables", "dynamodb:DescribeTable", "dynamodb:DescribeContributorInsights" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/*" } ] }
注意

使用 IAM 策略变量时,您必须在策略中明确指定 2012-10-17IAM 策略语言的 版本。IAM 策略语言的默认版本不支持策略变量。2008-10-17

您不用像平时使用通配符 (*) 将特定表标识为资源,而是可以使用通配符 (*) 来授予对名称以发出请求的 IAM 用户为前缀的所有表的权限,如以下示例所示。

"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"