2016-10-10 13 views
0

ファイルをダウンロードすることはできません。また、boto3と表示されているのバケットの一覧を取得することはできません。パブリックS3バケットからboto3のファイルをダウンロードする

次のコードは、公開1と自分自身のバケツで動作しますが、ない:

def s3_list(bucket, s3path_or_prefix): 
    bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'], 
          aws_secret_access_key=settings.AWS['SECRET_ACCESS_KEY'], 
          region_name=settings.AWS['REGION_NAME']) 
    s3 = bsession.resource('s3') 
    my_bucket = s3.Bucket(bucket) 
    items = my_bucket.objects.filter(Prefix=s3path_or_prefix) 
    return [ii.key for ii in items] 

私はこのコードでAccessDeniedエラーを取得します。バケツは自分ではなく、そこにパーミッションを設定することはできませんが、私はそれが一般の読者に公開されていると確信しています。

+0

公共何バケットあなたがこれまでに試してみましたか? – baldr

+1

質問のコードスニペットは正しい資格で私にとってはうまくいきますが、明示的に 'boto3.Session'オブジェクトを作成するのではなく、' s3 = boto3.resource( 's3') 'を直接使うこともできます。 –

+1

私は 's3:// nasanex/MODIS'バケットを使用しようとしました –

答えて

-1

私は過去に同様の問題がありました。私はhttps://github.com/boto/boto3/issues/134でこのバグの鍵を見つけました。

あなたが文書化されていないトリックを使用することができます。

import botocore 


def s3_list(bucket, s3path_or_prefix, public=False): 
    bsession = boto3.Session(aws_access_key_id=settings.AWS['ACCESS_KEY'], 
          aws_secret_access_key=settings.AWS['SECRET_ACCESS_KEY'], 
          region_name=settings.AWS['REGION_NAME']) 
    client = bsession.client('s3') 
    if public: 
     client.meta.events.register('choose-signer.s3.*', botocore.handlers.disable_signing) 
    result = client.list_objects(Bucket=bucket, Delimiter='/', Prefix=s3path_or_prefix) 
    return [obj['Prefix'] for obj in result.get('CommonPrefixes')] 
関連する問題