首页 文章

权限为s3时,对于S3存储桶的ListObjects的AccessDenied:*

提问于
浏览
73

我正进入(状态

调用ListObjects操作时发生错误(AccessDenied):拒绝访问

当我尝试从我的S3存储桶中获取文件夹时 .

使用此命令

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

存储桶的IAM权限如下所示

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

我需要更改才能成功 copyls

6 回答

  • 4

    您已授权对S3存储桶内的对象执行命令,但您未授权对存储桶本身执行任何操作 . 将您的政策修改为以下内容:

    {
    "Version": "version_id",
    "Statement": [
        {
            "Sid": "some_id",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname",
                "arn:aws:s3:::bucketname/*"
            ]
        }
    ] }
    
  • 128

    如果你想使用你提到的命令“aws s3 cp s3:// bucket-name / data / all-data /.-recursive”递归复制所有s3桶对象,这里是执行此操作所需的最小策略:

    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:ListBucket"
              ],
              "Resource": [
                  "arn:aws:s3:::bucket-name"
              ]
          },
          {
              "Effect": "Allow",
              "Action": [
                  "s3:GetObject"
              ],
              "Resource": [
                  "arn:aws:s3:::bucket-name/data/all-data/*"
              ]
          }
      ]
    }
    

    此策略中的第一个语句允许列出存储桶内的对象 . 请注意,使用此设置,您还可以在此存储桶的子目录中列出对象 . 似乎不能仅对s3子目录赋予ls权限,因此尝试将此操作应用于资源“arn:aws:s3 ::: // bucket-name / data / all-data /”won'按预期工作(我已经测试并尝试了多种方法,这里的帮助将不胜感激) .

    此策略中的第二个语句允许在特定子目录中获取存储桶内的对象 . 这意味着您将能够复制“s3:// bucket-name / data / all-data /”路径中的任何内容 . 请注意,这不允许您从父路径复制,例如“s3:// bucket-name / data /” .

    在这里可以找到类似的问题,这使我得到了解决方案 . https://github.com/aws/aws-cli/issues/2408

    希望这有帮助!

  • 15

    您必须通过“arn:aws:3 ::: bucketname”或“arn:aws:3 ::: bucketname *”为存储桶指定资源 . 后者是首选,因为它也允许对铲斗的物体进行操纵 . 注意没有斜线!

    列表对象是Bucket上的操作 . 因此,需要操作“s3:ListBucket” . 将对象添加到Bucket是对Object的操作 . 因此,需要动作“s3:PutObject” . 当然,您可能希望根据需要添加其他操作 .

    {
    "Version": "version_id",
    "Statement": [
        {
            "Sid": "some_id",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname*"
            ]
        }
    ] 
    }
    
  • 9

    我无法访问S3,因为

    • 首先我在实例上配置了密钥访问(然后在启动后无法附加角色)

    • 忘记了几个月

    • 附加角色到实例

    • 试图访问 . 配置的密钥具有比角色更高的优先级,并且访问被拒绝,因为未授予用户必要的S3权限 .

    解决方案: rm -rf .aws/credentials ,然后 aws 使用角色 .

  • 1

    我在使用如下策略时遇到了同样的错误,尽管我对s3:ListObjects操作有“s3:ListBucket” .

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/*",
                "arn:aws:s3:::*-bucket/*"
            ],
            "Effect": "Allow"
        }
      ]
     }
    

    然后我通过添加一行来修复它 "arn:aws:s3:::bucketname"

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectAcl"
            ],
            "Resource": [
                 "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*",
                "arn:aws:s3:::*-bucket/*"
            ],
            "Effect": "Allow"
        }
     ]
    }
    
  • 2

    我当时认为错误是由于"s3:ListObjects"动作但我不得不添加动作 "s3:ListBucket" 以解决问题"AccessDenied for ListObjects for S3 bucket"

相关问题