2013-04-17 14 views
7

Amazon S3のバケツには多数のファイルがあります。 AWS Management Consoleでファイルをクリックしたときに表示されるように、いくつかのファイルに2つのアクセス権エントリがあり、1行が「everyone」で、他の一部が特定のユーザーで、他のファイルが1つしかないことが判明しましたそのユーザーのエントリ。その結果、botoやcurlを使用してAmazon EC2インスタンスにこれらのファイルをダウンロードする際に問題が発生しています。プログラムでAmazon S3の権限をbotoで確認するにはどうすればよいですか?

私が行う必要があるのは、バケット内のすべてのファイルを調べて、それらを検査することです。私は接頭辞のキーの完全なリストを取得する方法を知っています。 botoを使用して鍵のパーミッションを抽出することはできますか?そのパーミッションがすべての人か特定の人のためのものであるかどうかをテストする標準的な方法はありますか?

また、キーに制限付きのアクセス許可があるかどうかを判断したら、プログラムで「everyone」に読み取りアクセス許可を追加して変更できますか?ここで

Thxを

答えて

11

は、バケット内のキーのすべてに目を通すだろうと、のboto使用して、いくつかの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をフェッチしているので、何百万ものオブジェクトがある場合、それは時間がかかり、コストがかかります。

もう1つの方法は、現在のACLに関係なく、バケット内のすべてのキーに対してmake_public()を呼び出すことです。

+1

私はバケツに多くのオブジェクトを持っていますので、このプロセスをマルチスレッド化したいと考えました。他に誰かが役に立つと思った場合のためのコードです:http://www.pixelchef.net/working-amazon-s3-using-boto-multithreadedededition – northben

+0

boto3のための同様の解決策はありますか? –

関連する問題