

# 同じ AWS アカウントで DynamoDB 環境を分離する IAM ポリシー
<a name="iam-policy-separate-environments"></a>

たとえば、各環境で、`ProductCatalog` という名前のテーブルを独自のバージョンで維持するとします。2 つの `ProductCatalog` テーブルを同じ AWS アカウントから作成する場合、許可の設定方法により、片方の環境での動作が他の環境に影響を与える可能性があります。例えば、同時制御プレーンオペレーション (`CreateTable` など) の数に対するクォータは AWS アカウントレベルで設定されます。

その結果、1 つの環境内の各アクションによって、もう一方の環境で利用可能なオペレーションの数が減少します。また、片方の環境内のコードが他の環境内のテーブルに偶然にアクセスしてしまう危険性もあります。

**注記**  
本番ワークロードとテストワークロードを分離して、イベントの潜在的な「爆発半径」を制御する場合、ベストプラクティスは、テストワークロードと本番ワークロード用に別々の AWS アカウントを作成することです。詳細については、[AWS アカウントの管理および分離](https://docs.aws.amazon.com//wellarchitected/latest/security-pillar/aws-account-management-and-separation.html)を参照してください。

さらに、Amit と Alice という 2 人のデベロッパーが `ProductCatalog` テーブルをテストしているとします。デベロッパーごとに別々の AWS アカウントを作成する代わりに、デベロッパー間で同じテスト AWS アカウントを共有することができます。このテスト用アカウントでは、`Alice_ProductCatalog` や `Amit_ProductCatalog` など、対象のデベロッパーごとに、同じテーブルのコピーを作成できます。この場合、テスト環境用に作成した AWS アカウント内で、ユーザーの Alice と Amit を作成できます。次に、所有するテーブルに対して 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 に対して、同様のポリシーを異なるリソース (`Amit_ProductCatalog` テーブル) で作成できます。
+ 個々のユーザーにポリシーを付与する代わりに、IAM ポリシー変数を使用して単一のポリシーを記述し、グループに付与することができます。この例では、グループを作成し、そのグループにユーザー Alice とユーザー Amit の両者を追加する必要があります。次の例では、`${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}_*"
```