首页 > 解决方案 > 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. 谁能告诉我我做错了什么?有没有一种方法可以让我至少获得有关正在发生的事情的更多信息?

标签: node.jsamazon-web-servicesamazon-s3aws-lambda

解决方案


事实证明,您可以在没有您的 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

推荐阅读