当我尝试向S3 Bucket(Node.js)发送内容时,AWS缺少凭据

时间:2014-10-09 17:10:52

标签: node.js amazon-web-services amazon-s3

开平!

我从昨天起就遇到了这个问题,而且我找不到解决方案。

我试图将某些东西发送到我的S3存储桶,但是当我尝试时,此消息会显示在我的控制台中:

{ [CredentialsError: Missing credentials in config]
  message: 'Missing credentials in config',
  code: 'CredentialsError',
  errno: 'Unknown system errno 64',
  syscall: 'connect',
  time: Thu Oct 09 2014 14:03:56 GMT-0300 (BRT),
  originalError: 
   { message: 'Could not load credentials from any providers',
     code: 'CredentialsError',
     errno: 'Unknown system errno 64',
     syscall: 'connect',
     time: Thu Oct 09 2014 14:03:56 GMT-0300 (BRT),
     originalError: 
      { code: 'Unknown system errno 64',
        errno: 'Unknown system errno 64',
        syscall: 'connect',
        message: 'connect Unknown system errno 64' } } }

这是我的代码:

var s3 = new AWS.S3();
AWS.config.loadFromPath('./AwsConfig.json'); 

    s3.putObject(params, function(err) {
        if(err) {
            console.log(err);
        }
        else {
            console.log("Succes");
        }
});

凭据是正确的。有谁知道会是什么?我正在搜索,但我找不到任何解决方案。


我的凭据(假):

{
    "accessKeyId": "BLALBLALBLALLBLALB",
    "secretAccessKey": "BLABLALBLALBLALBLLALBLALLBLALB",
    "region": "sa-east-1",
    "apiVersions": {
      "s3": "2006-03-01",
      "ses": "2010-12-01"
    }
}

编辑:

求助,所有代码:

var fs = require('fs');
var AWS = require('aws-sdk');


var s3 = new AWS.S3();
AWS.config.loadFromPath('./MYPATH.json'); //this is my path to the aws credentials.


var params = {
        Bucket: 'testing-dev-2222',
        Key: file,
        Body: fs.createReadStream(file)
    };

s3.putObject(params, function(err) {
    if(err) {
        console.log(err);
    }
    else {
        console.log("Success");
    }
});

新错误:

Error uploading data:  { [PermanentRedirect: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.]
  message: 'The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.',
  code: 'PermanentRedirect',
  time: Thu Oct 09 2014 14:50:02 GMT-0300 (BRT),
  statusCode: 301,
  retryable: false }

7 个答案:

答案 0 :(得分:53)

在我颠倒两行之前,我遇到了同样的问题:

var s3 = new AWS.S3();
AWS.config.loadFromPath('./AwsConfig.json'); 

到此:

AWS.config.loadFromPath('./AwsConfig.json'); 
var s3 = new AWS.S3();

答案 1 :(得分:52)

尝试对params进行硬编码,看看是否再次出现错误:

AWS.config.update({
    accessKeyId: "YOURKEY",
    secretAccessKey: "YOURSECRET",
    "region": "sa-east-1"   <- If you want send something to your bucket, you need take off this settings, because the S3 are global. 
}); // for simplicity. In prod, use loadConfigFromFile, or env variables

var s3 = new AWS.S3();
var params = {
    Bucket: 'makersquest',
    Key: 'mykey.txt',
    Body: "HelloWorld"
};
s3.putObject(params, function (err, res) {
    if (perr) {
        console.log("Error uploading data: ", err);
    } else {
        console.log("Successfully uploaded data to myBucket/myKey");
    }
});

Good resource here

答案 2 :(得分:5)

我遇到了同样的错误。但我发现了这个问题。我使用了错误的环境变量名称。从NodeJS到S3,我需要使用以下变量名称:

process.env.AWS_ACCESS_KEY_ID = 'XXXXXXXXXXXXXXXXXXX';
process.env.AWS_SECRET_ACCESS_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXX';
process.env.AWS_REGION = 'us-east-1';

一旦我更正了变量名称,它就运行得很好。 问候, Dipankar

答案 3 :(得分:5)

尝试将我的aws配置文件中的用户从特定用户更改为[default]。

$nano .aws/credentials

[default]
aws_access_key_id = xyz
aws_secret_access_key = xyz

如果您没有此文件,请创建它并获取密钥或从aws iam用户密钥生成新密钥。

答案 4 :(得分:1)

我尝试了上面的选项,甚至没有用,所以我创建了新的配置对象,下面的代码工作

 $scope.ErrorAlert = false;
 setTimeout(function () {
      $('#ErrorAlert').fadeOut('slow');
 }, 2000);   //2 second

答案 5 :(得分:0)

尝试从根目录以外的任何位置加载配置文件时,我遇到了类似的问题。

我能够在节点中本地加载json文件,然后只将已解析的对象传递给AWS.config.update()

import AWS from 'aws-sdk'
import config from '../aws.json' 
AWS.config.update(config);

答案 6 :(得分:0)

这解决了我的问题。

  1. 使用了Cognito控制台中的示例代码并将其添加到文档的。

  2. 在身份池上启用未经身份验证的访问。

最重要

  1. 在unauth角色中修复了信任关系策略,以便Cognito服务可以承担该角色。

  2. 不要在文件中对凭据进行硬编码。