DevOps/AWS

AWS S3 - 파이썬으로 이미지 파일 업로드하기

왕현성 2023. 1. 12. 15:59
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에 저장
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 변경하여 이미지 파일 선택

URI 테스트 결과

S3 확인 결과