Cómo cargar un archivo al directorio en S3 bucket utilizando boto

Quiero copiar un archivo en el cubo s3 usando python.

Ej: Tengo nombre de cubo = prueba. Y en el cubo, tengo 2 carpetas con el nombre “dump” y “input”. Ahora quiero copiar un archivo del directorio local a la carpeta “dump” de S3 usando python … ¿Alguien puede ayudarme?

Prueba esto…

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) 

[ACTUALIZACIÓN] No soy un python, así que gracias por la información sobre las declaraciones de importación. Además, no recomendaría colocar credenciales dentro de su propio código fuente. Si está ejecutando esto dentro de AWS, use las credenciales IAM con perfiles de instancia ( http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html ), y para mantener el mismo comportamiento en su entorno Dev / Test, use algo como Hologram de AdRoll ( https://github.com/AdRoll/hologram )

No hay necesidad de hacerlo tan complicado:

 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) 

Utilicé esto y es muy simple de implementar.

 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/

 import boto3 s3 = boto3.resource('s3') BUCKET = "test" s3.Bucket(BUCKET).upload_file("your/local/file", "dump/file") 
 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) 

Esto también funcionará:

 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" 
 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) 

Este es un trazador de líneas de tres. Solo sigue las instrucciones en la documentación de 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') 

Algunos argumentos importantes son:

Parámetros:

  • Nombre de archivo ( str ): la ruta al archivo que se va a cargar.
  • Bucket ( str ): el nombre del contenedor que se va a cargar.
  • Clave ( str ): el nombre que desea asignar a su archivo en su cubeta s3. Este podría ser el mismo que el nombre del archivo o un nombre diferente de su elección, pero el tipo de archivo debe ser el mismo.
  • Nota: Supongo que ha guardado sus credenciales en una carpeta ~\.aws como se sugiere en las mejores prácticas de configuración en la documentación de boto3 .

    Subir archivo a s3 dentro de una sesión con credenciales.

     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') s3.meta.client.upload_file(Filename='input_file_path', Bucket='bucket_name', Key='s3_output_key') 

    Para cargar el ejemplo de la carpeta como el siguiente código y la imagen de la carpeta S3 introduzca la descripción de la imagen aquí

     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) 

    PS: Para más URL de referencia

     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 = '.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')