

# DynamoDB リソースベースのポリシーの例
<a name="rbac-examples"></a>

リソースベースのポリシーの `Resource` フィールドで ARN を指定した場合は、その ARN がアタッチ先の DynamoDB リソースの ARN と一致する場合にのみ、ポリシーが有効になります。

**注記**  
*イタリック体*のテキストを、リソース固有の情報に必ず置き換えてください。

## テーブルのリソースベースのポリシー
<a name="rbac-examples-get"></a>

次のリソースベースのポリシーは、*MusicCollection* という名前の DynamoDB テーブルにアタッチされています。IAM ユーザーの *John* と *Jane* に対して、*MusicCollection* リソースで [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) アクションと [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html) アクションを実行するアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
        "Effect": "Allow",
        "Principal": {
          "AWS": [
            "arn:aws:iam::111122223333:user/username",
            "arn:aws:iam::111122223333:user/Jane"
          ]
        },
        "Action": [
          "dynamodb:GetItem",
          "dynamodb:BatchGetItem"
        ],
        "Resource": [
          "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
        ]
    }
  ]
}
```

------

## ストリームのリソースベースのポリシー
<a name="rbac-examples-streams"></a>

次のリソースベースのポリシーは、`2024-02-12T18:57:26.492` という名前の DynamoDB ストリームにアタッチされています。IAM ユーザーの *John* と *Jane* に対して、`2024-02-12T18:57:26.492` リソースで [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)、[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html)、[DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) の API アクションを実行するアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/username",
          "arn:aws:iam::111122223333:user/Jane"
        ]
      },
      "Action": [
        "dynamodb:DescribeStream",
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492"
      ]
    }
  ]
}
```

------

## 指定されたリソースに対するあらゆるアクションの実行権限を付与するリソースベースのポリシー
<a name="rbac-examples-wildcard"></a>

テーブルと、テーブルに関連付けられたすべてのインデックスに対するすべてのアクションの実行をユーザーに許可する場合は、ワイルドカード (\$1) を使用して、テーブルに関連するアクションとリソースを表すことができます。リソースにワイルドカード文字を使用した場合、該当する DynamoDB テーブルとそのすべての関連インデックス (未作成のものも含む) へのアクセスがユーザーに許可されます。例えば、次のポリシーは、ユーザー *John* に対して、*MusicCollection* テーブルとそのすべてのインデックス (今後作成されるインデックスを含む) に対するあらゆるアクションの実行権限を付与します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/role-name"
      },
      "Action": "dynamodb:*",
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/index/index-name"
      ]
    }
  ]
}
```

------

## クロスアカウントアクセスのリソースベースのポリシー
<a name="rbac-examples-cross-account"></a>

クロスアカウントの IAM アイデンティティに対して、DynamoDB リソースへのアクセス権限を指定できます。例えば、信頼できるアカウントのユーザーが、特定の項目とその項目内の特定の属性のみにアクセスするという条件で、テーブルの内容の読み取り権限を取得できるようにする場合が考えられます。次のポリシーでは、信頼できる AWS アカウント ID *111111111111* のユーザー *John* に対して、[GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API を使用してアカウント *123456789012* のテーブルのデータにアクセスすることを許可します。このポリシーでは、プライマリキーが *Jane* の項目のみに該当ユーザーがアクセスして、属性 `Artist` と `SongTitle` のみを取得可能であり、その他の属性は取得できないようになっています。

**重要**  
`SPECIFIC_ATTRIBUTES` 条件を指定しない場合は、返された項目のすべての属性が表示されます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CrossAccountTablePolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:user/John"
            },
            "Action": "dynamodb:GetItem",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": "Jane",
                    "dynamodb:Attributes": [
                        "Artist",
                        "SongTitle"
                    ]
                },
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}
```

------

前述のリソースベースのポリシーに加えて、クロスアカウントアクセスを実現するためには、ユーザー *John* にアタッチしたアイデンティティベースのポリシーでも `GetItem` API アクションを許可する必要があります。以下は、ユーザー *John* にアタッチする必要があるアイデンティティベースのポリシーの例です。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CrossAccountIdentityBasedPolicy",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": "Jane",
                    "dynamodb:Attributes": [
                        "Artist",
                        "SongTitle"
                    ]
                },
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}
```

------

ユーザー John は、アカウント *123456789012* のテーブル *MusicCollection* にアクセスするため、`table-name` パラメータにテーブル ARN を指定して `GetItem` リクエストを行うことができます。

```
aws dynamodb get-item \
    --table-name arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --key '{"Artist": {"S": "Jane"}' \
    --projection-expression 'Artist, SongTitle' \
    --return-consumed-capacity TOTAL
```

## IP アドレス条件を指定したリソースベースのポリシー
<a name="rbac-examples-conditions"></a>

条件を適用して、発信元の IP アドレス、仮想プライベートクラウド (VPC)、VPC エンドポイント (VPCE) を制限できます。リクエストの発信元のアドレスに基づいてアクセス許可を指定できます。例えば、特定の IP ソース (企業の VPN エンドポイントなど) がアクセス元である場合に限り、ユーザーに DynamoDB リソースへのアクセスを許可したい場合が考えられます。これらの IP アドレスを `Condition` ステートメントに指定します。

次の例では、ユーザー *John* に対して、発信元 IP が `54.240.143.0/24` および `2001:DB8:1234:5678::/64` である場合に任意の DynamoDB リソースへのアクセスを許可します。

------
#### [ JSON ]

****  

```
{
  "Id":"PolicyId2",
  "Version":"2012-10-17",		 	 	 
  "Statement":[
    {
      "Sid":"AllowIPmix",
      "Effect":"Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:user/username"
      },
      "Action":"dynamodb:*",
      "Resource":"*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "54.240.143.0/24",
            "2001:DB8:1234:5678::/64"
          ]
        }
      }
    }
  ]
}
```

------

また、発信元が特定の VPC エンドポイント (*vpce-1a2b3c4d* など) 以外である場合に、DynamoDB リソースへのアクセスを一切拒否することもできます。

**重要**  
IPv6 専用の環境で IP ベースのリソースポリシーを持つ DynamoDB テーブルで DAX を使用する場合は、追加のアクセスルールを設定する必要があります。リソースポリシーがテーブルの IPv4 アドレス空間 `0.0.0.0/0` へのアクセスを制限する場合は、DAX クラスターに関連付けられた IAM ロールのアクセスを許可する必要があります。ポリシーに `ArnNotEquals` 条件を追加して、DAX が DynamoDB テーブルへのアクセスを維持できるようにします。詳細については、「[DAX と IPv6](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.create-cluster.DAX_and_IPV6.html)」を参照してください。

------
#### [ JSON ]

****  

```
{
  "Id":"PolicyId",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AccessToSpecificVPCEOnly",
      "Principal": "*",
      "Action": "dynamodb:*",
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "StringNotEquals":{
          "aws:sourceVpce":"vpce-1a2b3c4d"
        }
      }
    }
  ]
}
```

------

## IAM ロールを使用するリソースベースのポリシー
<a name="rbac-examples-iam"></a>

リソースベースのポリシーで IAM サービスロールを指定することもできます。このロールを引き受ける IAM エンティティは、そのロールに指定されているアクションのみを、リソースベースのポリシーで指定されているリソースセットに限定して実行できます。

次の例では、IAM エンティティが *MusicCollection* と *MusicCollection* の DynamoDB リソースですべての DynamoDB アクションを実行することを許可しています。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/role-name" },
      "Action": "dynamodb:*",
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/*"
      ]
    }
  ]
}
```

------