[AWS s3] Python Boto3의 list_objects_v2를 활용한 s3 데이터 불러오기
오늘은 AWS S3에서 python으로 데이터를 로딩하는 방법을 작성해보고자 한다.
그러기 위해서는 필수적으로 필요한 boto3라는 라이브러리를 설치해주어야 한다.
boto3 라이브러리는 AWS SDK for python으로, AWS 서비스들과 상호작용할 수 있게 해주는 라이브러리다.
설치되어 있지 않다면! 일단 boto3 라이브러리가 필요함으로 pip install을 통해서 해당 라이브러리를 다운로드하여준다.
(전부 설치되어 있다는 가정하에 넘어가겠습니다)
1. Client 설정
본격적으로 데이터 로딩을 위해서 기본적인 세팅을 먼저 진행해야 한다.
그 기본적인 세팅이란 AWS s3에 접근하기 위해서는 boto3 클라이언트를 설정을 의미한다. 다시 말해서 AWS 서비스를 python 코드로 제어할 수 있게 만드는 준비 작업이 필요하다.
*클라이언트란?
AWS의 특정 서비스를 조작하려면 그 서비스에 접근할 수 있는 "통로" 또는 "조작 도구"이다.
클라이언트를 설정하는 코드는 다음과 같다.
AWS는 보안상 아무나 접근할 수 없기 때문에 접근하기 위한 본인 인증 수단이 필요하다.
따라서, 본인의 IAM 계정이나 Root 계정의 Access Key와 Secret Key 정보가 필요하다.
이 모든 것이 준비됐으면, AWS 서비스의 region 정보와 본인의 key 정보를 이용해서 다음 코드와 같이 클라이언트를 생성하면 된다.
from dotenv import load_dotenv
import os
import boto3
import io
import pandas as pd
load_dotenv()
aws_access_key = os.getenv("aws_accessKey")
aws_secret_key = os.getenv("aws_secretKey")
region_name='ap-northeast-2'
# S3 클라이언트 생성
client = boto3.client('s3', aws_access_key_id=aws_access_key, aws_secret_access_key=aws_secret_key, region_name=region_name)
현재 나의 경우 Access_key와 Secret_key를 .env 파일을 만들어서 key 값들을 작성해 두고, load_dotenv를 통해서 불러왔다.
(보안상 코드 자체에 바로 key 값이 노출되면 그다지 좋지 않기 때문이다.)
.env 파일을 만들려면 vscode에서 새로운 파일을 하나 생성한 후 파일명을 .env 라고 정해주면 톱니바퀴 모양의 파일이 하나 생성된다.
그리고 dotenv 라이브러리를 활용해서 (없다면 pip 설치) 위의 코드처럼 해당 파일을 불러오면 된다.
만약에, 이렇게 하지 않는다고 하면 단순하게 다음과 같이 설정하면 된다.
import boto3
aws_access_key = 'YOUR_ACCESS_KEY' # 여기에 직접적으로 입력해주면 된다.
aws_secret_key = 'YOUR_SECRET_KEY'
region_name = 'ap-northeast-2'
client = boto3.client(
's3',
aws_access_key_id=aws_access_key,
aws_secret_access_key=aws_secret_key,
region_name=region_name
)
2. Data loading
그럼 이제 클라이언트를 생성했으니 데이터를 실제로 python에서 가져와서 df로 조회를 해보자.
먼저, 기본적으로는 다음과 같이 코드를 작성할 수 있다.
그중에서도 s3의 버킷 내에서 객체들을 나열할 때 즉, 데이터를 다이렉트로 로딩할 때 사용하는 주요 메서드로 list_objects_v2가 있다.
(참고로 list_objects 메서드도 있는데 이는 구버전 API로 오래된 방식이기 때문에 신규 개발에서는 사용을 권장하지 않는다고 합니다.)
list_objects_v2 함수의 응답은 딕셔너리 형태고 그 안에 실제 파일 목록 즉, 객체 리스트는 'Contents'라는 키 값 안에 들어있기 때문에 다음과 같이 출력한다.
(궁금하면 response 자체를 조회해 보면 딕셔너리 형태를 볼 수 있다.)
# 조회할 버킷 이름
bucket_name = 'your-bucket-name'
# 객체 리스트 요청
response = client.list_objects_v2(Bucket=bucket_name)
# 결과 출력
if 'Contents' in response:
for obj in response['Contents']:
print(f"파일 이름: {obj['Key']}")
else:
print("버킷이 비어 있거나 객체가 없습니다.")
다음은 한 버킷 안에 들어있는 객체리스트를 하나의 데이터 프레임으로 보기 위해서 구현한 코드이다.
이런 식으로 하면 바로 merge 된 데이터 프레임을 볼 수 있다.
bucket_name = 'your-bucket-name'
prefix = 'your-files' # 버킷 밑의 하위경로/파일 명
# 경로 내 파일 목록 조회
response = client.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
if 'Contents' in response:
# 파일 목록 출력
files = [content['Key'] for content in response['Contents']]
# print("Available files:", files)
dataframes = {}
# 각 파일 순회
for i, file_key in enumerate(files):
# print(f'processing file {i+1}/{len(files)}: {file_key}')
try:
obj = client.get_object(Bucket=bucket_name, Key=file_key)
df = pd.read_parquet(io.BytesIO(obj['Body'].read()))
dataframes[i] = df # dataframes[0]
except Exception as e:
print("No files found in the specified prefix.")
if dataframes:
merged_df = pd.concat(dataframes, ignore_index=True)
else:
print("No files found in the specified prefix.")
이렇게 해서 오늘은 간단하게 boto3 라이브러리를 이용해서 AWS s3의 데이터 로딩 방법을 알아보았다.
도움이 되셨으면 좋겠습니댜. 감사합니댱