2016-08-04 107 views
31

当我尝试从S3存储桶获取文件夹时,我得到An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied。使用权限为s3时针对S3存储桶的ListObjects的AccessDenied:*

此命令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成功?

回答

61

您已授予对S3存储桶内的对象执行命令的权限,但您尚未授予对存储桶本身执行任何操作的权限。修改你的政策是以下几点:

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

这是一个太宽的动作列表。对于列表和版权,您建议采取何种行动。 –

+1

@domfarr我只是尽最大可能调整OP政策,使其为他工作。如果你有一个具体的问题,你应该把它作为一个单独的问题发布在这个网站上,而不是用评论标记到这个问题上。尽管查看S3操作列表并构建所需的策略应该很容易。 –

+1

我没有标记。 OP确实要求复制和ls需要什么。包括缺乏存储桶级别的arn,但您没有调整Actions ...因此我的评论。 –

1

我无法访问S3,因为

  • 首先我配置的实例密钥访问(这是不可能推出后附的角色则)
  • 忘了几个月
  • 附加角色实例
  • 试图访问。 配置的密钥的优先级高于角色,并且访问被拒绝,因为用户未被授予必要的S3权限。

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

+0

完全相同的问题。这种情况的一个症状是一个用户可以访问另一个用户不能在同一个EC2节点上的东西。 –

4

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

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

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

'arn:aws:s3 ::: bucketname *'的问题在于它也允许访问'arn:aws:s3 ::: bucketname-with-suffix' – Guss

0

虽然我有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" 
    } 
    ] 
} 

然后我固定它通过添加一行 “阿尔恩: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" 
    } 
] 
} 
3

如果你想复制递归所有S3存储对象使用命令“ AWS S3 CP S3://桶名称/数据/所有数据/ --recursive”正如你所说,这里是这样做所需的最低政策:

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

冷杉本策略中的st语句允许列出存储桶中的对象。请注意,使用此设置,您还可以列出此存储桶的子目录中的对象。它似乎不可能只允许s3子目录的权限,所以试图将这个动作应用到资源“arn:aws:s3 ::: // bucket-name/data/all-data /”赢得了'吨按预期工作(我已经测试并尝试了多种方式来做到这一点,这里的帮助将不胜感激)。

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

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

希望得到这个帮助!

+0

实际上,你似乎可以*限制' ListBucket'到子项:https://stackoverflow.com/a/35952877/89218 – paleozogt

+0

感谢您让我知道,我会尝试一些我当前的项目! –