2017-08-16 71 views
0

我遇到了一個突然出現的與我一直在Heroku應用中使用的s3設置有關的問題。我用這個教程(https://devcenter.heroku.com/articles/s3-upload-node),並一切與此代碼爲後端工作:Direct-to-S3上傳錯誤

const AWS = require('aws-sdk'); 
const awsconfig = new AWS.Config({ 
    accessKeyId: process.env.AWS_KEY, 
    secretAccessKey: process.env.AWS_SECRET, 
    region: 'us-east-1' 
}); 
const s3 = new AWS.S3({ 
    params: { Bucket: process.env.S3_BUCKET } 
}); 

router.get('/sign-s3', function(req, res) { 
    const fileName = req.query['file-name']; 
    const fileType = req.query['file-type']; 
    const s3Params = { 
    Key: fileName, 
    Expires: 60, 
    ContentType: fileType, 
    ACL: 'public-read' 
    }; 

    s3.getSignedUrl('putObject', s3Params, function(err, data) { 
    if(err){ 
     console.log(err); 
     return res.end(); 
    } 
    const returnData = { 
     signedRequest: data, 
     url: `https://${process.env.S3_BUCKET}.s3.amazonaws.com/${fileName}` 
    }; 
    res.write(JSON.stringify(returnData)); 
    res.end(); 
    }); 
}); 

的問題,這是可以正常使用上傳用戶的個人資料圖片,直到我試圖用另一個相同的設置應用。由於應用程序共享數據,因此我運行了三個Heroku應用程序,都需要使用同一個存儲桶進行上載。當我嘗試使用相同的設置(包括重複使用AWS密鑰和AWS祕密)這兩個應用程序開始拋出這個錯誤,當我試圖上傳:

{ 
[CredentialsError: Missing credentials in config] 
    message: 'Missing credentials in config', 
    code: 'CredentialsError', 
    errno: 'ECONNREFUSED', 
    syscall: 'connect', 
    originalError: { 
    message: 'Could not load credentials from any providers', 
    code: 'CredentialsError', 
    errno: 'ECONNREFUSED', 
    originalError: { 
     code: 'ECONNREFUSED', 
     errno: 'ECONNREFUSED', 
     message: 'connect ECONNREFUSED *IP LISTED HERE*' 
    } 
    } 
} 

其結果是,無論返回undefined JSON的前置式應用程序的結尾。我嘗試過幾種不同的方式重新配置存儲桶的權限,並且還創建了一個單獨的IAM用戶配置文件,以便與第二個應用程序一起使用,但我仍然無法讓任何一個人再次接受上傳。有沒有人有任何想法可能會造成這種情況?我唯一的猜測是,通過允許應用程序共享AWS密鑰,我創建了某種權限錯誤,但我不知道如何去修復它。

一如既往,任何幫助表示讚賞 - 謝謝!

+0

儘管可以說並不是最佳實踐,但在多個應用程序中使用相同的憑據並不會使事情停止工作。是否有可能讓你的環境混亂,以至於'process.env.S3_BUCKET'現在返回一個不正確的值?顯示的IP地址是什麼?你知道嗎? –

+0

@ Michael-sqlbot我可以看到,也許用新的設置,但第一個應用程序工作正常,並且一直保持不變,所以這是真正令我困惑的。一旦我向其他應用程序添加相同的憑據,它只會停止工作。我無法找到我使用的S3實例的IP,所以我不知道如何檢查,但是當我記錄桶名時,這一切似乎都是正確的。 – Chris

+0

@ Michael-sqlbot其實只是想通了......只是我的運氣,但Heroku教程似乎已經在這個項目的中間字面更新。顯然,AWS的KEY和SECRET變量現在在s3初始化時自動加載,所以我的猜測是我試圖用'新的AWS.Config'來定義它們是什麼讓一切變得糟糕。再次感謝您的幫助! – Chris

回答

0

對於那些可能使用舊版Heroku教程的人而言,問題在於它已被更新,現在AWS config vars自動加載new.aws.S3();

所以將它們定義爲我上面:

const awsconfig = new AWS.Config({ 
    accessKeyId: process.env.AWS_KEY, 
    secretAccessKey: process.env.AWS_SECRET, 
    region: 'us-east-1' 
}); 

被扔的錯誤 - 可能覆蓋它已經設定的增值經銷商。希望這可以幫助別人!