Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Boto3와 AWS 리소스를 활용해 S3에 루트 버킷이 존재하는지 확인하는 방법

문제 개요

Python의 Boto3 라이브러리를 사용하여 특정 루트 버킷이 Amazon S3에 실제로 존재하는지 확인하는 방법을 알아보겠습니다.

예시 – S3에 Bucket_1이라는 버킷이 존재하는지 여부를 판별합니다.

문제 해결 접근 방식 및 알고리즘

1단계 – 예외 처리를 위해 boto3botocore.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()
        # 필요한 경우 사용자 지정 access_key, secret_key, token을 전달할 수도 있습니다
        s3_resource = session.resource('s3')
        s3_resource.meta.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()은 버킷 존재 여부를 확인하는 가장 효율적인 방법 중 하나입니다. 버킷의 전체 객체 목록을 가져오지 않고도 헤더 정보만 요청하므로 비용과 시간이 거의 들지 않습니다. 응답 코드를 해석하는 방식은 다음과 같습니다.

  • 200 OK – 버킷이 존재하며, 현재 자격 증명으로 접근 가능합니다.
  • 403 Forbidden – 버킷은 존재하지만, 접근 권한이 없는 비공개 버킷입니다.
  • 404 Not Found – 해당 이름의 버킷이 S3에 존재하지 않습니다.

또한 원래 코드에서는 예외 발생 시 return existsexcept 블록 내부에 있어, 403/404 이외의 오류가 발생하면 아무 값도 반환되지 않는 잠재적 문제가 있었습니다. 위 코드에서는 return exists를 함수 마지막으로 이동시켜 모든 경로에서 일관된 값을 반환하도록 개선했습니다.