pip install boto3
S3 API 사용을 위한 모듈 설치
파일 업로드
두가지 방법이 있다 .
- boto3.resource() 사용
import boto3
from botocore.client import Config
S3_KEY = '시크릿 키 ID'
S3_SECRET = '시크릿 키'
BNAME = '버킷(폴더)이름'
def s3upload():
data = open('test.txt','rb')
#S3 연결하고 객체 생성
s3 = boto3.resource('s3',aws_access_key_id=S3_KEY,
aws_secret_access_key=S3_SECRET,config=Config(signature_version='s3v4'))
#생성 객체에 파일 업로드 실행
return s3.Bucket(BNAME).put_object(Key='testname',Body=data)
파일에 대한 정보를 open함수를 통해 별도로 가져오고 업로드를 진행한다. 파일 자체를 올린다기 보단, 파이썬에서 가지고 있는 데이터 정보를 파일로 만들어 올리는 개념에 가까운듯.
2.boto3.client() 사용
def s3upload2():
#S3 연결하고 객체 생성
s3 = boto3.client('s3',aws_access_key_id=S3_KEY,
aws_secret_access_key=S3_SECRET)
#생성 객체에 파일 업로드 실행
#upload_file(로컬원본경로,버킷이름,목적지경로)
return s3.upload_file('test.txt',BNAME,'testname2.txt')
client 를 이용하는 방식은 보다 더 직관적으로 파일을 업로드한다. 로컬파일의 경로와 목적 파일의 이름을 지정해주는걸로 첫번째 방법보다는 확실히 직관인 업로드 사용이 가능하다.
파일 다운로드
- 직접 다운로드
def s3download():
lpath = 'downtest.txt'
rpath = 'testname2.txt'
# S3 연결하고 객체 생성
s3 = boto3.client('s3',aws_access_key_id=S3_KEY,
aws_secret_access_key=S3_SECRET)
return s3.download_file(BNAME,rpath,lpath)
client 방식을 그대로 쓰면서 함수만 download_file 로 바꿔준다. 지정한 로컬 lpath 디렉토리에 해당 파일이 생성되는걸 확인할 수 있다.
- URL 링크 생성
def s3genURL():
s3 = boto3.client('s3',aws_access_key_id=S3_KEY,
aws_secret_access_key=S3_SECRET)
url =s3.generate_presigned_url(ClientMethod='get_object',
Params={
'Bucket':BNAME,
'Key':'testname2.txt'
},
ExpiresIn=100)
print(url)
return url
일정 시간동안 다운로드 가능한 링크를 생성하는 방법 .
다만 생성된 URL 접속시 The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256. 이라는 문구가 뜰수도 있다.
이는 현재 boto3에서 생성한 인증 방식과 서버에서 사용하는 인증방식이 서로 일치하지 않아 발생하는 문제.
def s3genURL():
#S3 클라이언트 연결 - 보안옵션과 지역 옵션 추가
s3 = boto3.client('s3',aws_access_key_id=S3_KEY,
config=Config(signature_version='s3v4'),
region_name=S3_REGION,
aws_secret_access_key=S3_SECRET)
url =s3.generate_presigned_url(ClientMethod='get_object',
Params={
'Bucket':BNAME,
'Key':'testname2.txt'
},
ExpiresIn=100)
print(url)
return url
client 생성시에 서버에 맞게 인증 버전과 지역 정보를 추가하면 문제없이 URL에 접근이 가능해진다.