728x90
1. 목표
- S3에 이미지 파일을 업로드
- RDS DB에 이미지의 URL과 내용 저장
2. boto3
파이썬용 AWS 소프트웨어 개발 킷
Amazon S3, EC2, DynamoDB 등 AWS 서비스와 쉽게 통합
3. boto3 라이브러리 설치
- S3에 파일을 업로드하기 위해선 AWS 라이브러리가 필요
- boto3 : AWS의 서비스를 프로그래밍 코드로 이용 할 수 있게 해주는 라이브러리
pip install boto3
4. Visual Studio Code
4.1. 메인 파일 : app.py
- 기능 : API 구축, 환경변수 설정, 리소스 경로 생성
from flask import Flask
from flask_restful import Api
from config import Config
from flask_jwt_extended import JWTManager
from resources.image import FileUploadResource
app = Flask(__name__)
# 환경변수 셋팅
app.config.from_object(Config)
# JWT 매니저 초기화
jwt=JWTManager(app)
api = Api(app)
# 경로와 리소스 코드를 연결한다.
api.add_resource(FileUploadResource,'/upload')
if __name__ == '__main__' :
app.run()
4.2. 추가 리소스 파일 : image.py
- 기능
- 파이썬 코드로 AWS 서비스 사용
- 이미지 파일을 업로드하여 클라우드 서버(S3)에 저장
- 이미지 url과 내용을 데이터베이스(RDS)에 저장
- 기능 설계
- 유저에게 파일을 받아 s3에 파일 업로드 (boto3 라이브러리 사용)
- 파일이름은 현재 시간으로 생성 (파일 이름의 중복 방지)
- 업로드한 파일 주소와 입력 받은 내용 DB에 저장
- 유저에게 파일을 받아 s3에 파일 업로드 (boto3 라이브러리 사용)
from flask import request
from flask_restful import Resource
from flask_jwt_extended import create_access_token,jwt_required,get_jwt
from flask_jwt_extended import create_access_token,jwt_required,get_jwt
from mysql.connector import Error
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}
5. POSTMAN - 이미지 파일을 업로드하고 이미지에 대한 내용 저장
- API 기능 : 사진과 내용 저장
- POST - Body - form-data
- KEY : VALUE 입력
- photo : key 우측에 test -> file 변경하여 이미지 파일 선택
- KEY : VALUE 입력
URI 테스트 결과
S3 확인 결과
'DevOps > AWS' 카테고리의 다른 글
AWS CloudWatch - Serverless Task timed out 해결 방법 (0) | 2023.01.17 |
---|---|
AWS S3 - 버킷 생성 방법 (0) | 2023.01.12 |
AWS Lambda - Numpy,Pandas 라이브러리를 Lambda 레이어로 만드는 방법 (0) | 2023.01.11 |
AWS & Serverless / 로컬에서 API 개발 후 수동 배포( sls deploy )하는 방법 총정리 (0) | 2023.01.11 |
AWS Lambda - 로컬에서 설치한 라이브러리들을 설치하는 방법 (0) | 2023.01.11 |