排查 DynamoDB Streams 的常见 ABAC 错误
如果您在为 DynamoDB Streams 启用 ABAC 后收到 AccessDeniedException 错误或基于标签的条件的行为不符合预期,请使用本主题诊断并解决最常见的原因。
服务特定的条件键不被视为有效的条件键。如果您在策略中使用了此类键,则这些键会导致错误。您必须将服务特定的条件键替换为适当的条件键,以便为 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,则更改可能尚未传播。更新 Streams ABAC 的状态是一项异步操作。请等待几分钟,然后重试请求。
删除父表后,流将继续存在 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:
-
您使用的是通过 DynamoDB 控制台选择加入的自助服务方式。
-
您将在选择加入后的七个日历日内选择退出。
如果通过支持部门为您的账户启用了 Streams ABAC,将无法通过 DynamoDB 控制台选择退出。要选择退出,请联系支持部门。
如果 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/*" ] } ] }