2014-02-27 252 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

謝謝,這是我需要在我的情況。 –