[python] FastAPI와 AWS S3를 사용한 파일 서비스 구현

본 블로그에서는 FastAPI와 AWS S3를 사용하여 파일을 업로드하고 다운로드하는 파일 서비스를 구현하는 방법에 대해 알아보겠습니다.

목차

  1. FastAPI 소개
  2. AWS S3란?
  3. FastAPI와 AWS S3를 연동
  4. 파일 업로드 및 다운로드 기능 구현
  5. 결론

FastAPI 소개

FastAPI는 Python으로 구현된 웹 API를 빠르게 구축할 수 있는 현대적이고 빠른 웹 프레임워크입니다. API에 대한 자동 문서화, 입력 유효성 검사, 데이터 유형 변환 등 다양한 기능을 제공하며, 대규모 애플리케이션의 성능을 유지하면서도 코드를 간결하고 직관적으로 작성할 수 있습니다.

AWS S3란?

Amazon Simple Storage Service(Amazon S3)는 인터넷 스토리지 서비스로, 웹사이트, 모바일 애플리케이션, 백업 및 복원, 아카이브, 데이터 레이크 등 다양한 애플리케이션에서 데이터를 안전하게 저장하고 조회할 수 있도록 지원합니다.

FastAPI와 AWS S3를 연동

FastAPI와 AWS S3를 연동하기 위해서는 boto3 라이브러리를 이용하여 AWS S3에 접근합니다. AWS 계정을 생성하고 액세스 키와 시크릿 키를 획들한 후, 해당 정보를 사용하여 S3에 파일을 업로드하고 다운로드할 수 있습니다.

import boto3

s3 = boto3.client('s3', aws_access_key_id='YOUR_ACCESS_KEY', aws_secret_access_key='YOUR_SECRET_KEY', region_name='YOUR_REGION')

파일 업로드 및 다운로드 기능 구현

FastAPI를 사용하여 파일 업로드와 다운로드 기능을 구현할 수 있습니다. 파일을 업로드할 때는 file 형식의 데이터로 전송하고, 해당 파일을 AWS S3에 업로드합니다. 파일을 다운로드할 때는 해당 파일의 퍼블릭 URL을 생성하여 클라이언트에 전달합니다. 파일의 읽기 및 쓰기 권한 설정에 주의해야 합니다.

from fastapi import FastAPI, UploadFile, File
from fastapi.responses import StreamingResponse
from io import BytesIO

app = FastAPI()

@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
    with BytesIO() as out_file:
        out_file.write(file.file.read())
        out_file.seek(0)
        s3.upload_fileobj(out_file, 'BUCKET_NAME', file.filename)

@app.get("/download/")
async def download_file(file_name: str):
    obj = s3.get_object(Bucket='BUCKET_NAME', Key=file_name)
    return StreamingResponse(io.BytesIO(obj['Body'].read()), media_type='application/octet-stream', headers={"Content-Disposition": "attachment; filename=" + file_name})

결론

이번 글에서는 FastAPI와 AWS S3를 이용하여 파일 서비스를 구현하는 방법에 대해 알아보았습니다. FastAPI를 통해 효율적인 API를 구현하고, AWS S3를 사용하여 안전하고 확장 가능한 파일 스토리지를 연동하는 것은 실제 프로젝트에서 매우 유용한 기술입니다. FastAPI의 빠른 개발과 AWS S3의 안정성 및 확장성을 활용하여 다양한 파일 서비스 애플리케이션을 구축할 수 있을 것입니다.

참고 문헌