파이썬과 Boto3를 이용해 여러 파일을 병렬로 업로드하는 방법

클라우드 컴퓨팅의 파일 관리와 저장소는 종종 복잡해 보일 수 있다. 이 포스트에서는 이를 단순화하고 효과적인 방법을 제공하여 파이썬과 Boto3(아마존 웹 서비스용 SDK)를 사용하여 여러 파일을 병렬로 업로드하는 방법을 소개한다.

문제 이해하기

대량의 파일을 작업할 때 하나씩 업로드하는 것은 시간이 많이 소요될 수 있다. 병렬 업로드는 특히 대량의 데이터를 처리할 때 과정을 크게 가속화할 수 있다.

파이썬과 Boto3를 이용한 해결책

Boto3 라이브러리를 사용하여 여러 파일을 병렬로 업로드하는 파이썬 스크립트 작성 방법을 알아보겠다. 이를 위해 디렉터리 구조에서 파일을 관리하고 S3 버킷에서 디렉터리 레이아웃을 유지하며 각 파일의 MIME 유형을 정의하는 데 초점을 둘 것이다.

초기 설정

먼저 필요한 라이브러리를 가져온다. 여기에는 파일 및 디렉터리 작업에 사용되는 os, AWS와 상호 작용하기 위한 boto3, 병렬 업로드 처리를 위한 threading 등이 포함된다.

python
import os
import boto3
import threading
from queue import Queue

AWS 연결 설정

AWS 서비스와 상호 작용하기 위해 Boto3 클라이언트를 생성한다. 여기서는 S3 서비스와 작업할 것이므로s3를 지정한다. 추가로 사용할 S3 버킷의 이름을 정의한다.

python
# S3 클라이언트 생성
s3 = boto3.client('s3')
bucket = 'your_bucket_name'  # 업로드 타겟 S3 버킷 이름

MIME 유형 정의 함수

파일 확장자에 기반하여 MIME 유형을 정의하는 함수를 만든다. 이 함수는 업로드 과정에서 각 파일에 적절한 콘텐츠 유형을 설정하는 데 사용된다.

python
def get_mime_type(file_path):
    switcher = {
        '.js': 'application/javascript',
        '.html': 'text/html',
        '.txt': 'text/plain',
        '.json': 'application/json',
        '.ico': 'image/x-icon',
        '.svg': 'image/svg+xml',
        '.css': 'text/css',
        '.jpg': 'image/jpeg',
        '.jpeg': 'image/jpeg',
        '.png': 'image/png',
        '.webp': 'image/webp',
        '.map': 'binary/octet-stream'
    }
    return switcher.get(file_ext, 'application/octet-stream')  # 기본값은 'application/octet-stream'이다.

각 웹 파일은 브라우저가 처리하는 방법을 안내하는 MIME 유형을 가지고 있다. 이는 'Content-Type' 헤더를 통해 전달된다. 예를 들어, HTML의 경우 'text/html'로, JPEG의 경우 'image/jpeg'로 전달된다. 지정되지 않은 경우, 브라우저는 파일을 예상대로 처리하지 못할 수 있다.

웹 호스팅을 위해 S3를 사용하는 경우, 각 파일에 대한 'Content-Type'을 정확히 지정하는 것이 중요하다. 이는 파일이 브라우저에서 요청될 때 S3가 응답 헤더에 파일의 'Content-Type'을 포함시키기 때문이다. HTML 파일의 'Content-Type'이 'text/html'로 올바르게 설정되지 않으면 브라우저가 이를 octet-stream(임의의 이진 데이터)으로 해석하고 웹페이지로 렌더링하는 대신 파일을 다운로드할 수 있다.

업로드 함수 생성

업로드 함수는 Boto3 클라이언트, 버킷 이름 및 파일 정보를 매개변수로 받아 지정된 S3 버킷에 파일을 업로드한다.

python
def upload_file(s3_client, bucket_name, file_info):
    file_path, file_key = file_info
    extra_args = {'ContentType': get_mime_type(file_path)}
    s3_client.upload_file(file_path, bucket_name, file_key, ExtraArgs=extra_args)

병렬 실행 설정

threading 라이브러리를 사용하여 여러 파일을 동시에 처리할 수 있다. 큐에서 파일 정보를 가져와 해당 파일을 업로드하는 worker 함수를 정의한다.

python
def worker():
    while not queue.empty():
        file_info = queue.get()
        upload_file(s3, bucket, file_info)
        queue.task_done()

병렬 실행하기

병렬로 여러 파일을 업로드하기 위해 루트 디렉터리를 설정하고 파일 정보를 관리하기 위해 큐를 생성한다. 그런 다음 파일 업로드를 병렬로 처리할 스레드의 수를 정의한다.

python
root_folder = '/your/path/to/files'  # 루트 디렉터리 경로

# 큐 생성
queue = Queue()

# 파일 정보 수집
for folder_name, subfolders, filenames in os.walk(root_folder):
    for filename in filenames:
        file_path = os.path.join(folder_name, filename)
        file_key = file_path[len(root_folder):].replace('\\', '/')
        queue.put((file_path, file_key))  # 파일 정보를 큐에 추가

# 스레드 수 정의
num_threads = 5

# 스레드 시작
for i in range(num_threads):
    threading.Thread(target=worker).start()

# 모든 업로드 완료 대기
queue.join()

파이썬과 Boto3를 사용하여 병렬 업로드를 수행함으로써 AWS 환경에서 대량의 파일을 효과적으로 관리할 수 있게 된다.


FAQ

  1. Boto3란 무엇인가? Boto3는 파이썬을 위한 아마존 웹 서비스(AWS) SDK이다. 이를 사용하여 파이썬 개발자는 아마존 S3, 아마존 EC2 등의 AWS 서비스를 활용하는 소프트웨어를 작성할 수 있다.
  2. 병렬 업로드는 왜 유용한가요? 병렬 업로드는 여러 파일을 동시에 전송하여 대량의 데이터를 빠르게 전송할 수 있는 장점이 있다. 한 번에 하나씩이 아니라 여러 파일을 동시에 전송하기 때문에 전송 속도를 크게 향상시킬 수 있다.
  3. MIME 유형이 무엇이고 왜 중요한가요? MIME 유형은 특정 확장자 파일을 처리하는 방법을 브라우저에 알려준다. MIME 유형은 문서를 처리하는 방식에 영향을 주며, 문서가 안전하게 보여질 수 있는지 여부를 결정하고 캐시될 수 있는지를 결정한다.
  4. 이 스크립트는 중첩된 디렉터리에 사용할 수 있나요? 그렇다, 이 스크립트는 중첩된 디렉터리를 간단하고 효율적으로 순회하는 데 사용되는 os.walk()를 사용한다.
  5. 이 스크립트는 대용량 파일에 적합한가요? 이 스크립트는 대용량 파일에 대해서도 작동하지만, 100MB 이상의 파일을 자주 처리하는 경우에는 사용 가능한 네트워크 대역폭을 최대화할 수 있는 멀티파트 업로드를 고려하는 것이 좋다.
© Copyright 2023 CLONE CODING