Soy nuevo en AWS. Estoy creando una función lambda programada usando NodeJS. Allí necesito obtener todos los objetos en una carpeta e iterar a través de cada uno, para verificar la última fecha de modificación y quiero eliminar los objetos antiguos. Pero obtengo una matriz vacía en el contenido de respuesta de ListObject.
var s3 = new aws.S3(); exports.handler = (event, context, callback) => { var params = { Bucket: 'bucket_name', Delimiter: '/', Prefix: 'folder_name', MaxKeys:100000 }; s3.listObjects(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else { var folderLength = data.Contents.length; data.Contents.forEach(function(metadata) { console.log('Key: ' + metadata.Key); }); } }); callback(null, 'Finished'); }; Pero en la respuesta obtengo Contents: [] . ¿Alguien puede decirme qué está mal?
Cuando llama a ListObjects() con Delimiter: '/' , hay dos matrices de interés dentro de data : Contents y CommonPrefixes .
Contents es la lista de objetos que comienzan con el valor de Prefix que especificó hasta el siguiente CommonPrefixes Delimiter una lista de los prefijos comunes a todos los objetos con el prefijo de Prefix , hasta la próxima aparición de Delimiter incluida. (que es / por convención).
S3 en realidad no tiene carpetas, solo objetos que comparten prefijos comunes, delimitados con / .
Cuando crea una carpeta foo en la consola S3, en realidad se crea un objeto vacío con una clave de foo/ . Sin embargo, si carga un objeto con la clave foo/bar.html usando la API, la consola, por conveniencia, aún lo mostrará como un archivo bar.html dentro de una carpeta llamada foo , aunque en este último caso, no foo/ object fue creado explícitamente. Significativamente, en ninguno de los casos el objeto está realmente "en" un contenedor de "carpeta" significativo. Sólo se presenta de esa manera. S3 no tiene carpetas reales, solo objetos y cubos.
Si desea que todos los objetos estén "en una carpeta", lo que realmente está diciendo es que desea que los objetos compartan un prefijo de clave común.
Pero cuando S3 proporciona una lista de todos los objetos que comparten el prefijo de clave común "folder_name" hasta el siguiente / (como se indicó anteriormente), entonces no hay ninguno.
En su código original, Contents está vacío, pero habría encontrado que data.CommonPrefixes en la respuesta contenía un solo valor, folder_name/ , porque todos los objetos cuyas claves comienzan con folder_name hasta el siguiente / en realidad comparten el prefijo común folder_name/ .
No tiene sentido hacer dos solicitudes siendo la primera redundante e innecesaria (y, de hecho, hacerlo le dará resultados incorrectos si más de una carpeta tiene un nombre que comienza con "folder_name"), así que cuando quiera una lista de objetos "en una carpeta", el enfoque correcto es establecer el Prefix en folder_name + '/' .