我得到:

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


当前回答

我添加了一个与公认答案方向相同的答案,但有小的(重要的)差异,并添加了更多的细节。

考虑下面的配置:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

该策略授予编程式写-删除访问权,并分为两部分: ListBucket操作提供了桶级别的权限,而其他PutObject/DeleteObject操作需要桶内对象的权限。

第一个Resource元素为ListBucket操作指定arn:aws:s3:::< bucket - name >,以便应用程序可以列出桶中的所有对象。

第二个Resource元素为PutObject指定arn:aws:s3:::< bucket - name >/*和DeletObject操作,以便应用程序可以写入或删除桶中的任何对象。

从安全角度考虑,为了指定桶级和对象级细粒度权限,将它们分离为两个不同的“arn”非常重要。

注意,如果我只在第二个块中指定GetObject,那么在编程访问的情况下,我将收到类似这样的错误:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket>调用PutObject操作时发生错误(AccessDenied): AccessDenied。

其他回答

我尝试了以下方法:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

这给了我一个错误:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

使用这种形式是有效的:

aws s3 ls {bucket name}

我也有同样的问题。我必须提供正确的资源和行动,资源是你的桶的arn和行动在你想要的权限。另外,请确保您有正确的用户arn。以下是我的解决方案。

{
    "Version": "2012-10-17",
    "Id": "Policy1546414123454",
    "Statement": [
        {
            "Sid": "Stmt1546414471931",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789101:root"
            },
            "Action": ["s3:ListBucket", "s3:ListBucketVersions"],
            "Resource": "arn:aws:s3:::bucket-name"
        }
    ]
}

我也面临着同样的问题。我刚刚添加了凭据配置:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

进入“~ /。Aws /凭据”+重启终端默认配置文件。

在多配置文件的情况下——profile arg需要添加:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

PROFILE_NAME:

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

关于如何配置凭证和多配置文件的更多信息可以在这里找到

要允许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*"
        ]
    }
] 
}