FastAPI와 AWS S3를 연동하여 파일 업로드 및 다운로드 기능 구현하기

이번 포스트에서는 FastAPI와 AWS S3를 연동하여 파일 업로드 및 다운로드 기능을 구현하는 방법에 대해 알아보겠습니다.

필요한 패키지 설치하기

먼저 필요한 패키지를 설치해야 합니다. AWS SDK와 boto3를 사용하여 AWS S3와 연동하고, FastAPI에서는 python-multipart 패키지를 사용하여 파일 업로드를 처리합니다.

$ pip install boto3 fastapi python-multipart

AWS S3 설정하기

  1. AWS Console에 로그인한 후 S3 버킷을 생성합니다.
  2. 생성한 버킷에 접근할 수 있는 AWS IAM 사용자를 생성하고, 해당 사용자에게 S3 사용 권한을 부여합니다. 이때 권한은 쓰기, 읽기 권한이 필요합니다.
  3. 생성한 IAM 사용자의 액세스 키와 시크릿 액세스 키를 기록해둡니다.

FastAPI 애플리케이션 작성하기

from fastapi import FastAPI, File, UploadFile
import boto3

# AWS S3 접근 정보 설정
S3_ACCESS_KEY = "AWS-S3-ACCESS-KEY"
S3_SECRET_KEY = "AWS-S3-SECRET-KEY"
S3_REGION = "AWS-S3-REGION"
S3_BUCKET_NAME = "AWS-S3-BUCKET-NAME"

# FastAPI 앱 생성
app = FastAPI()

# 파일 업로드 API 엔드포인트
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
    # 파일을 임시로 저장
    with open(file.filename, "wb") as buffer:
        buffer.write(await file.read())

    # AWS S3 클라이언트 생성
    s3_client = boto3.client(
        "s3",
        aws_access_key_id=S3_ACCESS_KEY,
        aws_secret_access_key=S3_SECRET_KEY,
        region_name=S3_REGION
    )

    # S3에 파일 업로드
    s3_client.upload_file(file.filename, S3_BUCKET_NAME, file.filename)

    return {"message": "파일이 성공적으로 업로드되었습니다."}

# 파일 다운로드 API 엔드포인트
@app.get("/download/{file_name}")
async def download_file(file_name: str):
    # AWS S3 클라이언트 생성
    s3_client = boto3.client(
        "s3",
        aws_access_key_id=S3_ACCESS_KEY,
        aws_secret_access_key=S3_SECRET_KEY,
        region_name=S3_REGION
    )

    # S3에서 파일 다운로드
    s3_client.download_file(S3_BUCKET_NAME, file_name, file_name)

    # 다운로드한 파일 반환
    return FileResponse(path=file_name, filename=file_name)

테스트하기

  1. FastAPI 애플리케이션을 실행합니다.
$ uvicorn main:app --reload
  1. 파일을 업로드하기 위해 curl을 사용하거나, 다른 HTTP 클라이언트 도구를 사용합니다.
$ curl -X POST -F "file=@example.txt" http://localhost:8000/upload/
  1. 파일이 성공적으로 업로드되었는지 확인하기 위해 S3 버킷에 접속하거나, 다운로드 API를 사용합니다.
$ curl -O http://localhost:8000/download/example.txt

위의 예제 코드를 통해 FastAPI와 AWS S3를 연동하여 파일 업로드 및 다운로드 기능을 구현할 수 있습니다. 연동하는 API 서버로 파일 업로드를 하면 해당 파일이 AWS S3 버킷으로 업로드되고, 다운로드 API를 사용하여 파일을 다운로드할 수 있습니다.

#FastAPI #AWS-S3