5:30Better Stack
Log in to leave a comment
No posts yet
Amazon S3 청구서를 볼 때마다 가슴이 서늘해지는 기분은 저도 잘 압니다. 데이터 엔지니어에게 S3는 공기 같은 존재지만, 테스트를 위해 수만 번 API를 호출하고 대용량 파일을 옮기다 보면 배보다 배꼽이 더 커지는 상황이 발생하니까요. 2025년 기준 S3 Standard 저장 비용은 GB당 0.023달러지만, 진짜 무서운 건 데이터 전송(Egress) 비용입니다. 100GB만 넘어가도 GB당 0.09달러를 내야 하는데, 이건 저장 비용의 4배에 가깝습니다. 이 비용을 아끼려고 로컬에서 MinIO를 띄워보지만, 실제 운영 코드와 어긋나서 고생하는 분들을 위해 제가 실무에서 쓰는 설정법을 정리했습니다.
애플리케이션 코드 안에 S3 주소를 직접 적는 건 위험한 습관입니다. 배포할 때 실수로 로컬 주소를 남겨두면 장애로 이어지니까요. Boto3 라이브러리는 코드 내부 설정보다 시스템 환경 변수를 먼저 읽습니다. 이 우선순위를 이용하면 로컬에서는 MinIO를 바라보고, 운영 환경에서는 자동으로 AWS S3를 사용하게 만들 수 있습니다.
설정 방법
.env 파일에 AWS_S3_ENDPOINT_URL=http://localhost:9000을 정의합니다.os.getenv("AWS_S3_ENDPOINT_URL")로 이 값을 읽어옵니다.boto3.client("s3", endpoint_url=endpoint)와 같이 클라이언트를 초기화합니다.이렇게 설정하면 운영 서버에는 해당 환경 변수가 없으므로 Boto3가 기본 AWS 주소를 찾아갑니다. 로컬 테스트 단계에서 발생하는 수만 건의 PUT/GET 요청 비용을 0원으로 만드는 가장 확실한 방법입니다.
상용 인프라를 정의한 테라폼 코드를 로컬 MinIO에서 그대로 쓰려고 하면 에러를 만나게 됩니다. 테라폼 AWS 프로바이더가 기본적으로 실제 AWS 계정 ID를 검증하려고 들기 때문입니다. 로컬 환경에서는 이 검증 과정을 가로채서 속여야 합니다.
테라폼 설정 예시
endpoints 설정에서 s3 = "http://localhost:9000"을 지정합니다.s3_use_path_style, skip_credentials_validation, skip_requesting_account_id 속성을 모두 true로 켭니다.access_key와 secret_key에는 mock_key 같은 아무 문자열이나 넣습니다.이 설정을 거치면 테라폼은 실제 AWS 계정 연결 없이도 로컬 MinIO에 버킷 정책과 생명주기 규칙(Lifecycle Rules)을 생성합니다. 배포 전에 인프라 정의서의 오류를 미리 잡을 수 있어 배포 실패율을 낮추는 데 효과적입니다.
쿼리 성능을 제대로 보려면 가짜 데이터라도 규모가 커야 합니다. 하지만 일반적인 루프 문으로 데이터를 만들면 너무 느려서 진이 빠지죠. 저는 Polars나 Apache Arrow를 씁니다. Polars는 벡터화 연산을 사용하기 때문에 Pandas보다 최대 10배 정도 빠릅니다.
데이터 생성 프로세스
Faker 라이브러리로 샘플 로그 형식을 정하고 Polars로 100,000행 단위 청크를 만듭니다.pyarrow 엔진의 write_to_dataset 기능을 써서 Hive 스타일(year=2026/month=04)로 파티셔닝된 Parquet 파일을 저장합니다.클라우드에서 100GB 데이터를 반복해서 올리고 내리면 수백 달러의 비용이 청구될 수 있습니다. 로컬 하드웨어를 한계까지 몰아붙이며 테스트하는 게 지갑 건강에 훨씬 이롭습니다.
파일이 올라오면 자동으로 동작하는 서버리스 로직을 로컬에서 테스트할 때는 MinIO의 버킷 알림 기능을 쓰면 됩니다. MinIO는 객체가 생성될 때 지정된 HTTP 엔드포인트로 JSON 데이터를 쏴주는 Webhook 기능을 지원합니다.
구현 순서
MINIO_NOTIFY_WEBHOOK_ENDPOINT를 로컬 서버 주소로 연결합니다.s3:ObjectCreated:Put 이벤트가 잘 들어오는지 확인합니다.이벤트가 몰릴 때의 신뢰도는 큐 크기와 이벤트 발생률에 따라 결정됩니다(
). 로컬 테스트 환경이라면 queue_limit 설정을 넉넉하게 늘려두는 것이 정신 건강에 좋습니다.
도커 컨테이너 안에서 만든 파일이 호스트 머신에서 권한 문제로 안 열릴 때가 있습니다. 특히 macOS 사용자라면 Docker Desktop 설정에서 'VirtioFS'를 켰는지 꼭 확인해야 합니다. VirtioFS는 기존 gRPC FUSE 방식보다 파일 시스템 처리 속도가 최대 98% 빠릅니다. 대용량 데이터를 다룰 때 이 차이는 체감이 큽니다.
권한 문제 해결법
docker run 시 --user $(id -u):$(id -g) 옵션을 써서 호스트와 컨테이너의 권한을 맞춥니다./data 경로와 볼륨 마운트합니다.로컬 환경을 잘 구축해두면 비용 걱정 없이 인프라의 동작 원리를 파헤칠 수 있는 완벽한 실험실이 생기는 셈입니다. 단순히 돈을 아끼는 것을 넘어, 클라우드 환경에 휘둘리지 않는 독립적인 개발 리듬을 가질 수 있습니다.