클라우드 컴퓨팅의 파일 관리와 저장소는 종종 복잡해 보일 수 있다. 이 포스트에서는 이를 단순화하고 효과적인 방법을 제공하여 파이썬과 Boto3(아마존 웹 서비스용 SDK)를 사용하여 여러 파일을 병렬로 업로드하는 방법을 소개한다.
대량의 파일을 작업할 때 하나씩 업로드하는 것은 시간이 많이 소요될 수 있다. 병렬 업로드는 특히 대량의 데이터를 처리할 때 과정을 크게 가속화할 수 있다.
Boto3 라이브러리를 사용하여 여러 파일을 병렬로 업로드하는 파이썬 스크립트 작성 방법을 알아보겠다. 이를 위해 디렉터리 구조에서 파일을 관리하고 S3 버킷에서 디렉터리 레이아웃을 유지하며 각 파일의 MIME 유형을 정의하는 데 초점을 둘 것이다.
먼저 필요한 라이브러리를 가져온다. 여기에는 파일 및 디렉터리 작업에 사용되는 os
, AWS와 상호 작용하기 위한 boto3
, 병렬 업로드 처리를 위한 threading
등이 포함된다.
import os
import boto3
import threading
from queue import Queue
AWS 서비스와 상호 작용하기 위해 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
한 줄의 코드에서 시작되는 혁신!