본문 바로가기

[Python]/[FastAPI]

[AWS S3] FastAPI - S3 Image upload

728x90

[Amazon Simple Storage Service(Amazon S3)]

 

Amazon S3이란 무엇인가요? - Amazon Simple Storage Service

HTTP를 통한 SOAP 지원은 중단되었지만 HTTPS를 통해 계속해서 사용할 수 있습니다. 새로운 Amazon S3 기능은 SOAP에 대해 지원되지 않습니다. REST API 또는 AWS SDK를 사용하는 것이 좋습니다.

docs.aws.amazon.com

  추천시스템을 만들면서, 대용량의 이미지 파일을 저장할 필요가 생겼다. 원래 사용하던 GCP(Google-Cloud-Platform)의 Bucket을 사용할까 생각하다가 AWS의 S3를 사용하기로 했다. 이유는? S3 써보고 싶어서! 그러면 S3가 정확하게 어떤것이고, 언제 사용하면 좋은지를 알아보기로 했다. 일단 위에 링크를 타고 들어가면 AWS에서 자사 S3 제품에 대한 소개를 다음과 같이 하고 있다. 

Amazon S3(Simple Storage Service)에서 제공하는 단순한 웹 서비스 인터페이스를 사용하여 언제든지 웹상 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있습니다. 또한, 개발자는 Amazon이 자체 웹 사이트의 글로벌 네트워크 운영에 사용하는 것과 같은 높은 확장성과 신뢰성을 갖춘 빠르고 경제적인 데이터 스토리지 인프라에 액세스할 수 있습니다. 이 서비스의 목적은 규모의 이점을 극대화하고 개발자들에게 이러한 이점을 제공하는 것입니다.

별도로 구글링을 통해 추가로 알아본 S3의 이점은 다음과 같다.

    1. 높은 내구도를 가지고, 중요 정보를 안전하게 보관할 수 있다.
    2. 저렴하다( 사용한 만큼 비용이 청구되고, 파일의 엑세스 빈도에 따라 저장방식을 달리해서 경제적이다 )
    3. 객체 가용성이 높다( 파일이 계속 서비스된다 )
    4. 보안성이 뛰어나고 고성능이다.

S3는 다방면에서 사용되는데, 주로 사용되는 용도는 다음과 간다. 이 중에서 나는 1,2번 용도로 S3를 사용해보려고 한다!

    1. 웹사이트 데이터 저장 및 보관
    2. 빅데이터와 같은 대용량 처리시스템 저장소
    3. 재해시 복구용 

 

무료 클라우드 컴퓨팅 서비스 - AWS

12개월 무료: 이 프리 티어 오퍼는 AWS 신규 고객에게만 제공되며 AWS 가입일로부터 12개월 동안 유효합니다. 12개월의 무료 사용 기간이 만료되거나 애플리케이션 사용량이 프리 티어 범위를 초과

aws.amazon.com

 

[S3 버킷 생성]

 이제 AWS Console에 접근해서 S3 버킷을 생성해준다. permission의 policy를 적절하게 잘 만들어주면 버킷을 안전하게 관리할 수도 있고, image파일을 공개적으로 오픈할 수 도 있다. 

1) create bucket 클릭

2) 버킷 이름, 리전 선택

3)  퍼블릭 엑세스 설정 (나는 금방 쓰고 버릴 예정이라 모두 허용해주었다)

4) 버전관리 및 암호화 설정

5) 버켓 생성 확인

6)  S3 public 공개를 위한 Policy생성

나는 Princial: *, Service: S3, Action: all, ResouceName: S3 콘솔창에서 확인가능  -> 으로 설정하고 policy를 생성했다.

 

AWS Policy Generator

Click below to edit. To save the policy, copy the text below to a text editor. Changes made below will not be reflected in the policy generator tool.

awspolicygen.s3.amazonaws.com

7)  생성한 policy bucket에 입력

8)  S3 버킷의 public accessable 확인

 

[FastAPI - S3 연동]

python으로 S3 를 설치하기 위해서는 boto3라는 것을 설치해야 한다. 관련 레퍼런스는 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

boto3를 설치했으면 다음과 같이 S3 클라이언트를 생성하고, 그 클라이언트의 upload_file함수를 호출해서 이미지 파일을 업로드 한다. 내가 사용한 upload_file함수에는 location, bucket_name, file, ExtraArgs 4가지 이다. 

  • location : 로컬에서 올리고자 하는 파일이 있는 위치
  • bucket_name : 사용하고자 하는 bucket의 이름
  • file : S3 버킷에 저장되는 파일 이름
  • ExtraArgs : ContentType등 기타 세부 설정
"""
connect to S3
"""
client_s3 = boto3.client(
    's3',
    aws_access_key_id = access_key,
    aws_secret_access_key = secret_key
)

"""
upload file to S3
"""
def upload_file(location, file):
    try:
        client_s3.upload_file(
            location,
            bucket_name,
            file,
            ExtraArgs={'ContentType': 'image/jpeg'}
        )
    except ClientError as e :
        print(f'Credential error => {e}')
    except Exception as e :
        print(f"Another error => {e}")

사용 예시는 다음과 같다. 

Context-type을 설정하지 않고 그대로 올렸더니, url에 접속했을 때 이미지를 다운하게 되어서 image/jpeg로 타입을 설정해 주었다.
설정 후에 S3의 버킷에서 이미지 url로 접근하면 다음과 같이 성공적으로 올라간 이미지 파일을 볼 수 있다. 

 

 

728x90

'[Python] > [FastAPI]' 카테고리의 다른 글

[FastAPI] 추천시스템 프로젝트의 시작  (0) 2021.09.06