2016-01-14 27 views
5

Utilizzo una funzione AWS Lambda (scritta in python) per inviare un messaggio di posta elettronica ogni volta che un oggetto viene caricato in un bucket S3 predefinito. L'oggetto viene caricato tramite AWS PHP SDK nel bucket S3 e utilizza un caricamento multipart. Ogni volta che provo il mio codice (all'interno della pagina di editor di codice Lambda) sembra funzionare bene e ottengo solo una singola email.Attivazione della funzione Lambda AWS due volte

Ma quando l'oggetto viene caricato tramite l'SDK PHP, la funzione Lambda viene eseguita due volte e invia due messaggi di posta elettronica, entrambi con ID messaggio diversi. Ho provato diversi indirizzi email ma ogni indirizzo riceve esattamente due e-mail duplicate.

Qualcuno può guidarmi dove potrei andare storto? Sto usando la libreria boto3 che viene importata con il codice Python di esempio per inviare l'e-mail.

+0

Per prima cosa puoi verificare che non stai caricando due volte. PutObject sta attivando lambda? Qual è la differenza di tempo tra le e-mail duplicate? – helloV

+0

@helloV L'oggetto viene infatti caricato una sola volta nel bucket S3. Il PutObject attiva il lambda mentre l'email viene inviata e ricevuta correttamente. Le due e-mail vengono ricevute esattamente a due secondi di distanza. –

risposta

7

Sì, abbiamo anche questo e non è collegato all'e-mail, è collegato a S3 che attiva più eventi per un singolo caricamento. Come molti sistemi di messaggistica, Amazon non garantisce "una sola consegna" delle notifiche degli eventi da S3, quindi la funzione Lambda dovrà gestirli autonomamente.

Non il massimo, ma fattibile.

Una qualche forma di cache con i dettagli delle precedenti richieste in modo da poter vedere se hai già elaborato il particolare messaggio di evento o meno.

+0

Come si fa a fare il caching all'interno di una funzione Lambda? – idbehold

+0

Forse usando qualcosa come Redis o DynamoDB. La cache dovrà sopravvivere tra le invocazioni Lambda, quindi deve essere al di fuori della funzione Lambda. – smcstewart

1

Anche io sto affrontando lo stesso problema, nel mio caso su ogni evento PUT nel bucket S3 deve essere attivato un lambda, si attiva due volte con lo stesso aws_request_id e aws_lambda_arn.

Per risolvere il problema, tenere traccia di aws_request_id (questo ID sarà univoco per ogni evento lambda) da qualche parte e controllare l'handler. Se lo stesso aws_request_id esiste allora non fare nulla, altrimenti procedere come al solito.

+0

come si memorizzerebbe il valore di x-amz-request-id per impedire l'attivazione multipla, il secondo trigger lancia un nuovo lambda che non ha alcuna variabile da confrontare. A meno che non si stia suggerendo che l'ID della richiesta deve essere memorizzato in un'istanza RDS. – Shek

Problemi correlati