AWS Lambda S3 GET/POST - SignatureDoesNotMatch 错误

2023-12-19

我的 Lambda node.js 函数已经启动并运行了大约 6 个月,没有出现任何问题。该函数只是获取一个对象并将其从一个存储桶复制到另一个存储桶。

今天,我开始得到:

“SignatureDoesNotMatch:我们计算的请求签名不匹配 与您提供的签名相符。检查您的密钥和签名方法。”

我使用的代码非常简单,关于如何解决这个问题有什么建议吗?

var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});

exports.handler = function(event, context) {

  var to_bucket = 'my_to_bucket/test';
  var from_bucket = event.Records[0].s3.bucket.name;
  var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
  var size = Math.floor(event.Records[0].s3.object.size / 1024);

  s3.getObject({Bucket: from_bucket, Key: key}, function(err, data) {
    if (err) {
      // send a webhook
    } 
    else {
      s3.putObject({Bucket: to_bucket, Key: key, Body: data.Body, ContentType: data.ContentType}, 
      function(err, data) {
        if (err) {
          // send a webhook
        }
        else {
          // send a webhook
        }
      });
    } // end else
  }); // end getobject
};

更新: 我发现如果发送到存储桶,效果很好。如果我发送到同一存储桶的任何子文件夹,它就会失败。我确实发送到一个子文件夹并最初简化了上面的代码,但我已经更新它以显示 to_bucket 中的子文件夹。


我找到了解决这个问题的方法。在意识到这是由于存储桶内的文件夹造成的,而不仅仅是发送到存储桶根目录后,我搜索并找到了以下帖子:https://github.com/aws/aws-sdk-go/issues/562 https://github.com/aws/aws-sdk-go/issues/562

看起来存储桶不应该包含子文件夹,而密钥应该包含。为什么这种方法至今有效仍然是个谜。这是上面的替换代码:

var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});

exports.handler = function(event, context) {

  var to_bucket = 'my_to_bucket';
  var from_bucket = event.Records[0].s3.bucket.name;
  var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
  var size = Math.floor(event.Records[0].s3.object.size / 1024);

  s3.getObject({Bucket: from_bucket, Key: key}, function(err, data) {
    if (err) {
      // send a webhook
    } 
    else {
      key = 'subfolder/' + key;
      s3.putObject({Bucket: to_bucket, Key: key, Body: data.Body, ContentType: data.ContentType}, 
      function(err, data) {
        if (err) {
          // send a webhook
        }
        else {
          // send a webhook
        }
      });
    } // end else
  }); // end getobject
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Lambda S3 GET/POST - SignatureDoesNotMatch 错误 的相关文章

随机推荐