我在使用Heroku应用程序时遇到过直接问题,直接进行了s3设置。我使用了本教程(https://devcenter.heroku.com/articles/s3-upload-node),并且已经将所有代码都用于后端:
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 Key和AWS密码),当我尝试上传时,BOTH应用就开始抛出此错误:
{
[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*'
}
}
}
结果,两者都将未定义的json返回到应用程序的前端。我尝试了几种不同的方式重新配置存储桶的权限,并创建了一个单独的IAM用户配置文件,以便与第二个应用程序一起使用,但我仍然无法让任何一个人再次接受上传。有谁知道可能导致这种情况的原因是什么?我唯一的猜测是,通过允许应用程序共享AWS密钥,我创建了某种权限错误,但我不确定如何修复它。
一如既往,感谢任何帮助 - 谢谢!
答案 0 :(得分:0)
对于那些可能使用较旧版本的Heroku教程的人来说,问题是它已经更新,现在AWS配置变量会自动加载到new.aws.S3();
。
所以按照上面的定义来定义它们:
const awsconfig = new AWS.Config({
accessKeyId: process.env.AWS_KEY,
secretAccessKey: process.env.AWS_SECRET,
region: 'us-east-1'
});
抛出错误 - 可能会覆盖已设置的变量。希望这有助于某人!