본문 바로가기

About/Flask

[Python] boto3를 이용한 Flask-S3 연동 (파일 업로드 및 다운로드)

boto3 설치

pip install boto3

s3 config file 정의

# m_config.py
AWS_ACCESS_KEY = "SDKNFLWKEFNWEFKEFJA"
AWS_SECRET_ACCESS_KEY = "fWEKLFWKLENWK"
AWS_S3_BUCKET_REGION = "ap-northeast-2"
AWS_S3_BUCKET_NAME = "file-storage"

s3 connect 함수 및 파일 업로드/다운로드 함수 정의

# import module
import boto3

from .m_config import AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY
from .m_config import AWS_S3_BUCKET_NAME, AWS_S3_BUCKET_REGION

def s3_connection():
    '''
    s3 bucket에 연결
    :return: 연결된 s3 객체
    '''
    try:
        s3 = boto3.client(
            service_name='s3',
            region_name=AWS_S3_BUCKET_REGION,
            aws_access_key_id=AWS_ACCESS_KEY,
            aws_secret_access_key=AWS_SECRET_ACCESS_KEY
        )
    except Exception as e:
        print(e)
        exit(ERROR_S3_CONNECTION_FAILED)
    else:
        print("s3 bucket connected!")
        return s3

def s3_put_object(s3, bucket, filepath, access_key):
    '''
    s3 bucket에 지정 파일 업로드
    :param s3: 연결된 s3 객체(boto3 client)
    :param bucket: 버킷명
    :param filepath: 파일 위치
    :param access_key: 저장 파일명
    :return: 성공 시 True, 실패 시 False 반환
    '''
    try:
        s3.upload_file(filepath, bucket, access_key)
    except Exception as e:
        print(e)
        return False
    return SUCCESS
    
def s3_get_object(s3, bucket, object_name, file_name):
    '''
    s3 bucket에서 지정 파일 다운로드
    :param s3: 연결된 s3 객체(boto3 client)
    :param bucket: 버킷명
    :param object_name: s3에 저장된 object 명
    :param file_name: 저장할 파일 명(path)
    :return: 성공 시 True, 실패 시 False 반환
    '''
    try:
        s3.download_file(bucket, object_name, file_name)
    except Exception as e:
        print(e)
        return False
    return True

s3 connect 함수 사용

#app.py
import os
import flask

from .m_connection import s3_connection, s3_put_object
from .m_config import AWS_S3_BUCKET_NAME, AWS_S3_BUCKET_REGION
...중략

s3 = s3_connection()

@app.route('/fileUpload', methods=['POST'])
def upload():
    f = request.files['file']
    f.save("./temp")
    
    ret =. s3_put_object(s3, AWS_S3_BUCKET_NAME, "./temp", ".temp")
    if ret :
        print("파일 저장 성공")
    else:
        print("파일 저장 실패")