node.js - s3.deleteObject 没有响应错误或成功
问题描述
我使用 presignedUrl 将文件上传到 S3:my-bucket/utp。创建对象时,s3 会触发一个事件并调用我的 lambda 函数。
然后我调用 getObject,这样我就可以对内容进行哈希处理,以确保这个新上传的文件不是我的存储桶中已经存在的文件的副本。如果它是副本,我将其删除。至少那是我想做的。
这是我的删除代码:
// If the utp file is already in the system we need to delete it.
async function deleteUTPFile(srcBucket, srcKey, callback){
try {const params = {Bucket: srcBucket,Key: srcKey};
console.log("DeleteObject params "+JSON.stringify(params));
await s3.deleteObject(params, function(err, data){
if(err){
console.log("DeleteObject Error "+err);
return callback(err);
}else{
console.log("Successful delete "+ JSON.stringify(data));
return callback(null, data);
}
}).promise();
} catch (error) {
console.log("Caught error "+ error.message);
return callback(error);
}
}
我的第一次尝试没有等待/承诺,但它没有那样工作,所以我这样尝试。
如您所见,在我拨打电话之前以及在错误块和成功块中之后,我都有一个 console.log。但是当我查看日志时,我看到的只是之前的日志,然后整个 lambda 结束:
2020-06-23 INFO doesObjectAlreadyExist true
2020-06-23 INFO DeleteObject params {"Bucket":"<my-bucket>","Key":"utp/Ego_is_the_Enemy.pdf"}
END RequestId: 5401b756-0869-4400-8dc0-7d3b0f02b681
我不应该至少在某处得到一些错误信息吗?在 lambda 的早期,我已经完成了一个 s3.getObject 和一个 s3.headObject,所以我知道我可以到达 s3。
版本控制被禁用。
我的帐户有权限
我知道 s3 具有最终的一致性。已经至少2个小时了。可能 3. 谁能告诉我我做错了什么?有没有一种方法可以让我至少获得有关正在发生的事情的更多信息?
解决方案
事实证明,您可以在没有您的 secretAccessKey 的情况下执行 getObject 和 headObject sdk 调用,但您不能执行 deleteObject。
有人会认为可以通过简单的错误消息来处理,但似乎并非如此。我们将凭证保存在秘密管理器中。我添加了这个方法:
async function setConfig(){
await secrets.getSecretValue({SecretId: secretName}, function(err, secretValue){
if (err) {
throw err;
} else {
// success getting SecretValue
if ('SecretString' in secretValue) {
secret = JSON.parse(secretValue.SecretString);
} else {
let buff = new Buffer(secretValue.SecretBinary, 'base64');
secret = JSON.parse(buff.toString('ascii'));
}
AWS.config.update({accessKeyId : secret.accessKeyID, secretAccessKey : secret.secretAccessKey});
}
});
}
现在一切都在按应有的方式进行。:-)
2020-06-23 INFO ObjectKey utp/Ego_is_the_Enemy.pdf
2020-06-23 INFO Successful delete {}
2020-06-23 INFO Success deleteing UTP file