2014-02-27 254 views
14

我想让自己有权下载S3桶中的现有文件。我已经修改了桶政策,如下:AWS S3桶权限 - 访问被拒绝

 { 
     "Sid": "someSID", 
     "Action": "s3:*", 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::bucketname/AWSLogs/123123123123/*", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::123123123123:user/myuid" 
      ] 
     } 
    } 

我的理解是,除了政策应该给我充分的权利“bucketname”我的帐户“myuid”,包括那些已在所有文件桶。但是,当我尝试通过控制台中的链接下载任何文件时,我仍然遇到Access Denied错误。

有什么想法?

+0

你说,这给了充分的权利桶,但你的资源包括前缀。你在这个前缀中下载的所有文件是?另外,你如何下载它们?从控制台,一个应用程序,一个SDK? –

回答

6

更改资源arn:aws:s3:::bucketname/AWSLogs/123123123123/*arn:aws:s3:::bucketname/*有充分的权利bucketname

11

David,你是正确的,但我发现,除了什么bennie下面说的,你还必须授予视图(或任何你想要的访问)到'认证用户'。 enter image description here

但是一个更好的解决方案可能是编辑的用户的政策是只授予访问斗:

{ 
    "Statement": [ 
    { 
     "Sid": "Stmt1350703615347", 
     "Action": [ 
     "s3:*" 
     ], 
     "Effect": "Allow", 
     "Resource": [ 
     "arn:aws:s3:::mybucket/*" 
     ] 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:ListBucket" 
     ], 
     "Resource": ["arn:aws:s3:::mybucket"], 
     "Condition": {} 
    } 
    ] 
} 

第一座授予所有S3权限桶中的所有元素。第二块授予桶本身的权限。

+0

授予对“经过身份验证的用户”的访问字面意思是任何经过身份验证的aws用户,即使是与您自己的帐户没有关联的用户也是如此......因此它将授予用户访问存储桶的权限取消。 – Salami

+0

我知道它做了什么,我同意这看起来很奇怪,但在当时,它是必需的*以使其工作。 –

+1

另一种方法是将策略附加到特定的IAM用户 - 在IAM控制台中,选择一个用户,选择**权限**选项卡,单击**附加策略**,然后选择一个策略,如“AmazonS3FullAccess '。出于某种原因,仅仅说一个存储桶授予用户访问权限是不够的 - 您还必须说用户有权访问S3服务。 – sameers

1

澄清:它确实没有很好的记录,但你需要两个访问语句。

除了您的允许操作资源“arn:aws:s3 ::: bucketname/AWSLogs/123123123123/*”的语句外,还需要第二个语句,它允许ListBucket“arn:aws:s3 :: :bucketname“,因为在内部,Aws客户端将尝试列出存储桶以确定它在执行操作之前是否存在。

随着第二条语句,它应该看起来像:

"Statement": [ 
    { 
     "Sid": "someSID", 
     "Action": "ActionThatYouMeantToAllow", 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::bucketname/AWSLogs/123123123123/*", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::123123123123:user/myuid" 
      ] 
    }, 
    { 
     "Sid": "someOtherSID", 
     "Action": "ListBucket", 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::bucketname", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::123123123123:user/myuid" 
      ] 
    } 
] 

注:如果您使用IAM,跳过“校长”的一部分。

2

使用下面的方法在Android中使用TransferUtility上传任何公共可读形式的文件。

transferUtility.upload(String bucketName, String key, File file, CannedAccessControlList cannedAcl) 

transferUtility.upload("MY_BUCKET_NAME", "FileName", your_file, CannedAccessControlList.PublicRead); 
+0

谢谢,这是我需要在我的情况。 –