buscar el último archivo en una carpeta y subirlo a s3?

1

La variable de nombre de archivo se usa para obtener el nombre del último archivo. Mi objetivo es monitorear una carpeta y cada vez que se recupera un archivo nuevo, cargarlo automáticamente en el depósito s3 usando boto3.

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from subprocess 
import call
import os
import boto3

session = boto3.Session (aws_access_key_id = 'aws_access_key_id', aws_secret_access_key = 'aws_secret_access_key', region_name = 'region_name')

s3 = session.client ('s3')

class Watcher:
    def __init__(self):
        self.dir = os.path.abspath('D:\\project')
        self.observer = Observer()

    def run(self):
        event_handler = Handler()
        self.observer.schedule(event_handler, self.dir, recursive=True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print("Error")

        self.observer.join()   

    class Handler(FileSystemEventHandler):
        @staticmethod
        def on_any_event(event):
            if event.is_directory:
                return None

        elif event.event_type == 'created':
        print("Received created event - %s." % event.src_path)
        s3.upload_file(Filename=event.src_path, bucket='bucketname, key=test-file-1)

if __name__ == '__main__':
    w = Watcher()
    w.run()

FileNotFoundError: [WinError 2] El sistema no puede encontrar el archivo especificado

2
  • s3.meta.client.upload_file(Filename, Bucket = 'aaaaa', Key='test-file-1')por sí solo debería funcionar. ¿Esa línea genera algún tipo de error? El call([command], shell=True)no tiene ningún sentido y debe ser eliminado, parece que has algo seriamente mal entendido. 14/09/19 a las 14:47
  • Me perdí una línea en la que estoy almacenando el último archivo en una variable. 15 de septiembre de 2019 a las 15:30
0

No estoy seguro de si está haciendo esto para aprender Python (boto3). Si es así, felicidades. De lo contrario, AWS ya proporcionó dicha función . Por lo tanto, mantiene todo en su código, pero paga a la AWS CLI.

0

Como @alexhall mencionó en el comentario, el método s3.meta.client.upload_file cargará un archivo. Puede leer sobre la documentación del método de carga del cliente boto3 s3 aquí: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_file . Sin embargo, es un ejemplo un poco tonto que tienen allí, ya que primero están creando un recurso s3 en lugar de un cliente s3, y luego, debido a que el recurso s3 en realidad no tiene un método para cargar archivos, vuelven al cliente s3. También puede crear y utilizar directamente el cliente s3 para las cargas.

También confía en el hecho de que boto3 usa la sesión predeterminada cuando crea el recurso s3 como lo hizo:

boto3.resource ('s3')

Esto funcionaría bien si está ejecutando el código en lambda o si está en una instancia ec2 que tiene un rol de IAM configurado para que acceda a s3, pero creo que lo está ejecutando fuera de AWS, en cuyo caso, puede tener un boto3 .Session () creada primero con sus credenciales, y luego un cliente (o recurso) puede usar esa sesión.

aws_access_key_id = '<AWS_ACCESS_KEY_ID>'
aws_secret_access_key = '<AWS_SECRET_ACCESS_KEY>'
region_name = 'us-east-1'

session = boto3.Session(aws_access_key_id=aws_access_key_id,
                                aws_secret_access_key=aws_secret_access_key,
                                region_name=region_name)

s3 = session.client('s3')

Puede leer sobre la configuración de la sesión aquí: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html

Como se mencionó anteriormente, debido a que está intentando cargar un archivo, y parece que no hace nada más con él, también puede crear directamente un cliente s3 en lugar de un recurso s3 como lo hizo y luego obtener el cliente s3 usando 'meta. cliente'.

en lugar de command = ...línea, simplemente usa:

s3.upload_file(Filename, Bucket = 'aaaaa', Key='test-file-1')

Puede eliminar la última línea. 'Llamaría' si estuviera ejecutando un comando del sistema operativo / sistema en lugar de algo dentro de Python.

0