我遇到了一個突然出現的與我一直在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密鑰,我創建了某種權限錯誤,但我不知道如何去修復它。
一如既往,任何幫助表示讚賞 - 謝謝!
儘管可以說並不是最佳實踐,但在多個應用程序中使用相同的憑據並不會使事情停止工作。是否有可能讓你的環境混亂,以至於'process.env.S3_BUCKET'現在返回一個不正確的值?顯示的IP地址是什麼?你知道嗎? –
@ Michael-sqlbot我可以看到,也許用新的設置,但第一個應用程序工作正常,並且一直保持不變,所以這是真正令我困惑的。一旦我向其他應用程序添加相同的憑據,它只會停止工作。我無法找到我使用的S3實例的IP,所以我不知道如何檢查,但是當我記錄桶名時,這一切似乎都是正確的。 – Chris
@ Michael-sqlbot其實只是想通了......只是我的運氣,但Heroku教程似乎已經在這個項目的中間字面更新。顯然,AWS的KEY和SECRET變量現在在s3初始化時自動加載,所以我的猜測是我試圖用'新的AWS.Config'來定義它們是什麼讓一切變得糟糕。再次感謝您的幫助! – Chris