Quiero usar eventos S3 para publicar en AWS Lambda cada vez que se carga un archivo de video (.mp4), para que pueda comprimirse. El problema es que la ruta al archivo de video se almacena en RDS, por lo que quiero que la ruta siga siendo la misma después de la compresión. Por lo que he leído, reemplazar el archivo volverá a llamar al evento Object Created
que conduce a un bucle infinito.
¿Hay alguna forma de reemplazar el archivo sin desencadenar ningún evento? ¿Cuáles son mis opciones?
Tienes razón en que no puedes distinguir completamente. De la documentación se admiten los siguientes eventos:
s3:ObjectCreated:Put
se creó un objeto mediante una operación HTTP PUT.s3:ObjectCreated:Post
la operación HTTP POST creó un objeto.s3:ObjectCreated:Copy
se creó un objeto en una operación de copia de S3.s3:ObjectCreated:CompleteMultipartUpload
se creó un objeto al completar una carga de varias partes de S3.s3:ObjectCreated:*
: un objeto fue creado por uno de los tipos de eventos enumerados anteriormente o por un evento de creación de objetos similar agregado en el futuro.s3:ReducedRedundancyObjectLost
se ha perdido un objeto de S3 almacenado con Redundancia reducida.La arquitectura que generalmente vería para este tipo de problema es tener 2 cubos S3
Al hacer esto, puede almacenar el original y volver a ejecutarlo si es necesario para la autocorrección.
Hay una solución desagradable a este problema, que no está documentada en ninguna parte.
El parámetro de event
en la función Lambda contiene un dict userIdentity
que contiene principalId
. Para un evento que se originó debido a AWS Lambda (como actualizar el objeto S3 como se menciona en la pregunta), este principalId
contiene el nombre de la función lambda adjunta al final.
Por lo tanto, al verificar el principalId
se puede deducir si el evento proviene de Lambda o no y, en consecuencia, si se comprime o no.