2012-07-13 55 views
3

我現在有有像這樣一個政策的IAM角色:使用boto庫,我可以避免在S3中的基礎存儲桶上授予列表權限嗎?

{ 
    "Version":"2008-10-17", 
    "Statement": [ 
    { 
    "Effect":"Allow", 
    "Action":["s3:ListBucket"], 
    "Resource":[ 
     "arn:aws:s3:::blah.example.com" 
    ] 
    }, 
    { 
    "Effect":"Allow", 
    "Action":["s3:GetObject", "s3:GetObjectAcl", "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl", "s3:DeleteObject"], 
    "Resource":[ 
     "arn:aws:s3:::blah.example.com/prefix/" 
    ] 
    } 
    ] 
} 

寶途似乎需要ListBucket允許存在的水桶做get_bucket呼叫的根源。如果我刪除了Statement數組中的第一個散列,get_bucket('blah.example.com')將失敗。這裏的錯誤文本:

 
*** S3ResponseError: S3ResponseError: 403 Forbidden 
<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>xxxx</RequestId><HostId>yyyy</HostId></Error> 

有什麼辦法,同時仍然使用博託限制桶的上市在一定前綴(例如「前綴/」)?

UPDATE

爲了使一切工作正常,我用了以下政策:

{ 
    "Version":"2008-10-17", 
    "Statement": [ 
    { 
    "Effect":"Allow", 
    "Action":["s3:ListBucket"], 
    "Resource":[ 
     "arn:aws:s3:::blah.example.com" 
    ], 
    "Condition":{ 
     "StringLike":{ 
     "s3:prefix":"prefix/*" 
     } 
    } 
    }, 
    { 
    "Effect":"Allow", 
    "Action":["s3:GetObject", "s3:GetObjectAcl", "s3:PutObject", "s3:PutObjectAcl", "s3:DeleteObject"], 
    "Resource":[ 
     "arn:aws:s3:::blah.example.com/prefix/*" 
    ] 
    } 
    ] 
} 

你仍然必須使用validate=False參數的get_bucket方法,但它允許內上市字首。

回答

5

默認情況下boto會嘗試通過對存儲桶執行LIST操作來驗證存儲桶的存在性,以請求零結果。如果您希望跳過此驗證步驟,請將其稱爲:

>>> import boto 
>>> s3 = boto.connect_s3() 
>>> bucket = s3.get_bucket('mybucket', validate=False) 

這應該跳過LIST操作。

+0

不幸的是,列表(prefix ='prefix /')似乎仍然失敗。 – 2012-07-13 21:53:06

+0

我明白了。這實際上是一個S3權限問題,而不是一個博託問題。那麼,把它稱爲一個問題也許是不公平的。這只是它的工作方式。我認爲沒有辦法解決這個問題,但我會再調查一下,如果發現任何問題,請回復。 – garnaat 2012-07-13 22:28:37

+0

我找到了。第二個權限的資源需要是「arn:aws:s3 ::: blah.example.com/prefix/*」。不同之處在於*末尾。謝謝您的幫助。 – 2012-07-13 23:00:14

相關問題