boto를 사용하여 S3 버킷의 디렉터리에 파일을 업로드하는 방법


107

파이썬을 사용하여 s3 버킷의 파일을 복사하고 싶습니다.

예 : 버킷 이름 = 테스트가 있습니다. 그리고 버킷에는 "dump"와 "input"이라는 2 개의 폴더가 있습니다. 이제 python을 사용하여 로컬 디렉터리에서 S3 "dump"폴더로 파일을 복사하고 싶습니다. 누구든지 도와 줄 수 있습니까?

답변:


105

이 시도...

import boto
import boto.s3
import sys
from boto.s3.key import Key

AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''

bucket_name = AWS_ACCESS_KEY_ID.lower() + '-dump'
conn = boto.connect_s3(AWS_ACCESS_KEY_ID,
        AWS_SECRET_ACCESS_KEY)


bucket = conn.create_bucket(bucket_name,
    location=boto.s3.connection.Location.DEFAULT)

testfile = "replace this with an actual filename"
print 'Uploading %s to Amazon S3 bucket %s' % \
   (testfile, bucket_name)

def percent_cb(complete, total):
    sys.stdout.write('.')
    sys.stdout.flush()


k = Key(bucket)
k.key = 'my test file'
k.set_contents_from_filename(testfile,
    cb=percent_cb, num_cb=10)

[업데이트] 나는 비단뱀 주의자가 아니므로 import 문에 대한주의를 기울여 주셔서 감사합니다. 또한 자신의 소스 코드에 자격 증명을 배치하지 않는 것이 좋습니다. AWS 내에서이를 실행하는 경우 인스턴스 프로필 ( http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html ) 과 함께 IAM 자격 증명을 사용 하고 동일한 동작을 개발 / 테스트 환경에서 AdRoll의 Hologram ( https://github.com/AdRoll/hologram ) 과 같은 것을 사용합니다.


8
나는 파이썬이 아닌 여러 수입 라인을 피할 것입니다. 가져 오기 행을 맨 위로 이동하고 boto의 경우 boto.s3.connection import S3Connection을 사용할 수 있습니다. conn = S3Connection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY); 버킷 = conn.create_bucket (bucketname ...); bucket.new_key (keyname, ...). set_contents_from_filename ....
cgseller

2
boto.s3.key.Key는 1.7.12에 존재하지 않습니다
알렉스 파비에게

2020 년 4 월 현재 업데이트는이 링크를 따르십시오. upload_file_to_s3_using_python
Prayag Sharma

48

그렇게 복잡하게 만들 필요가 없습니다.

s3_connection = boto.connect_s3()
bucket = s3_connection.get_bucket('your bucket name')
key = boto.s3.key.Key(bucket, 'some_file.zip')
with open('some_file.zip') as f:
    key.send_file(f)

이것은 작동하지만 큰 .zip 파일의 경우 청크를 사용해야 할 수도 있습니다. elastician.com/2010/12/s3-multipart-upload-in-boto.html
cgseller 2015-06-29

2
예 .. 덜 복잡하고 일반적으로 실제 사용
레오 왕자

1
나는 이것을 시도했지만 작동하지 않지만 k.set_contents_from_filename (testfile, cb = percent_cb, num_cb = 10) 않습니다
Simon

1
최신 Boto 2를 사용하십니까? 어쨌든 set_contents_from_filename은 더 간단한 옵션입니다. 그것을 위해 가십시오!
vcarel

3
key.set_contents_from_filename('some_file.zip')여기서도 작동합니다. doc 참조 . boto3에 해당하는 코드는 여기 에서 찾을 수 있습니다 .
Greg Sadetsky

44
import boto3

s3 = boto3.resource('s3')
BUCKET = "test"

s3.Bucket(BUCKET).upload_file("your/local/file", "dump/file")

이 라인 s3.Bucket (BUCKET) .upload_file ( "당신의 / 지역 / 파일", "덤프 / 파일")를 설명 할 수
벤 카트

@venkat "your / local / file"은 python / boto를 사용하는 컴퓨터의 "/home/file.txt"와 같은 파일 경로이고 "dump / file"은 S3 버킷에 파일을 저장할 키 이름입니다. 참조 : boto3.readthedocs.io/en/latest/reference/services/...
조쉬 S.

