回答:
ここに、Client、Resource、およびSessionのすべてに関する詳細情報があります。
クライアント:
S3バケットのオブジェクトへのクライアントレベルのアクセスの例を以下に示します(最大1000 **)。
import boto3
client = boto3.client('s3')
response = client.list_objects_v2(Bucket='mybucket')
for content in response['Contents']:
obj_dict = client.get_object(Bucket='mybucket', Key=content['Key'])
print(content['Key'], obj_dict['LastModified'])
** 1000を超える場合、継続マーカーを使用してlist_objects()を繰り返し呼び出し、ページネーターを使用するか、独自のループを実装する必要があります。
資源:
S3バケットのオブジェクト(すべて)にリソースレベルのアクセスを使用する同等の例を次に示します。
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
print(obj.key, obj.last_modified)
この場合、オブジェクトを取得するために2番目のAPI呼び出しを行う必要がないことに注意してください。バケットのコレクションとして利用できます。これらのサブリソースのコレクションは遅延ロードされます。
Resource
コードのバージョンがはるかに単純でコンパクトであり、より多くの機能を備えていることがわかります(ページ付けは自動的に行われます)。Client
ページネーションを含めたい場合、コードのバージョンは実際には上記よりも複雑になります。
セッション:
これらのboto3の概念について詳しく学ぶのに役立つリソースは、re:Inventビデオの紹介です。
s3.set_stream_logger('botocore')
、boto3(botocoreを呼び出す)が内部で行うメタプログラミングのログを確認できます。動作するので、必要はありません。カスタマイズ/プラガビリティのためのイベントシステム全体と、イベントの3(+?)深い分類法があり、要求の準備、応答の解析、依存する呼び出しのチェーンを処理します。パラメータの構築、リクエストの署名、リージョンの検出は注目に値します。ちなみに、修正するのは魔法のような痛みです。簡単な変更を参照してください。
できるだけ簡単に説明します。したがって、実際の用語の正確性は保証されません。
セッションは、AWSサービスへの接続を開始する場所です。たとえば、以下は、デフォルトの認証情報プロファイルを使用するデフォルトのセッションです(例:〜/ .aws / credentials、またはIAMインスタンスプロファイルを使用してEC2を想定)
sqs = boto3.client('sqs')
s3 = boto3.resource('s3')
デフォルトセッションは使用するプロファイルまたはインスタンスプロファイルに制限されるため、カスタムセッションを使用してデフォルトセッション構成(たとえば、region_name、endpoint_urlなど)を上書きする必要がある場合があります。
# custom resource session must use boto3.Session to do the override
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_session.resource('s3')
# you have two choices of create custom client session.
backup_s3c = my_west_session.client('s3')
video_s3c = boto3.client("s3", region_name = 'us-east-1')
リソース:これは、使用が推奨される高水準のサービスクラスです。これにより、特定のAWSリソースを結び付けて渡すことができるため、この抽象化を使用するだけで、どのターゲットサービスがポイントされるかを心配する必要がなくなります。セッション部分からわかるように、カスタムセッションがある場合は、渡すすべてのカスタム領域などについて心配するのではなく、この抽象オブジェクトを渡すだけです。以下は複雑な例です。
import boto3
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_session.resource("s3")
backup_bucket = backup_s3.Bucket('backupbucket')
video_bucket = video_s3.Bucket('videobucket')
# just pass the instantiated bucket object
def list_bucket_contents(bucket):
for object in bucket.objects.all():
print(object.key)
list_bucket_contents(backup_bucket)
list_bucket_contents(video_bucket)
クライアントは低レベルのクラスオブジェクトです。クライアント呼び出しごとに、ターゲットリソースを明示的に指定する必要があります。指定されたサービスターゲット名は、長いパスである必要があります。あなたは抽象化能力を失います。
たとえば、デフォルトのセッションのみを処理する場合、これはboto3.resourceに似ています。
import boto3
s3 = boto3.client('s3')
def list_bucket_contents(bucket_name):
for object in s3.list_objects_v2(Bucket=bucket_name) :
print(object.key)
list_bucket_contents('Mybucket')
ただし、異なるリージョンのバケットからオブジェクトを一覧表示する場合は、クライアントに必要な明示的なバケットパラメータを指定する必要があります。
import boto3
backup_s3 = my_west_session.client('s3',region_name = 'us-west-2')
video_s3 = my_east_session.client('s3',region_name = 'us-east-1')
# you must pass boto3.Session.client and the bucket name
def list_bucket_contents(s3session, bucket_name):
response = s3session.list_objects_v2(Bucket=bucket_name)
if 'Contents' in response:
for obj in response['Contents']:
print(obj['key'])
list_bucket_contents(backup_s3, 'backupbucket')
list_bucket_contents(video_s3 , 'videobucket')