
클라우드 컴퓨팅의 파일 관리와 저장소는 종종 복잡해 보일 수 있다. 이 포스트에서는 이를 단순화하고 효과적인 방법을 제공하여 파이썬과 Boto3(아마존 웹 서비스용 SDK)를 사용하여 여러 파일을 병렬로 업로드하는 방법을 소개한다.
대량의 파일을 작업할 때 하나씩 업로드하는 것은 시간이 많이 소요될 수 있다. 병렬 업로드는 특히 대량의 데이터를 처리할 때 과정을 크게 가속화할 수 있다.
Boto3 라이브러리를 사용하여 여러 파일을 병렬로 업로드하는 파이썬 스크립트 작성 방법을 알아보겠다. 이를 위해 디렉터리 구조에서 파일을 관리하고 S3 버킷에서 디렉터리 레이아웃을 유지하며 각 파일의 MIME 유형을 정의하는 데 초점을 둘 것이다.
먼저 필요한 라이브러리를 가져온다. 여기에는 파일 및 디렉터리 작업에 사용되는 os, AWS와 상호 작용하기 위한 boto3, 병렬 업로드 처리를 위한 threading 등이 포함된다.
import os
import boto3
import threading
from queue import QueueAWS 서비스와 상호 작용하기 위해 Boto3 클라이언트를 생성한다. 여기서는 S3 서비스와 작업할 것이므로s3를 지정한다. 추가로 사용할 S3 버킷의 이름을 정의한다.
# S3 클라이언트 생성
s3 = boto3.client('s3')
bucket = 'your_bucket_name' # 업로드 타겟 S3 버킷 이름파일 확장자에 기반하여 MIME 유형을 정의하는 함수를 만든다. 이 함수는 업로드 과정에서 각 파일에 적절한 콘텐츠 유형을 설정하는 데 사용된다.
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 버킷에 파일을 업로드한다.
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 함수를 정의한다.
def worker():
while not queue.empty():
file_info = queue.get()
upload_file(s3, bucket, file_info)
queue.task_done()병렬로 여러 파일을 업로드하기 위해 루트 디렉터리를 설정하고 파일 정보를 관리하기 위해 큐를 생성한다. 그런 다음 파일 업로드를 병렬로 처리할 스레드의 수를 정의한다.
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 환경에서 대량의 파일을 효과적으로 관리할 수 있게 된다.
| [Python] 비트 연산자 다양한 예제를 통해 이해하기 |
|---|
| [Python] 관계 연산자 다양한 예제를 통해 이해하기 |
| [Python] 'zsh: command not found: python' 오류 해결하기 |
| [Python] 할당 연산자 다양한 예제를 통해 이해하기 |
| [Python] 산술 연산자 다양한 예제를 통해 이해하기 |

CloneCoding
한 줄의 코드에서 시작되는 혁신!