

# 排查 DynamoDB Streams 的常见 ABAC 错误
<a name="abac-troubleshooting-streams"></a>

如果您在为 DynamoDB Streams 启用 ABAC 后收到 `AccessDeniedException` 错误或基于标签的条件的行为不符合预期，请使用本主题诊断并解决最常见的原因。

## 策略中服务特定的条件键导致错误
<a name="abac-troubleshooting-streams-service-specific-keys"></a>

服务特定的条件键不被视为有效的条件键。如果您在策略中使用了此类键，则这些键会导致错误。您必须将服务特定的条件键替换为适当的条件键，以便为 DynamoDB Streams 实施 ABAC。

例如，假设您在对流执行 `GetRecords` 请求的策略中使用了 `dynamodb:ResourceTag` 条件键。该请求失败并引发 `AccessDeniedException`。以下示例显示了带有 `dynamodb:ResourceTag` 条件键的错误策略。

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

要修复此问题，请将 `dynamodb:ResourceTag` 条件键替换为 `aws:ResourceTag`，如以下示例所示。

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

## Streams ABAC 已启用，但未评估标签条件
<a name="abac-troubleshooting-streams-not-evaluated"></a>

如果您最近启用了 Streams ABAC，则更改可能尚未传播。更新 Streams ABAC 的状态是一项异步操作。请等待几分钟，然后重试请求。

## 删除父表后无法为流添加标签
<a name="abac-troubleshooting-streams-tag-deleted-table"></a>

删除父表后，流将继续存在 24 小时，然后才会被移除。在这 24 小时时段内，您可以使用 CLI 或 SDK 命令（`tag-resource`、`untag-resource` 和 `list-tags-of-resource`）以及流 ARN 来管理流标签。您无法使用控制台或 CloudFormation 来修改其父表不再存在的流上的标签。

如果您在尝试通过控制台添加标签时收到错误，请改用 CLI：

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

要验证已删除父表的流中的现有标签：

```
aws dynamodb list-tags-of-resource \
  --resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/DeletedTable/stream/2024-01-01T00:00:00.000
```

如果您收到 `ResourceNotFoundException`，则表示 24 小时保留期已过期，该流已不复存在。

## 无法选择退出 Streams ABAC
<a name="abac-troubleshooting-streams-unable-opt-out"></a>

仅当满足以下条件时，才能自行选择退出 Streams ABAC：
+ 您使用的是通过 DynamoDB 控制台选择加入的自助服务方式。
+ 您将在选择加入后的七个日历日内选择退出。

如果通过支持部门为您的账户启用了 Streams ABAC，将无法通过 DynamoDB 控制台选择退出。要选择退出，请联系支持部门。

## 为流添加标签时 CloudFormation 部署失败
<a name="abac-troubleshooting-streams-cfn-tagging"></a>

如果 IAM 角色缺少所需的权限，则使用流来创建或更新表的 CloudFormation 部署可能会失败。具体而言，该角色必须对流资源拥有 `dynamodb:TagResource` 和 `dynamodb:UntagResource` 权限。这同时适用于 `AWS::DynamoDB::Table` 和 `AWS::DynamoDB::GlobalTable` 资源类型，并会影响显式流标签和继承的堆栈级标签。

要解决此问题，请更新您的 CloudFormation 服务角色的 IAM 策略，以包含为流添加标签的权限：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:TagResource",
        "dynamodb:UntagResource"
      ],
      "Resource": [
        "arn:aws:dynamodb:*:*:table/*/stream/*"
      ]
    }
  ]
}
```