S3 Bucket操作不适用于任何资源

Phi*_*ide 91 amazon-s3 amazon-web-services

我按照此答案中的说明生成以下S3存储桶策略:

{
  "Id": "Policy1495981680273",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1495981517155",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::surplace-audio",
      "Principal": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我收回了以下错误:

操作不适用于语句中的任何资源

我的政策中缺少什么?

Olu*_*ule 148

来自IAM docs, http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action

某些服务不允许您为单个资源指定操作; 相反,您在Action或NotAction元素中列出的任何操作都适用于该服务中的所有资源.在这些情况下,您在Resource元素中使用通配符*.

有了这些信息,资源应该具有如下值:

"Resource": "arn:aws:s3:::surplace-audio/*"
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用 * ,但它仍然给出该错误。有人可以帮助我吗? (16认同)
  • 无法相信这在桶的政策和/或政策生成器中没有提到! (15认同)
  • 看看吧,5 年后,策略生成器(以及整个 AWS)*仍然*会带来巨大的损失! (2认同)

Luk*_*uke 53

删除s3:ListBucket权限对我来说并不是一个非常好的解决方案,而且可能不适用于其他许多人.

如果您需要s3:ListBucket权限,则需要使用桶的普通arn(不在/*末尾),因为此权限适用于存储桶本身而不是存储桶中的项目.

如下所示,您必须将s3:ListBucket权限作为与存储桶中项目相关的权限的单独语句,如:s3:GetObjects3:PutObject:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"        
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject", 
        "s3:PutObject"
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的解释.谢谢! (7认同)
  • 这对我来说很有效,只是强调了 AWS 在指导用户做基本事情方面仍然需要做很多工作。 (5认同)
  • 该死的贝佐斯,您可能会认为官方 AWS 策略生成器输出的 JSON 会相应地执行此操作。 (2认同)

Vas*_*007 39

错误操作不适用于语句中的任何资源

简单来说,这意味着该行动(您在政策中写道)不适用于该资源.我试图公开我的桶,以便任何人都可以从我的桶中下载.我收到错误,直到我从我的声明中删除("s3:ListBucket").

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket-name/*",
      "Principal": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

因为列表桶不适用于桶内,因此通过删除此操作策略工作正常.


Pet*_*ter 16

要解决此问题,您需要在策略规则中执行什么操作,找到Resource,并将您的arn存储桶添加到数组中,一个在末尾*,第二个*在末尾。这将修复该错误。

{
    "Version": "2012-10-17",
    "Id": "Policy3783783783738",
    "Statement": [
        {
            "Sid": "Stmt1615891730703",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::76367367633:user/magazine-demo-root-user"
            },
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:GetBucketLocation",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload",
                "s3:Get*",
                "s3:Put*"
            ],
            "Resource": [
                "arn:aws:s3:::magazine-demo",
                "arn:aws:s3:::magazine-demo/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是我需要的答案!CloudFront 生成的默认策略仅包含末尾带有 /* 的资源。 (2认同)

Ale*_*nce 11

刚遇到这个问题,并为那些希望在同一策略中使用ListBucket和GetObject的人找到了一个较短的解决方案。

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
          "arn:aws:s3:::bucket-name",
          "arn:aws:s3:::bucket-name/*"
      ],
      "Principal": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,在这种情况下,资源应该是一个数组,并包含这两行......投票。 (4认同)

小智 9

只需对 json 策略资源进行一项更改即可。

"Resource": ["arn:aws:s3:::bucket-name/*"]
Run Code Online (Sandbox Code Playgroud)

注意:在bucket-name后面添加/*

参考文档: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html


小智 6

这很简单,只需在末尾添加“/*”即可。您仅给出了根目录链接,但该操作需要应用于该对象。

输入“资源”:arn:aws:s3:::surplace-audio/*

在此输入图像描述

/*请在S3 ARN后添加


Rav*_*ina 5

我在创建存储桶时也遇到了类似的问题

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我已将上面的代码更改为

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

/*添加 到您的存储桶名称它将解决问题

这里我的存储桶名称是 mrt9949


Yeh*_*ton 5

在我的情况下,此错误的解决方案是尝试删除我正在应用的一些操作。其中一些与此资源无关或无法使用此资源。在这种情况下,它不会让我包括这些:

GetBucketAcl ListBucket ListBucketMultipartUploads