节点:上传到S3仅在第一个路径上失败

时间:2017-10-27 02:31:31

标签: node.js amazon-web-services amazon-s3 amazon-ec2

我在节点中使用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自动加载的,并且该存储分区设置为允许来自该角色的GETPUT

1 个答案:

答案 0 :(得分:1)

虽然我不能肯定地说这是问题所在,但文档中有一个警告,特别提到IAM角色:

  

注意:如果同步调用此方法(没有回调),则必须确保拥有静态或先前已解析的凭据,否则可能无法正确签署请求。如果您不能保证这一点(您使用的是异步凭据提供程序,即EC2 IAM角色),则应始终使用异步回调调用此方法。

     

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property

这将在后续运行中自行解决,因为获取角色凭据的异步尝试可能在第二次调用后在后台成功。