[찍먹 Cloud Computing] 2. AWS S3
AWS S3와 boto3를 사용 해 보자 2021-07-16

AWS S3

안녕하세요? Justkode 입니다. 이번 시간에는 AWS S3에 대해서 알아 보고, AWS S3 버킷 생성, 파일 접근 권한 설정, Python 코드 상에서의 접근을 해 보도록 하겠습니다.

일단 AWS S3에 대해서 간단하게 설명 드리겠습니다. AWS S3는 내구성, 가용성, 성능, 보안이 뛰어난 스토리지 서비스 입니다. 사용한 스토리지 크기 만큼 요구가 청구되며, 작은 규모에서 시작하여 성능 또는 안정성 저하 없이 원하는 대로 애플리케이션을 확장할 수 있습니다. 웹 인터페이스를 이용하여, 제한 없이 마음껏 저장 및 검색이 가능합니다. (이에 대한 요금만 지출하면 됩니다.)

같은 리전 내에서는 데이터 송수신을 무료로 할 수 있고, 그러므로 실제 서버를 구축 할 때, AWS EC2, AWS Lambda를 이용하여 컴퓨팅을 하고, 중간에 바뀔일이 없는 정적, 미디어 파일 같은 경우는 AWS S3를 이용해 큰 데이터를 전송하는 방식으로 사용합니다.

AWS S3

Bucket & Object

일단 S3를 이용하기전 두 가지 개념을 알아 두시는 것이 좋습니다. 첫 번째는 Bucket 입니다. 말 그대로 데이터를 담을 수 있는 양동이라고 생각하면 됩니다. Bucket은 S3에서 최상위 디렉토리로써 사용 됩니다. 계정 당 100개의 버킷을 만들 수 있으며, 이름은 S3 동일 리전 내에서 유일 하여야 합니다. 저장할 수 있는 데이터는 무제한 입니다.

두 번째는 Object 입니다. S3에서의 Object메타 데이터와 파일의 쌍이라고 생각 하시는 것이 좋습니다. 메타 데이터에는 파일의 접근 권한, 이름, 유형 등이 적재 되어 있습니다.

Bucket & Object

Bucket 생성

먼저 Bucket을 만들어 보겠습니다. S3 콘솔에 접속 하신 다음, 우측 상단에 있는 버킷 만들기를 클릭 합니다.

Bucket 생성

그 다음, 버킷 생성 창으로 이동 합니다. 그 다음 여기에 버킷 이름과 리전을 선택 해 줄 수 있습니다. 혹은 기존에 소유한 버킷에서 설정을 가져올 수 있습니다.

Bucket 생성

그 밑에서는 퍼블릭 액세스에 대한 설정을 해 줄 수 있습니다. 여기서 말하는 ACL은 버킷이나 객체에 대해 요청자의 권한 허용 범위를 어디까지 설정할 것인가에 대해 설정 되어 있는 리스트라고 생각 하시면 됩니다. 만약 모든 사람들이 이 버킷에 접근 할 수 있게 끔 할때는 모든 퍼블릭 엑세스 차단을 체크 해제 함으로써 가능캐 할 수 있습니다.

퍼블릭 액세스

태그 탭에서 태그를 추가 할 수도 있습니다. 암호화 설정을 통해 들어오는 파일을 자동으로 암호화 하는 기능 또한 가지고 있습니다. 이렇게 모두 입력 한 후에, 버킷을 한 번 생성 해 보겠습니다. 밑에 있는 버킷 만들기를 클릭하면 됩니다.

Bucket 생성

이렇게 버킷을 만든 후 대시보드에 아까 만든 버킷이 추가 된 모습을 볼 수 있습니다. 한 번 버킷을 클릭 해 볼까요?

Bucket 생성 완료

그러면 버킷 내부의 대시보드 창을 볼 수가 있습니다. 아까 이야기 했듯이 버킷은 S3에서 최상위 디렉토리로써 사용 된다고 이야기 했죠? 그럼 최상위 폴더에 파일을 추가 해 보겠습니다. 업로드를 한 번 클릭 해 볼까요?

Bucket 대시 보드

그러면 이렇게 업로드 창으로 넘어 오게 됩니다. 여기서 우리는 파일 업로드, 혹은 폴더 업로드를 통해서 파일을 업로드 할 수 있습니다. 저는 Football teams.csv를 올려 놓은 상태입니다.

파일 업로드

밑으로 내려 보면, 이렇게 권한을 설정 할 수 있는 창이 나옵니다. 만약 업로드 하는 파일에 대해 모든 사람이 엑세스 할 수 있도록 설정 하려면 다음과 같이 세팅하면 됩니다.

파일 업로드

그 다음에는 스토리지 클래스를 설정 할 수 있습니다. 용도에 따라 설정 하여야 가격과 효율을 챙길 수 있습니다. 밑에는 태그메타 데이터를 설정 할 수 있습니다.

