어플에 사진을 보내면 사진을 s3버킷안에 저장하고 관리하는 어플
먼저 s3 버킷먼저 생성
버킷 만들기
https://aws.amazon.com/ko/sdk-for-python/
Python용 AWS SDK
Python용 AWS SDK인 boto3를 사용하여 AWS를 빠르게 시작하십시오. Boto3를 사용하면 Python 애플리케이션, 라이브러리 또는 스크립트를 Amazon S3, Amazon EC2, Amazon DynamoDB 등 AWS 서비스와 쉽게 통합할 수 있습
aws.amazon.com
pip install boto3
lmabda에는 기본으로 설치되어있고 로컬에만 설치해주면됨
파일을 s3에 업로드 API
POST / upload
form-data 로 사진 파일 전송
-photo : 사진파일
이때 파일을 올려서s3에 저장할때 파일명이 유니크해야지만 관리가 가능하다
항상 업로드하는 시간이 가장 유니크하다
from datetime import datetime
하지만 시간으로 했을경우 파일명으로 : 으로 할 수 없기때문에 형식을 바꿔줘야함
current_time = datetime.now()
new_file_name = current_time.isoformat().replace(':' , '_' ) + '.jpg'
file.filename = new_file_name
유니크하게 파일명 바뀜
그럼 이제 파일 업로드
s3에 파일 업로드 하는 라이브러리가 필요
따라서, boto3 라이브러리를 이용해서 업로드 한다.
클라이언트 서버 모델 → request + response
클라이언트(요청) 리퀘스트
서버(응답) 리스폰스
이용자가 사진 올리면 (클라이언트) lambda가 받으니까 서버
lambda가 s3에게 저장하기위해 클라이언트가 lambda s3가 서버
이런식
client = boto3.client('s3',
aws_access_key_id = Config.ACCESS_KEY ,
aws_secret_access_key = Config.SECRET_ACCESS )
client.upload_fileobj(file,
Config.S3_BUCKET,
new_file_name,
ExtraArgs = {'ACL':'public-read', 'ContentType' : file.content_type } )
최종
from flask import request
from flask_jwt_extended import jwt_required
from flask_restful import Resource
from mysql.connector import Error
from flask_jwt_extended import get_jwt_identity
from mysql_connection import get_connection
from datetime import datetime
import boto3
from config import Config
class FileUploadResource(Resource) :
def post(self) :
# 1. 클라이언트로부터 데이터를 받아온다.
# request.files에 파일이 들어있다.
if 'photo' not in request.files :
return {'error' : '파일 업로드하세요' },400
file = request.files['photo']
print(file)
# 클라이언트가 보낸 파일의 파일명을
# 변경시켜서 s3에 올려야, 유니크하게
#파일을 관리할 수 있다.
#파일을 유니크하게 만드는 방법
current_time = datetime.now()
new_file_name = current_time.isoformat().replace(':' , '_' ) + '.jpg'
print(new_file_name)
#파일명을, 유니크한 이름으로 변경한다
#클라이언트에서 보낸 파일명을 대체
file.filename = new_file_name
# s3에 파일을 업로드 하면 된다.
# s3에 파일 업로드 하는 라이브러리가 필요
# 따라서, boto3 라이브러리를 이용해서 업로드 한다.
# 라이브러리 설치는 pip install boto3
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}
주소 확인
버킷에 정상적으로 업로드
'Api 개발 > flask' 카테고리의 다른 글
사진과 내용을 동시에 올리는 api (0) | 2023.01.13 |
---|---|
s3에 저장된 이미지를 객체 탐지하는 API 만들기 (0) | 2023.01.12 |
github로 lambda CI/CD하기 (0) | 2023.01.12 |
serverless 계층(layer) 설정 (0) | 2023.01.11 |
serverless 서버 서울로 바꾸기 (0) | 2023.01.11 |