【发布时间】:2020-02-24 07:55:19
【问题描述】:
我正在尝试获取 预签名 URL 以将文件上传到 S3 存储桶。这是我的工作流程:
1.调用 Lambda -> 2.获取预签名 URL -> 3.用文件点击 URL (PUT)
1.调用 Lambda
我确保 AWS 密钥具有正确的权限。实际上,它具有完全访问权限。以下是源代码:
AWS.config.update({
accessKeyId: '*****************',
secretAccessKey: '*****************',
region: 'us-east-1',
signatureVersion: 'v4'
});
let requestObject = JSON.parse(event["body"]);
let fileName = requestObject.fileName;
let fileType = requestObject.fileType;
const myBucket = 'jobobo-resumes';
s3.getSignedUrl('putObject', {
"Bucket": myBucket,
"Key": fileName,
"ContentType": fileType
}, function (err, url) {
if (err) {
mainCallback(null, err);
} else {
mainCallback(null, url);
}
}
所以,我从请求中获取文件名、文件类型(MIME)并使用它来创建签名。
2。获取预签名网址 当我点击 Lambda 时,我得到了预签名的 URL。现在,我将使用此 URL 将文件上传到 S3。
3.用文件点击 URL (PUT)
现在,我使用 HTTP 方法点击 URL 并添加文件(二进制),请参阅我的 Postman 请求:
您可以看到我使用 PUT HTTP 方法点击了请求。我收到 403 错误。这是请求中的标头,您可以看到内容类型为image/jpeg:
当我尝试 POST 方法时,我发现签名无效。我猜那是因为签名是为 PUT 方法签名的。
这是 S3 存储桶的设置:
由于访问被拒绝,我完全打开了存储桶,我的意思是Block Public access: off。
设置有什么问题?也许是S3?
【问题讨论】:
标签: amazon-web-services amazon-s3 aws-lambda cloud