2016-08-04 139 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

感謝您讓我知道,我會嘗試一些我當前的項目! –