왜? ⇒ 진행했던 프로젝트에서 cli나 s3에 대한 기본 개념이 없었어서(+시간촉박) 실패했던 부분이라 다시 해보았다.
기존의 코드를 사용하기에는 opencv로 인해 install 받을게 너무 많아서, 간단한 코드로 전송 기능만 테스트해보기로 했다.
S3는 Simple Storage Service의 약자로, 뛰어난 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스이다.
주로 바뀔일이 거의 없는 정적, 미디어 파일의 저장 및 전송에 사용한다. 또, 이는 무한히 확장 가능한 스토리지로, 크기를 사전에 프로비저닝할 필요가 없다.
같은 리전 내에서 데이터 송수신이 무료이고, 사용자가 사용한 만큼만 과금하므로, 액세스 빈도에 따라 다른 비용으로 효과적으로 데이터 저장이 가능하다.
S3관련 많은 개념이 있지만, 버킷과 객체는 특히 미리 알고 가면 좋다. Bucket은 S3에서 최상위 directory(폴더)로 사용되고, 파일은 이 안 어디엔가 있게 된다. 즉, bucket은 S3에 저장된 객체에 대한 컨테이너라고 볼 수 있다. S3 자체는 글로벌 수준이지만 bucket은 리전 수준에 정의 되므로, region 내에서 유일한 이름을 가져야 한다.
Object는 객체 데이터와 metadata로 구성되는 것으로, key-value 쌍인 metadata나 tags를 가질 수 있습니다. 일반적으로 metadata+file의 쌍이 객체라고 보면 쉽습니다. 객체(파일)는 파일 전체 경로인 키를 갖게 됩니다.
버킷 생성 전에 IAM을 통한 인증일 필요하다. AWS는 사용 시에는 항상 루트 계정보다는 IAM 계정을 가지고 제한된 권한의 사용자 역할을 수행하는 것이 좋다.
(S3 사용을 위해서는 AmazonS3Full Access 권한을 가진 사용자여야 한다.)
S3 콘솔에 접속한 다음, S3 검색 후 버킷에서 버킷 만들기를 클릭한다.
우선 버킷 이름과 리전을 설정하고, 본인의 경우 다른 계정에서 권한이 필요한 경우는 없을 예정이므로 객체 소유권은 비활성화 했다.
모든 퍼블릭 액세스 차단을 해제하면 모든 사람들이 버킷에 접근 가능하나, 지금은 중요한 객체 저장은 아니므로, 일단 다 해제했다.
💡실무에서는 모든 액세스 차단 혹은 ACL을 이용해 액세스를 차단 해주는 것이 보안적으로 좋다고 한다.
기본 암호화는 비활성화 했고, 나머지는 모두 기본 설정으로 두고 버킷 생성을 완료 했다.
업로드 버튼을 누르면 폴더 및 파일 추가가 가능하다.
++ 버킷 스토리지 클래스 내용은 알아두면 좋을 것 같아서 추가했다.
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
받았으면, 터미널에서 다음을 입력한다.
aws configure
AWS Access Key ID [None]: 본인 액세스 키 ID 입력
AWS Secret Access Key [None]: 본인 비밀 액세스 키
Default region name [None]: ap-northeast-2 <- 서울
Default output format [None]: [Optional]
우선 boto3를 설치해야 한다. boto3는 파이썬 전용 AWS SDK로, AWS에서 지워하는 40개 이상의 서비스를 파이썬에서 활용할 수 있도록 해준다.
pip install boto3
업로드 코드
코드는 간단하게, 현재 로컬에서 파일 이름, 파일을 올릴 버킷 이름, 버킷 내에서 파일이 가질 이름만 정해주면 된다.
import boto3
local_file_name = 'images/rnldudnj.jpg' # 업로드할 파일, 상대 경로
bucket = 'dh-demo0813' # 버킷 이름
key = 'images/dusdj.jpg' # 버킷 내에서 파일이 가질 키
#Upload the file
s3 = boto3.client('s3')
res = s3.upload_file(local_file_name, bucket, key)
# binary mode에서 사용하고싶은 경우 'upload_fileobj'를 사용하면 된다.
print("Success!")
다운로드도 비슷한 방식으로 쉽게 가능하다.
import boto3
file_name = 'images/dusdj.jpg' # 다운로드한 파일이 저장될 위치
bucket = 'dh-demo0813' # 다운로드할 버킷 이름
key = 'images/rnldudnj.jpg'
#Download the file
client = boto3.client('s3')
client.download_file(bucket, key, file_name)
참고
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/Welcome.html
https://www.c-sharpcorner.com/article/introduction-to-aws-s3/