Extraigo objetos usando la función s3.listObjects() de AWS-SDK y sigo recibiendo el siguiente error:
/nodeapp/node_modules/aws-sdk/lib/request.js:31Seguido por
Error: Missing credentials in config at IncomingMessage.<anonymous> (/nodeapp/node_modules/aws-sdk/lib/util.js:863:34) at emitNone (events.js:91:20) at IncomingMessage.emit (events.js:186:7) at endReadableNT (_stream_readable.js:974:12) at _combinedTickCallback (internal/process/next_tick.js:74:11) at process._tickDomainCallback (internal/process/next_tick.js:122:9) Esto no cuadra porque tengo una ruta diferente (downloadParam) que recupera un objeto de S3 sin darme este error. Además, cuando cierro la sesión de los objetos recuperados de la ruta downloadResults , parece que los objetos se recuperaron sin problemas, pero aún recibo este error.
He pasado horas en este problema y parece que no puedo entender por qué ocurre esto. He pegado por código para ambas rutas a continuación, la que funciona y la que no. Por lo que obtuve en línea, esto parece ser más un problema de código que un problema de credenciales de AWS-SDK.
downloadParam: function(app, s3){ app.use('/api', apiRoutes) apiRoutes.get('/download-param-file', function(req, res, next){ res.set({'Content-Type':'text/csv'}) s3.getObject({Bucket: 'some-bucket', Key: 'some-key' + req.query.fileName}, function(err, file){ if (err) { console.log(err); return next(err); } else { return res.send(file.Body.toString()); } }) }) }, downloadResults: function(app, s3){ app.use('/api', apiRoutes) apiRoutes.get('/download-results-file', function(req, res, next){ res.set({'Content-type': 'application/zip'}) var params = { Bucket: 'some-bucket', Delimiter: '/', Prefix: 'some-key' }; var filesArray = [] var files = s3.listObjects(params).createReadStream() var xml = new XmlStream(files) xml.collect('Key') xml.on('endElement: Key', function(item) { filesArray.push(item['$text'].substr(params.Prefix.length)) }) xml.on('end', function() { res.send(zip(filesArray, req.query.jobName, params)) }) }) } A partir de ahora, downloadParams funciona como se esperaba, pero downloadResults no. Cualquier ayuda sería tremendamente apreciada.
No estás autenticando la llamada. El depósito no tiene permisos para listar objetos sin autenticación, mientras que sí tiene permiso para descargar archivos específicos sin autenticación.
Consulte la documentación de Amazon sobre cómo agregar credenciales de manera segura a la instancia.
Esencialmente,
var creds = AWS.Credentials(); creds.accessKeyId = 'AKIAIOSFODNN7EXAMPLE'; creds.secretAccessKey = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; AWS.config.credentials = creds;