我得到:

在调用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 ?


当前回答

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

{
            "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>/*"
            ]
        },

其他回答

我在尝试在本地同步整个s3桶时遇到了类似的问题。对我来说,在我的帐户上强制执行MFA(多因素身份验证),这是在通过AWS CLI执行命令时所必需的。

因此,我的解决方案是-使用概要文件(mfa文档)提供mfa凭据,同时使用任何AWS CLI命令。

我得到了相同的错误时使用策略如下,虽然我有“s3:ListBucket”s3:ListObjects操作。

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

然后我通过添加一行来修复它 “攻击: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"
    }
 ]
}

要允许s3桶中的权限,请进入s3桶中的permissions选项卡,并在桶策略中将操作更改为this,这将允许执行所有操作:

"Action":"*"

您必须通过“arn:aws:s3:::bucketname”或“arn:aws:3:: bucketname*”为桶指定Resource。后者是首选,因为它也允许对桶的对象进行操作。注意这里没有斜杠!

列出对象是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*"
        ]
    }
] 
}

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

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

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