이 글에서는 AWS 리소스에 저장된 S3 버킷에서 특정 객체의 모든 버전 목록을 조회하는 방법을 알아보겠습니다.
예제 시나리오
S3의 Bucket_1/testfolder 경로에 있는 test.zip 객체의 전체 버전을 나열하는 것이 목표입니다.
문제 정의: Python의 boto3 라이브러리를 사용하여 S3에서 객체의 모든 버전 목록을 가져옵니다.
문제 해결 접근 방식
1단계: 예외 처리를 위해 boto3와 botocore의 예외 클래스를 임포트합니다.
2단계: bucket_name은 필수 파라미터입니다.
3단계: boto3 라이브러리를 사용해 AWS 세션을 생성합니다.
4단계: S3용 AWS 클라이언트를 생성합니다.
5단계: list_object_versions 함수를 호출하여 지정된 버킷 내 객체의 모든 버전을 나열하고, 발생 가능한 예외를 처리합니다.
6단계: 이 함수의 반환값은 딕셔너리 형태이며, 해당 버킷에 있는 객체의 모든 버전 정보를 포함합니다.
7단계: 객체의 전체 버전 목록을 반환합니다.
예제 코드
AWS S3에서 객체의 모든 버전 목록을 가져오려면 다음 코드를 사용하면 됩니다.
import boto3
from botocore.exceptions import ClientError
def list_all_objects_version(bucket_name, prefix_name):
session = boto3.session.Session()
s3_client = session.client('s3')
try:
result = s3_client.list_object_versions(Bucket=bucket_name, Prefix=prefix_name)
except ClientError as e:
raise Exception("boto3 client error in list_all_objects_version function: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in list_all_objects_version function of s3 helper: " + e.__str__())
print(list_all_objects_version("Bucket_1", "testfolder"))
출력 결과
{'ResponseMetadata': {'RequestId': 'H4VAGM3YP6', 'HostId': ***********, 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': ***************, 'x-amz-request-id': 'H4VAGM3YP6', 'date': 'Sat, 03 Apr 2021 08:04:08 GMT', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'IsTruncated': False, 'KeyMarker': '', 'VersionIdMarker': '',
'Versions': [{'ETag': '"705e2e674b04ca71"', 'Size': 1773, 'StorageClass': 'STANDARD', 'Key': 'testfolder/test.zip', 'VersionId': 'null', 'IsLatest': True, 'LastModified': datetime.datetime(2020, 12, 18, 14, 13, 18, tzinfo=tzutc()), 'Owner': {'DisplayName': 'AWS.Development', 'ID': '928*******************************'}}], 'Name': 'Bucket_1', 'Prefix': 'testfolder', 'MaxKeys': 1000, 'EncodingType': 'url'}
결과 분석
출력 결과에서 Versions 키 아래에 객체의 각 버전 정보가 리스트 형태로 담겨 있습니다. 각 항목은 ETag, Size, StorageClass, Key, VersionId, IsLatest, LastModified, Owner 등의 필드를 포함하며, 이를 통해 어떤 버전이 최신인지(IsLatest), 언제 수정되었는지(LastModified) 등 상세 정보를 확인할 수 있습니다.
또한 응답에는 버킷 이름(Name), 조회 접두사(Prefix), 한 번의 요청으로 반환되는 최대 키 개수(MaxKeys) 같은 메타데이터도 함께 포함됩니다. 만약 버전이 매우 많아 IsTruncated 값이 True로 반환된다면, KeyMarker와 VersionIdMarker 값을 다음 요청에 전달하여 나머지 버전을 페이지네이션 방식으로 추가 조회할 수 있습니다.