Lak*_*kar 2 cloud amazon-s3 amazon-web-services aws-lambda
我正在尝试获取预签名 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);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我从请求中获取文件名、文件类型(MIME)并使用它来创建签名。
2. 获取预签名 URL 当我点击 Lambda 时,我得到了预签名 URL。现在,我将使用此 URL 将文件上传到 S3。
3. 使用文件点击 URL (PUT)
现在,我使用 HTTP 方法访问 URL 并添加文件(二进制),请参阅我的 Postman 请求:
您可以看到我使用PUT HTTP 方法发出了请求。我收到 403 错误。以下是请求中的标头,您可以看到内容类型是image/jpeg:
当我尝试POST方法时,我发现签名无效。我猜这是因为签名是为 PUT 方法签名的。
以下是 S3 存储桶的设置:
由于我的访问被拒绝,我完全打开了存储桶,我的意思是Block Public access: off。
设置有什么问题?也许是S3?
您在变量中有一个服务对象s3,但您没有在代码中显示该对象的构造位置...但它似乎是在您调用之前AWS.config.update(),这不会追溯性地重新配置您的s3对象。这些操作的顺序是问题所在。
您对全局
AWS.config对象所做的更新不会应用于之前创建的服务对象。https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/global-config-object.html
如果仔细观察生成的 URL,您会发现实际上正在使用 Lambda 执行角色凭据,这就是访问被拒绝的原因。
赠品是 URL 中的 AWSAccessKeyId 不是您的,它是一个以 开头的会话密钥,ASIA而不是AKIA像普通的访问密钥 ID。x-amz-security-token此外,使用静态凭据生成的 URL 中不会存在会话令牌。此外,此 URL 是 Signature V2,因此当您更正凭证配置问题时,签名 URL 的格式将发生显着变化。签名 V4 URLX-Amz-Credential的AWSAccessKeyId.
| 归档时间: |
|
| 查看次数: |
2786 次 |
| 最近记录: |