파일 업로드

업로드를 누르면 다음과 같이 파일이 업로드 된 모습을 볼 수가 있습니다. 밑에 생성된 파일을 클릭 해 볼까요?

파일 업로드 완료

다음과 같이 파일의 세부 정보를 열람 할 수 있습니다. 여기서 객체 URL을 클릭 하면, 파일을 열람 할 수 있습니다.

업로드 파일 확인

코드 구현, 그 전에..

우리는 일단 그 전에 AWS IAM을 통해 본인이라는 것을 인증 할 수단이 필요합니다. AWS IAM - 사용자탭으로 들어 간 후, 사용자 추가를 클릭합니다. 그럼 다음과 같이 사용자 추가를 할 수 있는 창이 뜨게 됩니다. 사용자 이름을 입력하고, 프로그래밍 방식 엑세스를 체크 하고 다음으로 넘어 갑니다.

사용자 추가 클릭

그 다음에는 기존 정책 직접 연결을 클릭하고, 정책 필터에서 AmazonS3FullAccess를 검색 후 선택 합니다. 그 다음 사용자를 생성해 줍니다.

정책 필터 선택

그럼 다음과 같이 액세스 키 ID비밀 액세스 키가 생성 된 것을 볼 수 있습니다. 이를 이용할 예정이니 잘 보관 해 주세요!

하지만, 정말 중요한 사실이 하나 있다면, 액세스 키 ID비밀 액세스 키절대 Github 같은 사이트에 올리지 마세요.

액세스 키 ID와 비밀 액세스 키 생성 완료

그 다음, AWS CLI를 컴퓨터에 설치해 줍니다. 설치 법은 다음과 같습니다.

  • Windows
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
  • Linux
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
  • Mac
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

그 다음 터미널에서 다음을 입력 합니다. 여기서 ap-northeast-2 는 서울 리전입니다.

aws configure

AWS Access Key ID [None]: 액세스 키 ID 입력
AWS Secret Access Key [None]: 비밀 액세스 키
Default region name [None]: ap-northeast-2
Default output format [None]: (입력 안해도 무방)

Python 예제

Python에서 파일 업로드를 하는 방법은 다음과 같습니다. 일단 위의 과정을 거쳐 AWS Configure을 완료 하셨다면, boto3를 설치 해 주세요.

pip install boto3

파일 업로드 예제

파일 업로드 예제는 다음과 같습니다. 코드에 대한 설명은 주석에 있습니다.

  • main.py
import boto3
import sys
import os
from datetime import date

file_path = sys.argv[1]  # python main.py 파일경로
today = date.today()  # 오늘 날짜의 Date 객체
date_path = today.strftime("%Y/%m-%d/")  # 폴더 명 생성

session = boto3.Session(profile_name="default")  # boto3의 Session 생성
s3 = session.client('s3')  # Client 객체 생성

local_file_path = file_path  # 파일 경로 복사
file_name = os.path.basename(file_path)  # 파일 명 추출
bucket = "justkode-mys3"  # 버킷명 설정
upload_path = date_path + file_name  # 업로드 경로 설정

s3.upload_file(local_file_path, bucket, upload_path)  # 업로드
print(f'{file_name}: File Upload Success')

이렇게 파일을 저장한 후, python3 main.py 파일경로을 입력 하면, 파일을 업로드 하는 모습을 볼 수 있습니다.

터미널 실행

버킷에 올라간 모습입니다.

업로드 성공

파일 다운로드 예제

파일 다운로드 예제는 다음과 같습니다. 코드에 대한 설명은 주석에 있습니다.

  • main2.py
import boto3
import sys
import os

file_path = sys.argv[1]  # python main.py 파일경로
today = date.today()  # 오늘 날짜의 Date 객체

session = boto3.Session(profile_name="default")  # boto3의 Session 생성
s3 = session.client('s3')  # Client 객체 생성

upload_path = file_path  # 파일 경로 복사
file_name = os.path.basename(file_path)  # 파일 명 추출
bucket = "justkode-mys3"  # 버킷명 설정

s3.download_file(bucket, upload_path, 'download/' + file_name)  # 다운로드
print(f'{file_name}: File Download Success')

이렇게 파일을 저장한 후, python3 main2.py 버킷내 파일경로를 입력 하면, 파일을 다운로드 하는 모습을 볼 수 있습니다.

터미널 실행

다운로드에 성공 한 모습입니다.

다운로드 모습

마치며

이렇게 AWS S3를 사용해 보는 시간을 가져 보았습니다. 이 외에도 서드파티 패키지, S3를 이용한 웹 호스팅, 퍼블릭으로 공개 되지 않은 S3 파일 접근을 위한 키 발급 등등 많은 기능을 지원 하고 있으니, 많이 찾아보는 것을 추천드립니다. 다음 시간에는, AWS Lambda에 대해 다뤄보는 시간을 가져보도록 하겠습니다.