157

AWS の新しいboto3クライアントで「Hello World」を実行しようとしています。

私が持っているユースケースはかなり単純です: S3 からオブジェクトを取得し、それをファイルに保存します。

boto 2.XI では、次のようにします。

import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')

ボト 3 で。同じことを行うクリーンな方法が見つからないため、「ストリーミング」オブジェクトを手動で反復処理しています。

import boto3
key = boto3.resource('s3').Object('fooo', 'docker/my-image.tar.gz').get()
with open('/tmp/my-image.tar.gz', 'w') as f:
    chunk = key['Body'].read(1024*8)
    while chunk:
        f.write(chunk)
        chunk = key['Body'].read(1024*8)

また

import boto3
key = boto3.resource('s3').Object('fooo', 'docker/my-image.tar.gz').get()
with open('/tmp/my-image.tar.gz', 'w') as f:
    for chunk in iter(lambda: key['Body'].read(4096), b''):
        f.write(chunk)

そして、それはうまくいきます。同じタスクを実行する「ネイティブ」な boto3 関数があるのだろうかと思っていました。

4

7 に答える 7

253

最近Boto3に導入されたカスタマイズがあり、これが(特に)これに役立ちます。現在、低レベルの S3 クライアントで公開されており、次のように使用できます。

s3_client = boto3.client('s3')
open('hello.txt').write('Hello, world!')

# Upload the file to S3
s3_client.upload_file('hello.txt', 'MyBucket', 'hello-remote.txt')

# Download the file from S3
s3_client.download_file('MyBucket', 'hello-remote.txt', 'hello2.txt')
print(open('hello2.txt').read())

これらの関数は、ファイルの読み取り/書き込みを自動的に処理し、大きなファイルのマルチパート アップロードを並行して実行します。

s3_client.download_fileディレクトリを作成しないことに注意してください。として作成できますpathlib.Path('/path/to/file.txt').parent.mkdir(parents=True, exist_ok=True)

于 2015-04-14T20:15:44.813 に答える
69

boto3 は、クライアントよりも優れたインターフェイスを備えています。

resource = boto3.resource('s3')
my_bucket = resource.Bucket('MyBucket')
my_bucket.download_file(key, local_filename)

これ自体はclient、受け入れられた回答よりもはるかに優れているわけではありませんが (ドキュメントでは、失敗時にアップロードとダウンロードを再試行する方が良いと書かれています)、リソースは一般的により人間工学的であることを考慮してください (たとえば、s3バケットオブジェクトリソースクライアントメソッドよりも優れています) これにより、ドロップダウンすることなくリソース層にとどまることができます。

Resources通常、クライアントと同じ方法で作成でき、同じ引数のすべてまたはほとんどを取り、それらを内部クライアントに転送するだけです。

于 2016-02-12T16:27:28.090 に答える