프로그래밍 코드에서 웨이터(waiter) 기능을 활용해 S3 버킷 내 특정 키(객체)의 존재 여부를 검증해야 하는 경우가 종종 있습니다. 이 글에서는 Python의 boto3 라이브러리를 사용해 이를 구현하는 방법을 단계별로 살펴봅니다.
문제 정의
Python의 boto3 라이브러리와 웨이터 기능을 사용하여 버킷에 특정 키가 존재하는지 확인하고자 합니다. 예를 들어, Bucket_1 버킷에 test.zip이라는 키가 존재하는지 웨이터로 검사하는 것이 목표입니다.
해결 접근 방식 및 알고리즘
1단계 - boto3와 botocore 예외 클래스를 임포트하여 예외를 처리할 수 있도록 준비합니다.
2단계 - bucket_name(버킷 이름)과 key(키 이름) 두 개를 함수의 매개변수로 받습니다.
3단계 - boto3 라이브러리를 사용해 AWS 세션(Session)을 생성합니다.
4단계 - S3 서비스를 위한 AWS 클라이언트를 생성합니다.
5단계 - get_waiter 함수를 호출하여 'object_exists' 웨이터 객체를 생성합니다.
6단계 - wait 객체를 사용해 해당 버킷에 키가 존재하는지 검증합니다. 기본 설정은 5초 간격으로 확인하며, 최대 20회 시도 후에도 성공 상태에 도달하지 못하면 오류를 반환합니다. 필요에 따라 폴링 간격(Delay)과 최대 시도 횟수(MaxAttempts)를 직접 지정할 수도 있습니다.
7단계 - 키가 존재하면 함수는 아무 값도 반환하지 않습니다(None).
8단계 - 확인 과정에서 문제가 발생한 경우 일반 예외를 처리합니다.
예제 코드
다음 코드를 사용하면 웨이터를 통해 버킷에 키가 존재하는지 확인할 수 있습니다.
import boto3
from botocore.exceptions import ClientError
def use_waiters_check_object_exists(bucket_name, key_name):
session = boto3.session.Session()
s3_client = session.client('s3')
try:
waiter = s3_client.get_waiter('object_exists')
waiter.wait(Bucket=bucket_name, Key=key_name,
WaiterConfig={
'Delay': 2, 'MaxAttempts': 5})
print('Object exists: ' + bucket_name + '/' + key_name)
except ClientError as e:
raise Exception("boto3 client error in use_waiters_check_object_exists: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in use_waiters_check_object_exists: " + e.__str__())
print(use_waiters_check_object_exists("Bucket_1", "testfolder/test.zip"))
print(use_waiters_check_object_exists("Bucket_1", "testfolder/test1.zip"))
실행 결과
Object exists: Bucket_1/testfolder/test.zip None botocore.exceptions.WaiterError: Waiter ObjectExists failed: Max attempts exceeded Exception: Unexpected error in use_waiters_check_object_exists: Waiter ObjectExists failed: Max attempts exceed
결과 분석
Bucket_1/testfolder/test.zip의 경우 객체가 존재한다는 print 문이 출력되며, 함수가 별도의 값을 반환하지 않으므로 None이 함께 출력됩니다.
반면 Bucket_1/testfolder/test1.zip은 실제로 존재하지 않는 객체이므로 예외가 발생합니다.
예외 메시지에서 "Max attempts exceeded"(최대 시도 횟수 초과)라는 내용을 확인할 수 있는데, 이는 지정된 횟수만큼 반복해서 확인했음에도 해당 객체가 나타나지 않았다는 의미입니다.