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

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

用于在同一 Amazon 账户中隔离 DynamoDB 环境的 IAM policy

假设您拥有单独的环境,其中每个环境都持有自己的名为 ProductCatalog 的表版本。如果您通过同一个 Amazon 账户创建两个 ProductCatalog 表,由于权限的设置方式,可能影响其他环境。例如,关于并发控制面板操作(例如 CreateTable)数量的配额在 Amazon 账户级别进行设置。

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

注意

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

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

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

  • 为每个用户创建单独的策略,然后分别将每个策略挂载到相应用户。例如,您可以将以下策略挂载到用户 Alice,允许她对 Alice_ProductCatalog 表执行 DynamoDB 操作:

    { "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 表)为用户 Bob 创建类似的策略。

  • 您可以使用 IAM 策略变量编写一项策略并将其挂载到某个组,而不是为各个用户挂载策略。在此示例中,您需要创建一个组,并且将用户 Alice 和用户 Bob 添加到这个组中。以下示例授予对 ${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 策略变量时,您必须在策略中明确指定访问 IAM 策略语言的 2012-10-17 版本。IAM 策略语言(2008-10-17)的默认版本不支持策略变量。

您无需将特定表标识为资源,可以使用通配符 (*) 为所有名称以发出请求的用户名称为前缀的表授予权限,如下所示。

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