1
사용자가 미리 구성된 AWS 키를 가지고있는 것 같습니다. 이렇게하려면 anaconda 명령 프롬프트를 열고를 aws configure입력하고 정보를 입력하면 자동으로 boto3에 연결됩니다. boto3.readthedocs.io/en/latest/guide/quickstart.html
seeiespi

가장 간단한 솔루션 IMO, tinys3만큼 쉽지만 다른 외부 종속성이 필요하지 않습니다. 또한 aws configure삶을 더 편하게 만들기 위해 미리 AWS 키를 설정하는 것이 좋습니다 .
barlaensdoonn

자격 증명에 여러 프로필이 있으면 어떻게됩니까? 특정 자격 증명을 전달하는 방법
Tara Prasad Gurung

36

나는 이것을 사용했고 구현하기가 매우 간단합니다.

import tinys3

conn = tinys3.Connection('S3_ACCESS_KEY','S3_SECRET_KEY',tls=True)

f = open('some_file.zip','rb')
conn.upload('some_file.zip',f,'my_bucket')

https://www.smore.com/labs/tinys3/


나는 이것이 큰 파일에서 작동하지 않는다고 생각합니다. 나는 이것을 사용해야했다 : docs.pythonboto.org/en/latest/s3_tut.html#storing-large-data
wordsforthewise


6
tinys3 프로젝트가 중단되었으므로 이것을 사용해서는 안됩니다. github.com/smore-inc/tinys3/issues/45
Halil Kaskavalci

이 플랫 아웃은 2019 년에 더 이상 저에게 효과가 없었습니다. tinys3는 그냥 버려지는 것이 아닙니다. 더 이상 효과가 없다고 생각합니다. 이것을 시도하기로 결정한 다른 사람을 위해 403 오류가 발생하더라도 놀라지 마십시오. 그러나 boto3.clientManish Mehra의 답변과 같은 간단한 솔루션은 즉시 작동했습니다.
Russ

16
from boto3.s3.transfer import S3Transfer
import boto3
#have all the variables populated which are required below
client = boto3.client('s3', aws_access_key_id=access_key,aws_secret_access_key=secret_key)
transfer = S3Transfer(client)
transfer.upload_file(filepath, bucket_name, folder_name+"/"+filename)

파일 경로는 무엇이며 folder_name + filename은 무엇입니까? 그것은 혼란
colintobing

파일 경로를 @colintobing하는 클러스터 및 폴더 _에 파일의 경로 / 파일 이름은 내부에 갖고 싶어 할 것이라는 이름 지정 규칙은 S3 버킷
마니 메라

2
@ManishMehra 콜린 토 빙의 혼란의 요점을 명확히하기 위해 편집했다면 대답이 더 나을 것입니다. 문서를 확인하거나 주석을 읽지 않고 어떤 매개 변수가 로컬 경로를 참조하고 어떤 매개 변수가 S3 경로를 참조하는지 문서를 확인하지 않으면 명확하지 않습니다. (완료되면 폐기 될 것이므로 여기에서 모든 주석을 제거하도록 플래그를 지정할 수 있습니다.)
Mark Amery

