FastAPI와 AWS S3를 연동하여 파일 업로드 및 다운로드 기능 구현하기
이번 포스트에서는 FastAPI와 AWS S3를 연동하여 파일 업로드 및 다운로드 기능을 구현하는 방법에 대해 알아보겠습니다.
필요한 패키지 설치하기
먼저 필요한 패키지를 설치해야 합니다. AWS SDK와 boto3를 사용하여 AWS S3와 연동하고, FastAPI에서는 python-multipart 패키지를 사용하여 파일 업로드를 처리합니다.
$ pip install boto3 fastapi python-multipart
AWS S3 설정하기
- AWS Console에 로그인한 후 S3 버킷을 생성합니다.
- 생성한 버킷에 접근할 수 있는 AWS IAM 사용자를 생성하고, 해당 사용자에게 S3 사용 권한을 부여합니다. 이때 권한은 쓰기, 읽기 권한이 필요합니다.
- 생성한 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)
테스트하기
- FastAPI 애플리케이션을 실행합니다.
$ uvicorn main:app --reload
- 파일을 업로드하기 위해 curl을 사용하거나, 다른 HTTP 클라이언트 도구를 사용합니다.
$ curl -X POST -F "file=@example.txt" http://localhost:8000/upload/
- 파일이 성공적으로 업로드되었는지 확인하기 위해 S3 버킷에 접속하거나, 다운로드 API를 사용합니다.
$ curl -O http://localhost:8000/download/example.txt
위의 예제 코드를 통해 FastAPI와 AWS S3를 연동하여 파일 업로드 및 다운로드 기능을 구현할 수 있습니다. 연동하는 API 서버로 파일 업로드를 하면 해당 파일이 AWS S3 버킷으로 업로드되고, 다운로드 API를 사용하여 파일을 다운로드할 수 있습니다.