우분투 16.04 LTS에서 Python 2.7.12를 사용하고 있습니다. https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-boto-3 링크에서 boto3을 사용하는 방법을 배우고 있습니다 . 리소스, 클라이언트 또는 세션 및 해당 기능을 언제 사용해야하는지 의심의 여지가 있습니다.
우분투 16.04 LTS에서 Python 2.7.12를 사용하고 있습니다. https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-boto-3 링크에서 boto3을 사용하는 방법을 배우고 있습니다 . 리소스, 클라이언트 또는 세션 및 해당 기능을 언제 사용해야하는지 의심의 여지가 있습니다.
답변:
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 ()를 반복적으로 호출하여 paginator 를 사용 하거나 자체 루프를 구현해야합니다.
자원:
다음은 S3 버킷의 객체에 대한 리소스 수준 액세스를 사용하는 동등한 예입니다 (모두).
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
print(obj.key, obj.last_modified)
이 경우 객체를 얻기 위해 두 번째 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')