Verificare la presenza di più eventi s3 per attivare lambda quando tutti sono soddisfatti?

Aug 22 2020

Ho una funzione step che esegue una serie di funzioni lambda. Vorrei impostare un lambda che lo attivi ogni giorno quando TUTTI i 3 file di input sono stati aggiornati.

So che puoi attivare gli eventi s3, ma come posso avere il requisito che tutti e tre debbano essere stati aggiornati? Cioè, non voglio che il trigger si attivi su nessuno dei tre eventi (condizione "o"), voglio che si attivi quando tutti e tre sono stati aggiornati (condizione "e").

Come mi avvicinerei all'impostazione di un tale evento trigger?

Grazie

Risposte

1 JohnRotenstein Aug 22 2020 at 05:45

Non è possibile definire un trigger che dica "esegui solo dopo che questi 3 file sono stati caricati".

Dovresti implementare tu stesso questa logica.

I caricamenti attiverebbero una funzione AWS Lambda. Questa funzione dovrebbe verificare l'esistenza degli altri due file. Se sono presenti, dovrebbe continuare l'elaborazione. Se non sono presenti, dovrebbe uscire.

1 CK__ Aug 22 2020 at 09:37

Come se ora non esistesse un modo diretto per tigare Lambda sulla base di tali condizioni. Devi scrivere la tua logica in un lambda separato che attiverà la tua funzione step.

Puoi fare riferimento qui su come attivare una Step Function da Lambda.

Ora, arrivando al punto sulla logica nel tuo Lambda che controllerà i tuoi file. Qui, credo che tu conosca tutti quei tre file o almeno conosci il prefisso del file, quindi ogni volta che un file viene caricato su S3 puoi controllare in Lambda se ci sono tre file o meno. Puoi attivare la macchina a stati direttamente da Lambda se vengono trovati tutti e tre i file altrimenti puoi fermarti lì da solo. Una volta completata l'esecuzione di Step Machines, puoi ripulire quei tre file o puoi rinominarli in qualcos'altro oppure puoi spostare quei file in una "cartella" diversa in modo che la prossima volta che carichi uno di questi tre file il tuo lambda lo faccia non attiva la macchina a stati.

L'altra logica a cui potrei pensare è caricare tutti questi file insieme come file zip. Una volta che lo zip è stato caricato su S3, il tuo lambda riceve una notifica, elabora lo zip ed estrae tutti e tre i file, esegue alcune elaborazioni e attiva la macchina a stati con i dati elaborati.

LXandor Aug 23 2020 at 04:25

Ecco la soluzione che ho finito di usare. Sto usando un singolo lambda con un trigger per ogni file. Per ogni trigger, lambda aggiunge il nome del file che lo ha attivato a un file memorizzato su s3. Quindi controlla se il file ha tutti i nomi di file richiesti per continuare. Se lo fa, dà il via alla funzione step e cancella l'elenco. Sto catturando il nome del file che attiva il lambda dall'oggetto evento che viene passato per impostazione predefinita tramite lambda_function(event,context).

Quindi in un dato giorno, lo stesso lambda viene attivato più volte, registrando ogni volta il nome del file fino a quando non li ha raccolti tutti.