不支持带有“aws:ResourceTag”的 IAM 策略

IAM Policy with `aws:ResourceTag` not supported

我正在尝试创建一个 IAM 策略,让用户可以完全访问 dynamodb,但需要注意的是 tables 必须具有标签 Stage 和值 Dev。基本上您可以创建一个 table,但您应该在其上添加值为 Dev 的标签 Stage。您只能 view/update 等那些具有 Stage=Dev.

标签的 table

AWS 文档提到了一种使用 Global Context Keys 轻松做到这一点的方法:aws:ResourceTag

但是当我使用可视化编辑器时,我无法在上下文键列表中找到该键。如果我手动编辑 JSON 并添加相同的内容,我会收到警告 condition key is not supported

这是我的政策:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "OnlyDynamoDBWithTagValueDev",
        "Effect": "Allow",
        "Action": "dynamodb:*",
        "Resource": "arn:aws:dynamodb:*:accountnumber:table/*",
        "Condition": {
            "StringEquals": {
                "aws:ResourceTag/Stage": "Dev"
            }
        }
    }
]}

我这里可能做错了什么?

我认为你没有做错任何事。 AWS 文档只是不正确且具有误导性。 aws:ResourceTag 不是 here 所述的全局条件键。

Global condition keys are condition keys with an aws: prefix. AWS services can provide service-specific keys that include the service prefix. For example, IAM condition keys include the iam: prefix.

根据文档,任何带有 aws: 前缀的条件都是全局条件。但是,如果您查看其他服务的条件,例如 IOT,您将看到带有 aws: 前缀的服务特定条件,这与文档冲突。

然而,ECR 将 ecr:ResourceTagaws:ResourceTag 条件都列为特定于服务的条件。

另一方面,EC2 只有 ec2:ResourceTag。 RDS 有 rds:db-tag 用于相同的目的。但是,DynamoDb 没有用于此目的的服务特定标签。

简而言之,aws:ResourceTag 不是全局条件键。某些服务使用 aws: 前缀创建特定于服务的标签,即使它们不应该这样做以符合 AWS 命名约定。

我建议您为开发资源创建一个单独的帐户。 如果您不能这样做,您可以尝试更改政策中的逻辑作为解决方法,例如而不是标签条件,在您的策略中应用命名约定,例如任何以 dev_.

开头的 table

DynamoDB 不支持基于标签的授权,因此您尝试执行的操作将不起作用。请参阅 here 以获取支持的服务列表。