python

[python] python S3 API

pip install boto3

S3 API 사용을 위한 모듈 설치


파일 업로드

두가지 방법이 있다 .

  1. 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 를 이용하는 방식은 보다 더 직관적으로 파일을 업로드한다. 로컬파일의 경로와 목적 파일의 이름을 지정해주는걸로 첫번째 방법보다는 확실히 직관인 업로드 사용이 가능하다.


파일 다운로드

  1. 직접 다운로드
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 디렉토리에 해당 파일이 생성되는걸 확인할 수 있다.

  1. 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에 접근이 가능해진다.