문제 상황
Python의 boto3 라이브러리를 사용하여 웨이터(Waiter) 기능으로 특정 S3 버킷이 존재하지 않는지 확인하고자 합니다. 예를 들어, S3에 Bucket_2라는 버킷이 실제로 존재하지 않는지 웨이터를 통해 검증할 수 있습니다.
해결 접근 방식 및 알고리즘
1단계 – boto3와 botocore의 예외 처리 모듈(ClientError)을 임포트하여 예외 상황에 대비합니다.
2단계 – 함수의 매개변수로 bucket_name을 전달받습니다.
3단계 – boto3 라이브러리를 이용해 AWS 세션(Session)을 생성합니다.
4단계 – 생성한 세션으로 S3 서비스용 AWS 클라이언트를 만듭니다.
5단계 – get_waiter 함수를 호출하여 bucket_not_exists 웨이터 객체를 생성합니다.
6단계 – 웨이터 객체의 wait 메서드를 사용해 해당 버킷이 존재하지 않는지 검증합니다. 기본 설정은 5초 간격으로 상태를 확인하며, 성공 상태(즉, 버킷이 S3에 존재하지 않는 상태)에 도달할 때까지 반복합니다. 최대 20회 확인에 실패하면 오류를 반환하지만, 개발자가 직접 폴링 간격(Delay)과 최대 시도 횟수(MaxAttempts)를 지정할 수도 있습니다.
7단계 – 정상 완료 시 아무 값도 반환하지 않으며(None), 결과적으로 None이 출력됩니다.
8단계 – 버킷 확인 과정에서 문제가 발생한 경우 일반 예외(generic exception)를 처리하여 적절한 오류 메시지를 제공합니다.
예제 코드
아래 코드를 사용하면 웨이터를 통해 버킷이 존재하지 않는지 확인할 수 있습니다.
import boto3
from botocore.exceptions import ClientError
def use_waiters_check_bucket_not_exists(bucket_name):
session = boto3.session.Session()
s3_client = session.client('s3')
try:
waiter = s3_client.get_waiter('bucket_not_exists')
waiter.wait(Bucket=bucket_name,
WaiterConfig={
'Delay': 2, 'MaxAttempts': 5})
print('Bucket not exist: ' + bucket_name)
except ClientError as e:
raise Exception( "boto3 client error in use_waiters_check_bucket_not_exists: " + e.__str__())
except Exception as e:
raise Exception( "Unexpected error in use_waiters_check_bucket_not_exists: " + e.__str__())
print(use_waiters_check_bucket_not_exists("Bucket_2"))
print(use_waiters_check_bucket_not_exists("Bucket_1"))실행 결과
Bucket not exist: Bucket_2 None botocore.exceptions.WaiterError: Waiter BucketNotExists failed: Max attempts exceeded "Unexpected error in use_waiters_check_bucket_not_exists: " + e.__str__()) Exception: Unexpected error in use_waiters_check_bucket_not_exists: Waiter BucketNotExists failed: Max attempts exceed
결과 분석
Bucket_2의 경우, 해당 버킷이 실제로 존재하지 않으므로 'Bucket not exist' 메시지가 출력되고, wait 메서드가 아무 값도 반환하지 않아 None이 함께 출력됩니다.
반면 Bucket_1은 실제로 존재하는 버킷이므로, 설정된 최대 시도 횟수(MaxAttempts)만큼 확인을 반복한 후에도 성공 상태에 도달하지 못해 예외(Exception)가 발생합니다.
발생한 예외 메시지에서 'Max attempts exceeded', 즉 최대 시도 횟수를 초과했다는 내용을 확인할 수 있습니다. 이처럼 웨이터 기능을 활용하면 반복적인 수동 확인 코드 없이도 리소스의 상태 변화를 효율적으로 검증할 수 있습니다.