[AWS] Amazon S3 with Python

bolee·2022년 8월 3일
0
post-thumbnail

Amazon S3를 Python 코드를 통해 업로드, 다운로드, 삭제하는 방법을 다룬다.

Amazon S3

Amazon S3(Amazon Simple Storage Service)는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는 객체 스토리지 서비스이다.

즉, 어떤 규모 어떤 사업의 고객이든 이 서비스를 사용하여 웹 사이트, 모바일 애플리케이션, 백업 및 복원, 아카이브, 엔터프라이즈 애플리케이션, IoT 디바이스, 빅데이터 분석 등과 같은 다양한 사용 사례에서 원하는 만큼의 데이터를 저장하고 보호할 수 있다.

준비 사항

.gitignore 파일 설정

AWS access key 와 AWS secret access key가 github에 올라가게 되면 다양한 문제가 발생할 수 있다.
따라서 .env 파일 내에 AWS access key 와 AWS secret access key를 환경변수로서 사용할 것이며 때문에 .gitignore 파일을 생성해 아래처럼 .env 파일을 추가해 untracking 하도록 한다.

# in .gitignore
.env/

.env 파일 설정

.env 파일을 생성해 AWS access key 와 AWS secret access key를 넣어준다.

# environment variables defined inside a .env file
AWS_ACCESS_KEY_ID="[access key]"
AWS_SECRET_ACCESS_KEY="[secret key]"

python-dotenv package 설치

python-dotenv package는 .env 파일 내 환경변수를 사용하기 위한 python package 이다.
아래 명령어를 통해 설치한다.

$> pip install python-dotenv

boto3 package 설치

boto3 package는 Python 개발자가 Amazon S3 및 Amazon EC2와 같은 서비스를 사용하는 소프트웨어를 작성할 수 있는 Python용 Amazon Web Services(AWS) 소프트웨어 개발 키트(SDK)이다.
아래 링크를 통해 자세한 내용을 볼 수 있다.

Boto3 Github
Boto3 documentation

boto3 package는 아래 명령어를 통해 설치한다.

$> pip install boto3

S3 upload, download, delete

공통 사항

S3 를 다루기 위해 .env 파일에 있는 AWS access key 와 AWS secret access key를 가져오고, AWS 지역(region)과 S3 bucket name을 설정한다. 그리고 이 정보를 가지고 S3와 connect 해야 한다.

위에 일련의 과정을 아래 코드를 통해 수행해 준다.

import os
import boto3
from dotenv import load_dotenv
from pathlib import Path

dotenv_path = Path("[.env 파일 상대경로]")
load_dotenv(dotenv_path=dotenv_path)

AWS_ACCESS_KEY_ID = os.getenv("[access key]")
AWS_SECRET_ACCESS_KEY = os.getenv("[secret key]")
AWS_DEFAULT_REGION = "[region name]"
AWS_BUCKET_NAME = "[bucket name]"

def s3_connection():
    try:
        # s3 클라이언트 생성
        s3 = boto3.client(
            service_name="s3",
            region_name=AWS_DEFAULT_REGION,
            aws_access_key_id=AWS_ACCESS_KEY_ID,
            aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
        )
    except Exception as e:
        print(e)
    else:
        print("s3 bucket connected!") 
        return s3

s3 = s3_connection()

S3 upload file

위 공통사항에 아래 코드를 추가하여 S3에 파일을 업로드할 수 있다.

try:
    s3.upload_file("[파일 상대 경로]", AWS_BUCKET_NAME, "[버킷에 저장될 파일 이름]")
except Exception as e:
    print(e)
  • 파일 상대 경로:
    • 업로드할 파일, 상대 경로는 실행하는 코드를 기준으로
  • 버킷에 저장될 파일 이름:
    • 업로드 되어 버킷 내에서 해당 파일이 가질 키 지정
    • ex> image/test.jpg 라고 하면 imag 폴도 안에 test.jpg 라는 파일명으로 저장됨

S3 download file

위 공통사항에 아래 코드를 추가해 S3에 파일을 다운로드할 수 있다.

try:
	s3.download_file(AWS_BUCKET_NAME, "[download할 객체(파일)]", "[download한 파일이 저장될 상대 경로]")
except Exception as e:
	print(e)
  • download할 객체(파일):
    • 다운로드할 객체(파일)지정
    • ex> image/test.jpg 라고 하면, image 폴더 안에 test.jpg 라는 파일을 가져온다.
  • download한 파일이 저장될 위치:
    • 다운로드한 파일이 저장될 위치를 지정. 상대 경로는 실행하는 코드를 기준으로

S3 download ALL files

위 공통사항에 아래 코드를 추가해 S3 버킷(bucket) 내 파일들을 다운로드할 수 있다.

s3_contents = s3.list_objects(Bucket=AWS_BUCKET_NAME)["Contents"]

for s3_key in s3_contents:
    s3_object = s3_key["Key"]
    val = s3_object.find("/")
    if val == -1:
        s3.download_file(AWS_BUCKET_NAME, s3_object, "[download한 파일이 저장될 상대 경로]")
    else:
        rep = s3_object[:3]
        if not os.path.exists(rep):
            os.makedirs(rep)
        s3.download_file(AWS_BUCKET_NAME, s3_object, "[download한 파일이 저장될 상대 경로]")
  • download한 파일이 저장될 위치:
    • 다운로드한 파일이 저장될 위치를 지정. 상대 경로는 실행하는 코드를 기준으로

S3 delete file

위 공통사항에 아래 코드를 추가해 S3 버킷(bucket) 내 파일을 삭제할 수 있다.

response = s3.delete_object(Bucket=AWS_BUCKET_NAME, Key="[삭제할 객체(파일)]")

print(response)

참고 자료

https://dev.to/jakewitcher/using-env-files-for-environment-variables-in-python-applications-55a1
https://fubabaz.tistory.com/20
https://ahnjg.tistory.com/15
https://dev-navill.tistory.com/14
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/Welcome.html
https://stackoverflow.com/questions/31918960/boto3-to-download-all-files-from-a-s3-bucket

0개의 댓글