用于在同一 AWS 账户中隔离 DynamoDB 环境的 IAM 策略
假设您拥有单独的环境,其中每个环境都持有自己的名为 ProductCatalog
的表版本。如果您通过同一个 AWS 账户创建两个 ProductCatalog
表,由于权限的设置方式,可能影响其他环境。例如,关于并发控制面板操作(例如 CreateTable
)数量的配额在 AWS 账户级别进行设置。
因此,一个环境中的每个操作都会减少另一个环境中可执行的操作数量。同时,一个环境中的代码还存在意外访问另一个环境中的表的风险。
如果您希望分离生产和测试工作负载以帮助控制事件的潜在“爆炸半径”,最佳实践是创建单独的 AWS 用于测试和生产工作负载。有关更多信息,请参阅 AWS 账户管理和分离。
进一步假设您有两个开发人员(Bob 和 Alice),他们在对 ProductCatalog
表进行测试。每个开发人员无需单独 AWS 账户,您的开发人员可以共享同一个测试 AWS 账户。在此测试账户中,您可以创建同一个表的副本(如 Alice_ProductCatalog
和 Amit_ProductCatalog
),以便每个开发人员都可以对其执行操作。在这种情况下,您可以在为测试环境创建的 AWS 账户中创建用户 Alice 和 Bob。然后,您可以授予这些用户对其拥有的表执行 DynamoDB 操作的权限。
要向这些 IAM 用户授予权限,您可以执行以下任一操作:
-
为每个用户创建单独的策略,然后分别将每个策略挂载到相应用户。例如,您可以将以下策略挂载到用户 Alice,允许她对 Alice_ProductCatalog
表执行 DynamoDB 操作:
- JSON
-
-
{
"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
表中添加项目时才能执行这一操作。
- JSON
-
-
{
"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}_*"