Flask를 사용하여 클라이언트로부터 파일을 받으면 AWS S3에 저장하는 API를 만들고자 한다.
먼저 boto3 라이브러리가 필요하다.
1. boto3
AWS에서 제공하는 Python용 AWS SDK
Boto3를 사용하면 Python 애플리케이션, 라이브러리 또는 스크립트를
Amazon S3, Amazon EC2, Amazon DynamoDB 등 AWS 서비스와 쉽게 통합할 수 있다.
공식문서: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html
설치방법
pip install boto3
2. config.py 파일
Secure coding하기 위해 민감한 정보를 관리하는 파일
class Config :
# AWS 관련 키
ACCESS_KEY = IAM 사용자 access key
SECRET_ACCESS = IAM 사용자 secret access key
# S3 버킷
S3_BUCKET = 버킷명
# S3 Location
S3_LOCATION = 'https://버킷명.지역명.amazonaws.com/'
3. 파일 업로드 API 코드
from flask import request
from flask_restful import Resource
from datetime import datetime
import boto3
from config import Config
class FileUploadResource(Resource):
def post(self):
# 1. 클라이언트로부터 데이터를 받아온다.
# request.files에 파일이 들어있다.
if 'content' not in request.files:
return{'error' : '파일을 업로드하세요'}, 400
# print(request.files)
file = request.files['content']
# print(file)
# print(file.content_type)
# 클라이언트가 보낸 파일의 파일명을
# 변경시켜서 S3에 올려야, 유니크하게 파일을 관리할 수 있다.
# 파일명을 유니크하게 만드는 방법
current_time = datetime.now()
new_file_name = current_time.isoformat().replace(':', '_') + '.' + file.content_type.split('/')[1]
# 파일명을, 유니크한 이름으로 변경한다.
# 클라이언트에서 보낸 파일명을 대체
file.filename = new_file_name
# S3에 파일을 업로드 한다.
client = boto3.client('s3',
aws_access_key_id= Config.ACCESS_KEY,
aws_secret_access_key= Config.SECRET_ACCESS)
try:
client.upload_fileobj(file,
Config.S3_BUCKET,
new_file_name,
ExtraArgs = {'ACL':'public-read', 'ContentType':file.content_type})
except Exception as e:
return {'error' : str(e)}, 500
return {'result' : 'success',
'imgurl' : Config.S3_LOCATION + new_file_name}, 200
4. 포스트맨에서 테스트
5. S3에 업로드 됐는지 확인
'AWS > S3' 카테고리의 다른 글
AWS S3 - 버킷(스토리지) 만들기 (0) | 2023.01.12 |
---|