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

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

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

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

注意

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

进一步假设您有两个开发人员(Bob 和 Alice),他们在对 ProductCatalog 表进行测试。每个开发人员无需单独 AWS 帐户,您的开发人员可以共享同一个测试 AWS 帐户。在此测试账户中,您可以创建同一个表的副本(如 Alice_ProductCatalogAmit_ProductCatalog),以便每个开发人员都可以对其执行操作。在这种情况下,您可以在为测试环境创建的 AWS 账户中创建用户 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}_*"