

# 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"
                }
            }
        }
    ]
}
```

------

用户可以在 `table-name` 参数中指定表 ARN 来访问账户 *123456789012* 中的表 *MusicCollection*，以此发出 `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 资源。在 `Condition` 语句中指定这些 IP 地址。

以下示例允许用户 *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"
          ]
        }
      }
    }
  ]
}
```

------

您也可以拒绝对 DynamoDB 资源的所有访问，除非源是特定 VPC 端点，例如 *vpce-1a2b3c4d*。

**重要**  
在仅 IPv6 的环境中，当您将 DAX 与具有基于 IP 的资源策略的 DynamoDB 表配合使用时，必须配置额外的访问规则。如果您的资源策略将对表的访问权限限制为 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/*"
      ]
    }
  ]
}
```

------