2017-08-16 72 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' 
}); 

被扔的错误 - 可能覆盖它已经设定的增值经销商。希望这可以帮助别人!