2016-01-22 90 views
1

我使用lambda函數創建一個URL presigned上傳到S3:與S3 putObject presigned網址無效簽名

var crypto = require('crypto'); 
var AWS = require('aws-sdk'); 

AWS.config.region = 'eu-west-1'; 

function randomValueHex (len) { 
    return crypto.randomBytes(Math.ceil(len/2)) 
     .toString('hex') // convert to hexadecimal format 
     .slice(0,len); // return required number of characters 
} 

var value1 = randomValueHex(12) 

exports.handler = function(event, context) { 
    var key = randomValueHex(16); 
    // Url is 
    var s3 = new AWS.S3(); 
    var params = {Bucket: 'somebucket', Key: key }; 
    var url = s3.getSignedUrl('putObject', params); 
    context.succeed({ key: key, url: url }); 
} 

然後用該網址我試圖做一個PUT調用與httpie:

echo "something" | http -v PUT https://...presigned url 

但我得到:

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

拉姆達一個完整的S3訪問執行角色運行,但權限不應該是這裏的問題

更新:試圖上載沒有Content-Type頭文件正常工作:

http -v PUT https://...url 

如此看來,這個問題是與內容類型,但因爲我不指定它,我認爲AWS不打擾,如果我上傳一個JSON或其他任何東西

回答

0

在簽名版本2,至少,Content-Type標頭的值是簽名算法的組成部分...所以如果getSignedUrl不知道你是什麼將會放在那裏,它會產生一個無效的簽名。

你應該能夠在此添加params的鍵/值對:

ContentType, 'text/plain' // using the appropriate mine type string 
+0

這是問題,謝謝! – alex88