1. 가상 환경 설정

https://wgtech.github.io/posts/2019/05/22/Make-Python-3-Virtualenv-Anaconda/ 참고하여 가상 환경 생성

Untitled

Untitled

2. FastAPI 설치

pip install uvicorn
pip install fastapi
pip install boto3
# 기타 등등

3. AWS 설치

  1. https://aws.amazon.com/ko/ 링크로 접속

    Untitled

  2. 우측 상단의 “AWS 계정 생성” 클릭 + https://securityspecialist.tistory.com/117 참고하여 하라는 대로 회원가입 잘 해주시면 됩니다!

    비자 카드나 마스터 카드가 필요(100원 결제됨 + 회원가입 완료 시 다시 100원 돌려받음)

    Untitled

  3. 메인 홈페이지에서 서비스 → 스토리지 → s3 클릭한 뒤, 버킷 생성

    버킷 만들고 버킷 정책까지 편집해야 합니다. https://velog.io/@jinseoit/AWS-S3-bucket 참고

    Untitled

    Untitled

  4. https://docs.aws.amazon.com/ko_kr/powershell/latest/userguide/pstools-appendix-sign-up.html 를 참고하여 계정 액세스 키 ID와 보안 액세스 키를 얻습니다.

4. FastAPI와 AWS 연동

python 코드 작성

from typing import List
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import HTMLResponse
import uvicorn
import boto3
from botocore.exceptions import ClientError
from pathlib import Path

app = FastAPI()

client_s3 = boto3.client('s3', 
		# 본인의 key_id가 1234면 아래 코드 부분을 aws_access_key_id 를 "1234"로 바꿔야 한다.
    aws_access_key_id = "AKIA5ZOU5W7XFAQWFNOQ",
    aws_secret_access_key = "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"
)

# 아래 부분도 본인의 버킷 이름으로 수정하면 됩니다.
bucket = 'boostcampmedic'
@app.post("/uploadfiles")
def upload_files(files : List[UploadFile] = File(...)):
    file_name = files[0].filename
    try:
        client_s3.upload_file(
            file_name,
            bucket,
            f"{Path(file_name).stem}.jpg"
        )
    except ClientError as e :
        print(f'Credential error => {e}')
    except Exception as e :
        print(f"Another error => {e}")
    

@app.post("/downloadfiles/")
def download_files(filename : str):
    try:
        client_s3.download_file(
            bucket,
            f"{filename}.jpg"
            f"{filename}.jpg"
        )
    except ClientError as e :
        print(f'Credential error => {e}')
    except Exception as e :
        print(f"Another error => {e}")

@app.get("/")
def main():
    content = """
    <body>
        <form action="/uploadfiles/" enctype="multipart/form-data" method="post">
            <input name="files" type="file" multiple>
            <input type="submit" value = "파일 업로드">
        </form>
        <form action="/uploadfiles/" enctype="multipart/form-data" method="post">
            <input name="files" type="file" multiple>
            <input type="submit" value = "파일 업로드">
        </form>
        <form action="/downloadfiles/" enctype="multipart/form-data" method="post">
            <input name="filename" type="text">
            <input type="submit" value = "파일 다운로드">
        </form>
    </body>
    """
    return HTMLResponse(content=content)

if __name__ == '__main__' :
    uvicorn.run(app, host = "0.0.0.0", port=8000)

5. 잘 되는지 확인