리소스, 클라이언트 및 세션 간의 boto3의 차이점은 무엇입니까?


답변:


248

Client , ResourceSession 에 대한 자세한 정보는 다음과 같습니다 .

고객:

  • 저수준 AWS 서비스 액세스
  • AWS 서비스 설명 에서 생성
  • botocore 클라이언트를 개발자에게 노출
  • 일반적으로 1 : 1을 AWS 서비스 API와 매핑
  • 모든 AWS 서비스 작업은 클라이언트에서 지원합니다
  • 뱀으로 둘러싸인 메소드 이름 (예 : ListBuckets API => list_buckets 메소드)

다음은 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 를 사용 하거나 자체 루프를 구현해야합니다.

자원:

  • 더 높은 수준의 객체 지향 API
  • 자원 설명 에서 생성
  • 식별자와 속성을 사용
  • 조치 (자원에 대한 조작)가 있습니다
  • 하위 리소스 및 AWS 리소스 모음을 노출합니다.
  • AWS 서비스의 100 % API 범위를 제공하지 않습니다

다음은 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는 필요할 때 기본 세션을 만듭니다.

이러한 boto3 개념에 대해 자세히 알아볼 수있는 유용한 리소스는 소개 re : Invent 비디오 입니다.


2
클라이언트와 리소스간에 성능 차이가 있습니까? sqs 대기열에서 메시지를 삭제하는 것이 클라이언트를 사용하는 것이 더 빠르고 리소스를 사용하는 것이 더 느린이 문제가있었습니다.
Vaulstein

3
@Vaulstein 공유 할 특정 비교가 없지만 일반적으로 클라이언트 인터페이스가 리소스보다 가벼워 런타임에 잠재적으로 더 빠를 것으로 예상합니다 (코드 작성 속도는 느림).
jarmod

@jarmod 학습의 일환으로 두 방법을 모두 사용하여 S3 버킷을 만들려고했습니다. "리소스"에 비해 "클라이언트"를 사용할 때 리소스 생성이 더 빠르게 진행되고 있다고 생각합니다. 맞아? 그렇다면 왜 클라이언트를 통해 리소스 생성이 더 빠릅니까?
Saravanan G

1
@SaravananG 만약 그렇다면 s3.set_stream_logger('botocore')boto3 (botocore를 호출 함)이 실제로 작동하지 않는 메타 프로그래밍 로그를 볼 수 있습니다. 작동하지 않으므로 필요하지 않습니다. 요청 준비, 응답 구문 분석 및 체인 종속 호출을 처리하기 위해 사용자 지정 / 플러그 기능 및 3 (+?) 심도있는 이벤트 분류 체계를위한 전체 이벤트 시스템이 있습니다. 매개 변수 작성, 요청 서명, 영역 감지가 주목할 만합니다. 참고로 수정하는 것은 마법의 고통입니다. 쉬운 변경을 참조하십시오 .
mcint

89

가능한 한 간단하게 설명하겠습니다. 따라서 실제 항의 정확성을 보장하지 않습니다.

세션 은 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') 

미성년자. 키워드가 '객체'가 아닙니까?
Swagatika

'자원'과 '클라이언트'를 동시에 하나의 기능이나 모듈로 사용하지 않아야합니까?
John Overiron

1
@JohnOveriron 모든 AWS 서비스에 "리소스"서비스가있는 것은 아니므로 여전히 낮은 수준의 "클라이언트"가 필요합니다. 배포에 사용하려는 경우 API를 사용하여 배포를 자동화하는 것보다 클라우드 형성 (학습이 어렵지만 장기적으로 시간을 절약 할 수 있음)을 사용하는 것이 좋습니다.
mootmoot

@mootmoot 그러나 클라우드 서비스를 통해 출력을 가져 오거나 스택을 업데이트하는 대신 이러한 API를 통해 AWS 서비스 / 리소스를 쿼리 / 조작 할 수 있습니다. 나 맞아?
SK Venkat

@SKVenkat 지속적인 통합 등을 사용하여 멀티 서버 배포를 시작하기 시작하면 cloudformation / terraform / heat가 boto3 코드를 사용하여 유지 관리하기가 훨씬 쉽습니다.
mootmoot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.