이 글에서는 Python의 Boto3 라이브러리를 사용하여 AWS S3 버킷에서 객체를 삭제하는 방법을 단계별로 살펴봅니다. Boto3는 AWS에서 공식 제공하는 SDK로, 별도의 콘솔 작업 없이 파이썬 코드만으로 S3를 비롯한 다양한 AWS 리소스를 손쉽게 제어할 수 있습니다.
예제 – S3의 Bucket_1/testfolder 경로에서 test.zip 파일 삭제하기
문제 해결 접근 방식 및 알고리즘
1단계 – boto3와 botocore의 예외 클래스(ClientError)를 임포트하여 오류를 처리할 수 있도록 준비합니다.
2단계 – 함수의 매개변수로 S3 파일 경로(s3_files_path)를 받습니다.
3단계 – 전달된 경로가 s3://bucket_name/key 형식의 유효한 AWS S3 경로인지 검증합니다.
4단계 – boto3 라이브러리로 AWS 세션(Session)을 생성합니다.
5단계 – S3를 위한 AWS 리소스(resource) 객체를 생성합니다.
6단계 – S3 경로를 분할하여 루트 버킷 이름과 삭제할 객체 경로를 분리합니다.
7단계 – delete_object 함수에 버킷 이름과 삭제할 키(Key)를 전달하여 객체를 삭제합니다.
8단계 – 반환되는 객체는 파일의 모든 세부 정보를 담은 딕셔너리입니다. 필요하다면 각 파일의 LastModified 값을 가져와 지정한 날짜·시간과 비교할 수 있습니다.
9단계 – 삭제 과정에서 문제가 발생하면 일반 예외를 처리하여 의미 있는 오류 메시지를 발생시킵니다.
S3 객체 삭제 코드 예제
아래 코드를 사용하면 S3에서 객체를 삭제할 수 있습니다.
import boto3
from botocore.exceptions import ClientError
def delete_objects_from_s3(s3_files_path):
if 's3://' not in s3_files_path:
raise Exception('Given path is not a valid s3 path.')
session = boto3.session.Session(profile_name='saml')
s3_resource = session.resource('s3')
s3_tokens = s3_files_path.split('/')
bucket_name = s3_tokens[2]
object_path = ""
filename = s3_tokens[len(s3_tokens) - 1]
print('bucket_name: ' + bucket_name)
if len(s3_tokens) > 4:
for tokn in range(3, len(s3_tokens) - 1):
object_path += s3_tokens[tokn] + "/"
object_path += filename
else:
object_path += filename
print('object: ' + object_path)
try:
result = s3_resource.meta.client.delete_object(Bucket=bucket_name, Key=object_path)
except ClientError as e:
raise Exception("boto3 client error in delete_objects_from_s3 function: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in delete_objects_from_s3 function of s3 helper: " + e.__str__())
# test.zip 삭제
print(delete_objects_from_s3("s3://Bucket_1/testfolder/test.zip"))코드 핵심 포인트
- 경로 검증: 경로에
s3://가 포함되어 있는지 확인해 잘못된 입력을 조기에 차단합니다. - 프로필 기반 인증:
profile_name='saml'옵션으로 AWS 자격 증명 파일(~/.aws/credentials)에 등록된 특정 프로필을 사용합니다. 환경에 맞게 프로필 이름을 변경하세요. - 경로 파싱:
split('/')으로 경로를 나눈 후 인덱스 2의 값이 버킷 이름, 나머지 부분이 객체 키가 됩니다. 중첩된 폴더 구조에서도 키를 올바르게 조립합니다. - 안전한 삭제:
delete_object는 지정한 키의 객체만 삭제하며, 존재하지 않는 키를 삭제해도 오류가 발생하지 않습니다. - 예외 처리:
ClientError로 AWS API 오류를, 일반Exception으로 그 외 예기치 못한 오류를 구분해 처리합니다.
실행 결과
bucket_name: Bucket_1 object: testfolder/test.zip
이처럼 Boto3를 활용하면 몇 줄의 코드로 S3 객체를 안전하게 삭제할 수 있습니다. 여러 객체를 한 번에 삭제해야 하는 경우에는 배치 삭제 API인 delete_objects(요청당 최대 1,000개 키)를 활용하는 것이 효율적입니다.