我在节点中使用aws-sdk
让我的webapp与aws s3桶对话。当试图在一段时间内第一次将文件上传到s3时,它会失败;如果我试图立即再次上传,它可以工作。
经过一些调试后,requestUrl
似乎有问题:
第一次试用尝试直接向
发送请求 requestUrl: https://s3-ap-southeast-2.amazonaws.com/
,
当然导致403禁止错误。
其他成功请求的目标是
requestUrl: https://my-bucket.s3-ap-southeast-2.amazonaws.com/querystrings....
这是正确的网址。
现在我的问题是,为什么只有第一次审判错误requestUrl
?在服务器中,签名的URL生成为:
const s3 = new AWS.S3({
params: {
Bucket: "my-bucket",
},
});
s3.getSignedUrl('putObject', {
Key: s3Key,
ContentType: newFile.type,
ACL: 'private',
})
顺便提一下,s3存储桶的凭据是从IAM role
服务器的ec2
自动加载的,并且该存储分区设置为允许来自该角色的GET
和PUT
答案 0 :(得分:1)
虽然我不能肯定地说这是问题所在,但文档中有一个警告,特别提到IAM角色:
注意:如果同步调用此方法(没有回调),则必须确保拥有静态或先前已解析的凭据,否则可能无法正确签署请求。如果您不能保证这一点(您使用的是异步凭据提供程序,即EC2 IAM角色),则应始终使用异步回调调用此方法。
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property
这将在后续运行中自行解决,因为获取角色凭据的异步尝试可能在第二次调用后在后台成功。