2013-04-17 112 views
7

我們在Amazon S3上的一個桶中有一棵樹,裏面有大量的文件。我剛剛發現,雖然有些文件有兩個權限條目,如在AWS管理控制檯中單擊某個文件時看到的,然後是屬性 - >權限,一行是「所有人」,另一行是特定用戶,其他文件只有一個該用戶的條目。作爲結果,我們遇到問題使用boto或curl將這些文件下載到Amazon EC2實例。如何以編程方式檢查與boto的Amazon S3權限?

我需要做的是查看存儲桶中的所有文件並檢查它們。我知道如何獲取前綴的完整鍵列表。我可以使用boto爲一個密鑰提取權限嗎?如果這些權限是針對每個人或某人特定的,是否有標準的測試方法?他們是什麼?

而且,一旦我確定如果密鑰具有限制性的權限,以編程方式通過增加讀取權限爲「大家」改變他們?

THX

回答

11

下面是一些Python代碼,使用博託,會去翻所有在桶中的鑰匙。如果該鍵不允許「人人」讀取密鑰的內容,這將增加public-read權限是關鍵:

import boto 

all_users = 'http://acs.amazonaws.com/groups/global/AllUsers' 
conn = boto.connect_s3() 
bucket = conn.get_bucket('mybucket') 

for key in bucket: 
    readable = False 
    acl = key.get_acl() 
    for grant in acl.acl.grants: 
     if grant.permission == 'READ': 
      if grant.uri == all_users: 
       readable = True 
    if not readable: 
     key.make_public() 

此代碼還沒有被徹底的測試,所以你應該首先嚐試的事情了。另外,要清楚的是,這樣做的最終結果是使桶中的所有對象都可以被任何人讀取。同時請記住,該腳本正在獲取存儲桶中每個對象的當前ACL,因此如果有數百萬個對象,那就是數百萬個請求,這可能需要很長時間並且有一些相關的成本。

另一種方法是在存儲區中的每個密鑰上調用make_public(),而不管它是當前的ACL。

+1

我在我的桶中有很多對象,所以我想讓這個過程多線程化。以下是我的代碼,以防其他人發現它有用:http://www.pixelchef.net/working-amazon-s3-using-boto-multithreaded-edition – northben

+0

您是否對boto3有類似的解決方案? –

相關問題