boto3를 사용 예제를 찾아보는데, 어떤 예시는 boto3.client를 사용하고 어떤 예시는 boto3.resource를 사용해서 차이점이 뭔가 싶어서 정리해본 글
Client
- low-level interface
- service description에 의해 만들어짐
- AWS CLI와 boto3의 기초가 되는 라이브러리인 botocore 수준의 client를 공개
- 가끔 botocore의 API를 찾아봐야하는 경우가 있기도 함
- 모든 AWS 서비스 API와 1:1 매핑됨
- 메소드가 스네이크 케이스로 정의되어 있음
- 예시
import boto3
BUCKET_NAME = 'mybucket'
client = boto3.client('s3')
response = client.list_objects(Bucket=BUCKET_NAME)
for content in response['Contents']:
obj_dict = client.get_object(Bucket=BUCKET_NAME, Key=content['Key'])
print(content['Key'], obj_dict['LastModified'])
Resource
- boto3.client를 wrapping한 high-level, 객체지향적 interface
- 높은 수준의 추상화
- resource description에 의해 만들어짐
- Identifiers
- 특정 리소스를 고유하게 식별하는 데 사용되는 고유한 값
- bucket_name과 key가 있음
- Attributes
- 리소스 속성에 액세스. load() 메소드를 통해 로드되므로 처음 액세스 시 느리게 로드 됨
- accept_ranges, metadata, last_modified 등 👉 공식 문서 참고
- Actions
- 리소스에 대한 작업 호출. 식별자와 일부 특성으로부터 인수 전달을 자동으로 처리 가능
- copy(), delete(), get(), download_file(), upload_file() 등 👉 공식 문서 참고
- 자원에 대한 조작 위주 → 직관적, 사용 편리
- AWS 서비스와 상호작용할 때 기본 디테일에 대한 고민이 많이 필요하지 않아 boto3 사용에서 권장됨
- boto3.client의 모든 기능을 wrapping한 것이 아니라서 필요하다면 boto3.client 혹은 boto3.resource.meta.client를 사용해야 함
- 예시
import boto3
BUCKET_NAME = 'mybucket'
s3 = boto3.resource('s3')
bucket = s3.Bucket(BUCKET_NAME)
obj = s3.Object(bucket_name="my_bucket", key="test.py")
response = obj.get()
for obj in bucket.objects.all():
print(obj.key, obj.last_modified)
- 참고 - resource를 사용할 수 있는 AWS API 목록:
- s3
- cloudformation
- cloudwatch
- dynamodb
- ec2
- glacier
- iam
- opsworks
- sns
- sqs