Amazon S3를 Python 코드를 통해 업로드, 다운로드, 삭제하는 방법을 다룬다.
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는 .env
파일 내 환경변수를 사용하기 위한 python package 이다.
아래 명령어를 통해 설치한다.
$> pip install python-dotenv
boto3 package는 Python 개발자가 Amazon S3 및 Amazon EC2와 같은 서비스를 사용하는 소프트웨어를 작성할 수 있는 Python용 Amazon Web Services(AWS) 소프트웨어 개발 키트(SDK)이다.
아래 링크를 통해 자세한 내용을 볼 수 있다.
Boto3 Github
Boto3 documentation
boto3 package는 아래 명령어를 통해 설치한다.
$> pip install boto3
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에 파일을 업로드할 수 있다.
try:
s3.upload_file("[파일 상대 경로]", AWS_BUCKET_NAME, "[버킷에 저장될 파일 이름]")
except Exception as e:
print(e)
위 공통사항에 아래 코드를 추가해 S3에 파일을 다운로드할 수 있다.
try:
s3.download_file(AWS_BUCKET_NAME, "[download할 객체(파일)]", "[download한 파일이 저장될 상대 경로]")
except Exception as e:
print(e)
위 공통사항에 아래 코드를 추가해 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한 파일이 저장될 상대 경로]")
위 공통사항에 아래 코드를 추가해 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