我得到:

在调用ListObjects操作时发生错误(AccessDenied): 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/*"
        ]
    }
] }

我需要改变什么才能成功复制和ls ?


当前回答

我遇到了同样的错误“在调用ListObjectsV2操作时发生了错误(AccessDenied):访问被拒绝”

注意: 桶策略不是一个好的解决方案。 在IAM服务中创建新的自定义策略,附加到各自的用户将更安全。

按以下程序求解:

IAM Service > Policies > Create Policy > select JSON > .使用实例

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:ListBucketVersions"
        ],
        "Resource": [
            "arn:aws:s3:::<bucket name>"
        ]
    },
    {
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:PutObject",
            "s3:DeleteObject",
            "s3:ListBucketMultipartUploads",
            "s3:ListMultipartUploadParts",
            "s3:AbortMultipartUpload",
            "s3:DeleteObjectVersion",
            "s3:GetObjectVersion",
            "s3:PutObjectACL",
            "s3:ListBucketVersions"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*"
        ]
    }
]

}

选择Next Tag > Review Policy输入并创建策略。

选择新创建的策略 在新创建的策略窗口的编辑窗口中选择“Policy Usage”选项卡。 选择“附加”,从列表中选择用户并保存。

现在尝试在控制台用桶名列出对象,没有桶名会抛出相同的错误。

$aws s3 ls

其他回答

我有这个问题 我的要求,我想让用户写入特定的路径

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

这个改变解决了问题

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },

比起之前的答案,我更喜欢这个。它展示了如何使用YAML格式,并允许您使用一个变量来指定bucket。

    - PolicyName: "AllowIncomingBucket"
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Action: "s3:*"
            Resource:
              - !Ref S3BucketArn
              - !Join ["/", [!Ref S3BucketArn, '*']]

我无法访问S3,因为

首先,我在实例上配置了密钥访问(在启动后不可能附加角色) 先把这事忘了几个月 将角色附加到实例 尝试访问。 配置的密钥优先级高于role,由于没有授予用户必要的S3权限,因此拒绝访问。

解决方案:rm -rf .aws/credentials,那么aws使用role。

遇到了类似的问题,对我来说,问题是我在bash_profile中设置了不同的AWS密钥。

我在这里回答了一个类似的问题:https://stackoverflow.com/a/57317494/11871462

如果bash_profile中有冲突的AWS密钥,AWS CLI会默认使用这些密钥。

您已经授予了对S3桶内的对象执行命令的权限,但没有授予对桶本身执行任何操作的权限。

稍微修改一下你的策略会是这样的:

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

然而,这可能会给予超出所需的许可。遵循AWS IAM授予最小特权的最佳实践将看起来像这样:

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