문제 개요
Python의 Boto3 라이브러리를 활용하면 특정 루트 버킷이 Amazon S3에 실제로 존재하는지 손쉽게 확인할 수 있습니다. 이 글에서는 그 과정을 단계별로 살펴보겠습니다.
예시 – S3에 'bucket_1'이라는 버킷이 존재하는지 여부를 확인합니다.
head_bucket() API란?
S3 버킷의 존재 여부를 확인하는 가장 효율적인 방법은 head_bucket() 함수를 사용하는 것입니다. 이 API는 버킷의 메타데이터 전체를 가져오는 대신 존재 여부와 접근 권한만 빠르게 검사하는 경량 호출이므로, 불필요한 데이터 전송 없이 결과를 얻을 수 있다는 장점이 있습니다.
문제 해결 접근 방식
1단계 – boto3와 botocore.exceptions를 임포트하여 예외 상황을 처리할 수 있도록 준비합니다.
2단계 – boto3 라이브러리를 사용해 AWS 세션(Session)을 생성합니다.
3단계 – S3 서비스를 위한 AWS 클라이언트를 생성합니다.
4단계 – head_bucket() 함수를 호출합니다. 버킷이 존재하고 사용자에게 접근 권한이 있으면 200 OK를 반환하며, 그렇지 않으면 403 Forbidden(권한 없음) 또는 404 Not Found(버킷 없음) 응답을 반환합니다.
5단계 – 반환된 응답 코드에 따라 예외를 적절히 처리합니다.
6단계 – 버킷의 존재 여부에 따라 True 또는 False를 반환합니다.
예제 코드
다음 코드는 해당 루트 버킷이 S3에 존재하는지 확인합니다.
import boto3
from botocore.exceptions import ClientError
# 루트 버킷 존재 여부를 확인하는 함수
def bucket_exists(bucket_name):
try:
session = boto3.session.Session()
# 필요시 사용자 지정 액세스 키, 시크릿 키, 토큰을 전달할 수도 있습니다
s3_client = session.client('s3')
s3_client.head_bucket(Bucket=bucket_name)
print("버킷이 존재합니다.", bucket_name)
exists = True
except ClientError as error:
error_code = int(error.response['Error']['Code'])
if error_code == 403:
print("비공개 버킷입니다. 접근이 거부되었습니다!", bucket_name)
elif error_code == 404:
print("버킷이 존재하지 않습니다!", bucket_name)
exists = False
return exists
print(bucket_exists('bucket_1'))
print(bucket_exists('AWS_bucket_1'))실행 결과
버킷이 존재합니다. bucket_1 True 버킷이 존재하지 않습니다! AWS_bucket_1 False
정리
head_bucket() 함수와 ClientError 예외 처리를 조합하면 버킷의 존재 여부뿐 아니라 접근 권한 상태(403)와 존재하지 않는 경우(404)까지 명확하게 구분할 수 있습니다. 이 패턴은 배포 자동화 스크립트나 리소스 검증 로직에서 널리 활용되므로, 필요에 따라 자신만의 에러 처리 로직을 추가해 확장해 보시기 바랍니다.