파이썬으로 S3 버킷에 파일 업로드하기(boto3)
Python으로 S3 버킷에 파일 업로드하기(boto3)
진행했었던 프로젝트를 관리하면서 아키텍처를 수정해보았다.
기존에는 유튜브에서 음악을 다운받으면, mp3 파일과 가수 이미지들을 로컬 폴더에 저장해두었으나, 이 방법은 좋지 않은 방법이기에 s3 버킷에 업로드하는 방식으로 하게되었다.
boto3 사용하기
pip install boto3
로 설치부터 해준다.두 가지 방법으로 이미지를 s3 버킷에 업로드 해보겠다.
1. boto3.resource() 사용 - img 파일 업로드
import boto3
from botocore.client import Config
ACCESS_KEY_ID = '시크릿 키 아이디 입력' #s3 관련 권한을 가진 IAM계정 정보
ACCESS_SECRET_KEY = '시크릿 키 입력'
BUCKET_NAME = '버킷 이름 입력'
def handle_upload_img(f): # f = 파일명
data = open('plist/static/plist/img/artist/'+f+'.jpg', 'rb')
# '로컬의 해당파일경로'+ 파일명 + 확장자
s3 = boto3.resource(
's3',
aws_access_key_id=ACCESS_KEY_ID,
aws_secret_access_key=ACCESS_SECRET_KEY,
config=Config(signature_version='s3v4')
)
s3.Bucket(BUCKET_NAME).put_object(
Key=f, Body=data, ContentType='image/jpg')
위의 방식대로 s3 버킷에 업로드된 결과이다.
파일을 퍼블릭으로 설정해두면 객체 URL로 접속해서 이미지를 확인할 수 있다.
해당 url로 웹사이트에서 이미지를 확인하는 것이 가능하다.
업로드된 이미지를 자동으로 퍼블릭으로 설정하는 방법은 아래에 게시해두었다.
출처: 이미지는 멜론에서 나얼님 사진을 가져온 겁니다..
2. boto3.client() 사용 - mp3 파일, img 파일 업로드
import boto3
ACCESS_KEY_ID = '시크릿 키 아이디 입력' #s3 관련 권한을 가진 IAM계정 정보
ACCESS_SECRET_KEY = '시크릿 키 입력'
BUCKET_NAME = '버킷 이름 입력'
def handle_upload_mp3(f):
s3_client = boto3.client('s3',
aws_access_key_id=ACCESS_KEY_ID,
aws_secret_access_key=ACCESS_SECRET_KEY)
response = s3_client.upload_file(
'plist/static/plist/audio/'+f+'.mp3', BUCKET_NAME, 'audio/'+f+'.mp3')
def handle_upload_img(f): # f = 파일명
s3_client = boto3.client(
's3',
aws_access_key_id=ACCESS_KEY_ID,
aws_secret_access_key=ACCESS_SECRET_KEY
)
response = s3_client.upload_file(
'plist/static/plist/img/artist/'+f+'.jpg', BUCKET_NAME, 'img/'+f+'.jpg')
# 로컬파일경로 + 파일명 + 파일종류, 버킷명, s3버킷의 원하는경로 + 파일명 + 파일종류
위의 방법으로 이미지가 성공적으로 업로드된 모습이다
client 방법을 사용하면 버킷에 폴더를 만들어서 그 안에 파일을 저장하기에 용이하다.
하지만 이 방식으로 업로드하게되면 url에서 이미지를 바로 보는 것이 아니라 url에 접속하게되면 아래와 같이 해당 이미지를 저장 할 수 있다고 확인할 수 있다.
S3 버킷 설정
업로드된 이미지 자동 퍼블릭으로 설정하기
버킷
선택 👉 권한
선택 👉 버킷 정책
편집
선택
json으로 작성된 버킷 정책은 버킷에 저장된 객체에 대한 액세스 권한을 제공한다,
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StatementSid1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::0000000000000:user/{IAM user 이름}"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::{버킷이름}/*"
},
{
"Sid": "StatementSid2",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{버킷이름}/*"
}
]
}
업로드된 이미지와 mp3파일를 프로젝트에 반영한 모습
<-- 이미지, mp3 재생화면 html 관련 소스코드 -->
<img src="https://버킷url/.jpg" alt="">
<audio autoplay="autoplay" loop="loop" preload="auto" controls="controls">
<source src="https://버킷url/.mp3">
</audio>
댓글남기기