我遇到了一个突然出现的与我一直在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