我遵循这个答案的说明来生成以下S3桶策略:

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

我得到以下错误:

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

我的保单中遗漏了什么?


当前回答

转到实例中的Amazon S3。 进入“权限->公共访问”页签。 选择“编辑”,取消勾选“阻止所有公共访问”并保存。 您将在权限选项卡和访问控制列表中看到“公共”标签。

其他回答

参考AWS >文档> AWS身份和访问管理>用户指南 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html

它在注释中明确定义,有些服务不允许您为单个资源指定操作。

在Resource元素中使用通配符*

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

只需在json policy resource中做一个更改。

"Resource": ["arn:aws:s3:::bucket-name/*"]

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

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

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

简单地说,这意味着您在策略中写入的操作不适用于资源。我试图公开我的存储桶,这样任何人都可以从我的存储桶中下载。我得到错误,直到我删除(“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": "*"
    }
  ]
}

因为列表桶不应用于桶内部,因此删除此操作策略可以很好地工作。

您可能有几个策略语句,这个错误是非常普遍的。最好的方法是注释除任何一个以外的所有其他语句(如GetObject,或ListBuckets,或PutObject)并执行代码并查看。如果工作正常,就意味着ARN路径是正确的。否则,ARN应该单独包含桶名或包含/*的桶名。

一些资源(如ListBucket)接受ARN的全名,如“ARN:aws:s3:::bucket_name”,而GetObject或PutObject要求bucket_name后面有一个/*。根据服务更改arn,现在应该可以工作了!

这很简单,只需要在结尾加上“/*”。您只给出了根目录链接,但是需要将操作应用到对象。

类型, “资源”:“在攻击:aws: s3::: surplace-audio / *”