AWS Lambda S3 GET/POST - SignatureDoesNotMatch 错误
AWS Lambda S3 GET/POST - SignatureDoesNotMatch error
我已经使用了 Lambda node.js 功能和 运行 大约 6 个月没有任何问题。该函数只是获取一个对象并将其从一个存储桶复制到另一个存储桶。
今天,我开始得到:
"SignatureDoesNotMatch: The request signature we calculated does not
match the signature you provided. Check your key and signing method."
我使用的代码非常简单,关于如何解决这个问题有什么建议吗?
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.
中显示一个子文件夹
我找到了解决这个问题的办法。在意识到这是由于存储桶内的文件夹,而不仅仅是发送到存储桶根目录之后,我搜索并找到以下 post: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
};
我已经使用了 Lambda node.js 功能和 运行 大约 6 个月没有任何问题。该函数只是获取一个对象并将其从一个存储桶复制到另一个存储桶。
今天,我开始得到:
"SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method."
我使用的代码非常简单,关于如何解决这个问题有什么建议吗?
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.
中显示一个子文件夹我找到了解决这个问题的办法。在意识到这是由于存储桶内的文件夹,而不仅仅是发送到存储桶根目录之后,我搜索并找到以下 post: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
};