aws_access_key_id그리고 aws_secret_access_key라고도 할 수있는 AWS CLI 구성하고`클라이언트 = boto3.client ( 'S3') 그래서 스크립트 밖으로 저장할 수 있습니다
yvesva

16

자격 증명을 사용하여 세션 내에서 s3에 파일을 업로드합니다.

import boto3

session = boto3.Session(
    aws_access_key_id='AWS_ACCESS_KEY_ID',
    aws_secret_access_key='AWS_SECRET_ACCESS_KEY',
)
s3 = session.resource('s3')
# Filename - File to upload
# Bucket - Bucket to upload to (the top level directory under AWS S3)
# Key - S3 object name (can contain subdirectories). If not specified then file_name is used
s3.meta.client.upload_file(Filename='input_file_path', Bucket='bucket_name', Key='s3_output_key')

s3_output_key는 무엇입니까?
Roelant

S3 버킷의 파일 이름입니다.
로마 ORAC

12

이것은 또한 작동합니다.

import os 
import boto
import boto.s3.connection
from boto.s3.key import Key

try:

    conn = boto.s3.connect_to_region('us-east-1',
    aws_access_key_id = 'AWS-Access-Key',
    aws_secret_access_key = 'AWS-Secrete-Key',
    # host = 's3-website-us-east-1.amazonaws.com',
    # is_secure=True,               # uncomment if you are not using ssl
    calling_format = boto.s3.connection.OrdinaryCallingFormat(),
    )

    bucket = conn.get_bucket('YourBucketName')
    key_name = 'FileToUpload'
    path = 'images/holiday' #Directory Under which file should get upload
    full_key_name = os.path.join(path, key_name)
    k = bucket.new_key(full_key_name)
    k.set_contents_from_filename(key_name)

except Exception,e:
    print str(e)
    print "error"   

7

이것은 3 개의 라이너입니다. boto3 문서 의 지침을 따르십시오 .

import boto3
s3 = boto3.resource(service_name = 's3')
s3.meta.client.upload_file(Filename = 'C:/foo/bar/baz.filetype', Bucket = 'yourbucketname', Key = 'baz.filetype')

몇 가지 중요한 주장은 다음과 같습니다.

매개 변수 :

  • 파일 이름 ( str)-업로드 할 파일의 경로입니다.
  • 버킷 ( str)-업로드 할 버킷의 이름입니다.
  • ( str)-s3 버킷의 파일에 할당하려는의 이름입니다. 이것은 파일 이름과 같거나 선택한 다른 이름 일 수 있지만 파일 형식은 동일해야합니다.

    참고 : boto3 설명서~\.aws모범 구성 사례에서 제안한대로 자격 증명을 폴더 에 저장했다고 가정합니다 .


  • 저와 함께 일한 Nde Samuel에게 감사합니다. 제 경우에 추가로 필요한 것은 ""지정된 버킷이 없습니다 ""라는 오류를 방지하기 위해 버킷을 이미 생성 한 것입니다.
    HassanSh__3571619

    @ HassanSh__3571619 도와 주셔서 기쁩니다.
    Samuel Nde 19

    5
    import boto
    from boto.s3.key import Key
    
    AWS_ACCESS_KEY_ID = ''
    AWS_SECRET_ACCESS_KEY = ''
    END_POINT = ''                          # eg. us-east-1
    S3_HOST = ''                            # eg. s3.us-east-1.amazonaws.com
    BUCKET_NAME = 'test'        
    FILENAME = 'upload.txt'                
    UPLOADED_FILENAME = 'dumps/upload.txt'
    # include folders in file path. If it doesn't exist, it will be created
    
    s3 = boto.s3.connect_to_region(END_POINT,
                               aws_access_key_id=AWS_ACCESS_KEY_ID,
                               aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                               host=S3_HOST)
    
    bucket = s3.get_bucket(BUCKET_NAME)
    k = Key(bucket)
    k.key = UPLOADED_FILENAME
    k.set_contents_from_filename(FILENAME)

    4

    boto3 사용

    import logging
    import boto3
    from botocore.exceptions import ClientError
    
    
    def upload_file(file_name, bucket, object_name=None):
        """Upload a file to an S3 bucket
    
        :param file_name: File to upload
        :param bucket: Bucket to upload to
        :param object_name: S3 object name. If not specified then file_name is used
        :return: True if file was uploaded, else False
        """
    
        # If S3 object_name was not specified, use file_name
        if object_name is None:
            object_name = file_name
    
        # Upload the file
        s3_client = boto3.client('s3')
        try:
            response = s3_client.upload_file(file_name, bucket, object_name)
        except ClientError as e:
            logging.error(e)
            return False
        return True

    추가 정보 : -https : //boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html


    1

    다음 코드와 S3 폴더 그림과 같은 업로드 폴더 예 여기에 이미지 설명 입력

    import boto
    import boto.s3
    import boto.s3.connection
    import os.path
    import sys    
    
    # Fill in info on data to upload
    # destination bucket name
    bucket_name = 'willie20181121'
    # source directory
    sourceDir = '/home/willie/Desktop/x/'  #Linux Path
    # destination directory name (on s3)
    destDir = '/test1/'   #S3 Path
    
    #max size in bytes before uploading in parts. between 1 and 5 GB recommended
    MAX_SIZE = 20 * 1000 * 1000
    #size of parts when uploading in parts
    PART_SIZE = 6 * 1000 * 1000
    
    access_key = 'MPBVAQ*******IT****'
    secret_key = '11t63yDV***********HgUcgMOSN*****'
    
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            host = '******.org.tw',
            is_secure=False,               # uncomment if you are not using ssl
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    bucket = conn.create_bucket(bucket_name,
            location=boto.s3.connection.Location.DEFAULT)
    
    
    uploadFileNames = []
    for (sourceDir, dirname, filename) in os.walk(sourceDir):
        uploadFileNames.extend(filename)
        break
    
    def percent_cb(complete, total):
        sys.stdout.write('.')
        sys.stdout.flush()
    
    for filename in uploadFileNames:
        sourcepath = os.path.join(sourceDir + filename)
        destpath = os.path.join(destDir, filename)
        print ('Uploading %s to Amazon S3 bucket %s' % \
               (sourcepath, bucket_name))
    
        filesize = os.path.getsize(sourcepath)
        if filesize > MAX_SIZE:
            print ("multipart upload")
            mp = bucket.initiate_multipart_upload(destpath)
            fp = open(sourcepath,'rb')
            fp_num = 0
            while (fp.tell() < filesize):
                fp_num += 1
                print ("uploading part %i" %fp_num)
                mp.upload_part_from_file(fp, fp_num, cb=percent_cb, num_cb=10, size=PART_SIZE)
    
            mp.complete_upload()
    
        else:
            print ("singlepart upload")
            k = boto.s3.key.Key(bucket)
            k.key = destpath
            k.set_contents_from_filename(sourcepath,
                    cb=percent_cb, num_cb=10)

    추신 : 더 많은 참조 URL


    0
    xmlstr = etree.tostring(listings,  encoding='utf8', method='xml')
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            # host = '<bucketName>.s3.amazonaws.com',
            host = 'bycket.s3.amazonaws.com',
            #is_secure=False,               # uncomment if you are not using ssl
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    conn.auth_region_name = 'us-west-1'
    
    bucket = conn.get_bucket('resources', validate=False)
    key= bucket.get_key('filename.txt')
    key.set_contents_from_string("SAMPLE TEXT")
    key.set_canned_acl('public-read')

    코드가하는 일에 대한 텍스트 설명이 좋을 것입니다!
    Nick

    0

    나에게 좀 더 순서가있는 것 같은 것이 있습니다.

    import boto3
    from pprint import pprint
    from botocore.exceptions import NoCredentialsError
    
    
    class S3(object):
        BUCKET = "test"
        connection = None
    
        def __init__(self):
            try:
                vars = get_s3_credentials("aws")
                self.connection = boto3.resource('s3', 'aws_access_key_id',
                                                 'aws_secret_access_key')
            except(Exception) as error:
                print(error)
                self.connection = None
    
    
        def upload_file(self, file_to_upload_path, file_name):
            if file_to_upload is None or file_name is None: return False
            try:
                pprint(file_to_upload)
                file_name = "your-folder-inside-s3/{0}".format(file_name)
                self.connection.Bucket(self.BUCKET).upload_file(file_to_upload_path, 
                                                                          file_name)
                print("Upload Successful")
                return True
    
            except FileNotFoundError:
                print("The file was not found")
                return False
    
            except NoCredentialsError:
                print("Credentials not available")
                return False
    
    

    여기에는 BUCKET const, file_to_uploadfile_name의 세 가지 중요한 변수가 있습니다.

    BUCKET: S3 버킷의 이름입니다.

    file_to_upload_path: 업로드하려는 파일의 경로 여야합니다.

    file_name: 버킷의 결과 파일 및 경로 (폴더를 추가하는 위치 또는 기타 항목)

    여러 가지 방법이 있지만 다음과 같은 다른 스크립트에서이 코드를 재사용 할 수 있습니다.

    import S3
    
    def some_function():
        S3.S3().upload_file(path_to_file, final_file_name)
    당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
    Licensed under cc by-sa 3.0 with attribution required.