

# 用于在同一 AWS 账户中隔离 DynamoDB 环境的 IAM 策略
<a name="iam-policy-separate-environments"></a>

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

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

**注意**  
如果您希望分离生产和测试工作负载以帮助控制事件的潜在“爆炸半径”，最佳实践是创建单独的 AWS 用于测试和生产工作负载。有关更多信息，请参阅 [AWS 账户管理和分离](https://docs.aws.amazon.com//wellarchitected/latest/security-pillar/aws-account-management-and-separation.html)。

进一步假设您有两个开发人员（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`）的默认版本不支持策略变量。

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

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