使用aws-sdk-js通过云端分发进行S3分段上传

时间:2015-07-28 21:11:02

标签: javascript amazon-web-services amazon-s3

我正在尝试使用cloudfront作为端点进行分段上传,我知道这是可能的(https://github.com/aws/aws-sdk-js/issues/423),而且我还在aws-sdk-js的Github上打开了一张票,我不知道我是否遗漏了一些配置选项,或其他什么,但我无法使用aws sdk多部分上传功能通过Cloufront上传,我总是在PUT请求上获得503。

<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<AWSAccessKeyId>...</AWSAccessKeyId>
<StringToSign>POST

application/octet-stream; charset=UTF-8

x-amz-acl:private
x-amz-date:Tue, 28 Jul 2015 15:22:01 GMT
x-amz-user-agent:aws-sdk-js/2.1.40
/bucket-name/test_797965294</StringToSign>
<SignatureProvided>...</SignatureProvided>
<StringToSignBytes>....</StringToSignBytes><RequestId>7488F0A2F70E4AC5</RequestId>
<HostId>...</HostId>
</Error>

我正在使用以下代码启动多部分上传:

AWS.config.update({
    accessKeyId: 'XXXXXXXXXXXXXXXXX',
    secretAccessKey: 'XXXXXXXXXXXXXXXXXX'
});

var s3Client = new AWS.S3({
    endpoint: 'XXXXXXXX.cloudfront.net',
    s3BucketEndpoint: true,
    region: 'eu-west-1'
});

var TEMP_filename = 'test_' + Math.floor(1000000000*Math.random());

var params = {
    Bucket: 'bucket-name',
    Key: TEMP_filename, 
    ACL: 'private'
};

s3Client.createMultipartUpload(params, function(err, data) {
    if (err) {
        console.log(err, err.stack); // an error occurred
    } else {
        console.log(data);           // successful response
    }
});

结果是: Network output from google console

Request detail

我是否遗漏了客户端配置中的内容?

值得一提的是,在使用AWS.S3.ManagedUpload时,几乎所有内容都能正常运行。如果文件大小小于进行分段上传所需的文件大小,一切正常,但是当切换到分段上传时,一切都会中断。它总是在POST请求上,PUT请求似乎工作正常。

这似乎有用的唯一方法是使用putObject,使用此函数我没有任何问题,但我需要恢复支持,而这只能通过分段上传来实现。< / p>

BTW,我正在使用最新版本的SDK:aws-sdk-js / 2.1.40

1 个答案:

答案 0 :(得分:1)

有人回复了我在github(https://github.com/aws/aws-sdk-js/issues/669)上打开的故障单,这个问题是云端的错误配置。

要启用分段上传,我们需要在Cloudfront Web分发上配置转发查询字符串。

启用此功能并等待部署Cloudfront发行版后,一切都运行良好。