

# 将 ABAC 与 DynamoDB Streams 结合使用
<a name="abac-implementation-streams"></a>

以下步骤说明如何使用 ABAC 为 DynamoDB Streams 设置权限。在此示例场景中，您向 DynamoDB 流添加标签，并使用包含基于标签的条件的策略创建一个 IAM 角色。然后，您将通过匹配标签条件来测试 DynamoDB 流支持的权限。

**Topics**
+ [步骤 1：向 DynamoDB 流添加标签](#abac-streams-step-1)
+ [步骤 2：使用包含基于标签的条件的策略创建 IAM 角色](#abac-streams-step-2)
+ [步骤 3：测试支持的权限](#abac-streams-step-3)

## 步骤 1：向 DynamoDB 流添加标签
<a name="abac-streams-step-1"></a>

您可以使用 Amazon CLI 或 SDK 向 DynamoDB Streams 添加标签。以下 `tag-resource` CLI 命令向流添加标签。

```
aws dynamodb tag-resource \
  --resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/MusicTable/stream/2024-01-01T00:00:00.000 \
  --tags Key=environment,Value=staging
```

**注意**  
要查找您的流 ARN，请使用 `describe-table` 命令，然后在响应中查找 `LatestStreamArn` 字段。

## 步骤 2：使用包含基于标签的条件的策略创建 IAM 角色
<a name="abac-streams-step-2"></a>

使用 `aws:ResourceTag/{{tag-key}}` 条件键创建 IAM 策略，以便将在 IAM 策略中指定的标签键值对与附加到流的键值对进行比较。如果流包含标签键值对 `"environment": "staging"`，则以下示例策略可让用户获取记录并描述该流。如果流没有指定的标签键值对，则这些操作将遭到拒绝。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DescribeStream",
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator"
      ],
      "Resource": "arn:aws:dynamodb:*:*:table/*/stream/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/environment": "staging"
        }
      }
    }
  ]
}
```

## 步骤 3：测试支持的权限
<a name="abac-streams-step-3"></a>

1. 将 IAM 策略附加到 Amazon Web Services 账户中的 IAM 用户或角色。确保您使用的 IAM 主体尚未通过其它策略获得对 DynamoDB 流的访问权限。

1. 确保您的 DynamoDB 流包含值为 `"staging"` 的 `"environment"` 标签键。

1. 对带标签的流执行 `dynamodb:DescribeStream` 和 `dynamodb:GetRecords` 操作。如果 `"environment": "staging"` 标签键值对存在，则这些操作会成功。

   如果您对没有 `"environment": "staging"` 标签键值对的流执行这些操作，则请求将失败并引发 `AccessDeniedException`。