AWS Missing credentials when I try send something to my S3 Bucket (Node.js)

node.jsAmazon Web-ServicesAmazon S3

node.js Problem Overview


I'm having this issue since yesterday, and I'm having trouble for find a solution.

I'm trying to send somethings to my S3 bucket, but this message appear in my console when I try:

{ [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' } } }

And this is my code:

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

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

The credentials are correct. Does anyone know what can be? I've searching but I not find anywhere the solution.


My credentials(fake):

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

EDIT:

For help, all the code:

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");
	}
});

New err:

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 }

node.js Solutions


Solution 1 - node.js

Try hardcoding your params and see if you get the error again :

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

Solution 2 - node.js

I had the same problem until I reversed the two lines:

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

to this:

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

Solution 3 - node.js

I was having the same error. But I found the issue. I was using wrong Environment variable name. From NodeJS to S3, I need to use the following variable names:

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

Once I corrected the variable names, it just ran fine. regards, Dipankar

Solution 4 - node.js

Try changing the user in my aws config file from a specific user to [default].

$nano .aws/credentials

[default]
aws_access_key_id = xyz
aws_secret_access_key = xyz

If you do not have this file, create it and get your keys or generate new one from aws iam user keys.

Solution 5 - node.js

I tried above option and even that did not work, so I created new config object and this below code worked

 AWS.config = new AWS.Config();
 AWS.config.accessKeyId = "AccessKey";
 AWS.config.secretAccessKey = "SecretAccessKey";

Solution 6 - node.js

I had a similar issue when trying to load the config file from anywhere other than the root directory.

I was able to load the json file natively in node, then just pass the object that was parsed to AWS.config.update()

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

Solution 7 - node.js

This resolved my issue .

  1. Used the sample code from the Cognito Console and added it to the of the document.

  2. Enabled Unauthenticated access on the identity pool.

Most important

  1. Fixed the Trust Relationship policy in the unauth role so the Cognito Service could assume the role.

  2. Do not hard code credential in the file .

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser3998237View Question on Stackoverflow
Solution 1 - node.jsxShiraseView Answer on Stackoverflow
Solution 2 - node.jsHugh McKeeView Answer on Stackoverflow
Solution 3 - node.jsDipankar BiswasView Answer on Stackoverflow
Solution 4 - node.jstimxorView Answer on Stackoverflow
Solution 5 - node.jsGopal ShuklaView Answer on Stackoverflow
Solution 6 - node.jsDustin GravesView Answer on Stackoverflow
Solution 7 - node.jsSUDARSHANView Answer on Stackoverflow