Configuration de la région dans Node.js AWS SDK

123

Quelqu'un peut-il expliquer comment corriger une erreur de configuration manquante avec Node.js? J'ai suivi tous les exemples de la page doc aws mais j'obtiens toujours cette erreur quoi qu'il arrive.

{ [ConfigError: Missing region in config]
message: 'Missing region in config',
code: 'ConfigError',
time: Wed Jun 24 2015 21:39:58 GMT-0400 (EDT) }>{ thumbnail: 
 { fieldname: 'thumbnail',
 originalname: 'testDoc.pdf',
 name: 'testDoc.pdf',
 encoding: '7bit',
 mimetype: 'application/pdf',
path: 'uploads/testDoc.pdf',
 extension: 'pdf',
 size: 24,
 truncated: false,
 buffer: null } }
 POST / 200 81.530 ms - -

Voici mon code:

var express = require('express');
var router = express.Router();
var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
var bucketName = 'my-bucket';

AWS.config.update({region:'us-east-1'});

(...)
Anejah Daniels
la source

Réponses:

209

Que diriez-vous de changer l'ordre des déclarations? Mettez à jour la configuration AWS avant d'instancier s3 et dd

var AWS = require('aws-sdk');
AWS.config.update({region:'us-east-1'});

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
Ombrel
la source
1
Des heures à chercher pourquoi cela échouait ... cela a résolu le problème.
FredArters
Cela définira la région sur us-east-1pour toutes les ressources, utilisera une région spécifique à la ressource lors de la création de l'objet.
Atul Kumar
C'est juste un hack sans essayer de comprendre pourquoi le client nodejs aws ignore les paramètres ~ \ .aws \ config
Fête
Merci, c'est le problème que j'ai eu lors de la configuration de httpOptions après l'instanciation de cloudwatch
LJT
87

J'ai eu le même problème "Région manquante dans la configuration" et dans mon cas, c'est que, contrairement à la CLI ou au SDK Python, le SDK Node ne lira pas le ~\.aws\configfichier.

Pour résoudre ce problème, vous avez trois options:

  1. Configurez-le par programme (codé en dur): AWS.config.update({region:'your-region'});

  2. Utilisez une variable d'environnement. Pendant que la CLI utilise AWS_DEFAULT_REGION, le SDK Node utilise AWS_REGION.

  3. Charger à partir d'un fichier JSON en utilisant AWS.config.loadFromPath('./config.json');

Format JSON:

{ 
    "accessKeyId": "akid", 
    "secretAccessKey": "secret", 
    "region": "us-east-1" 
}
Zanon
la source
3
Lol. Ainsi, le SDK lira à partir du fichier d'informations d'identification partagé, mais la configuration est toujours associée à cela, oubliez-le!
duhseekoh
10
Félicitations pour avoir souligné que la CLI utilise AWS_DEFAULT_REGIONet Sdk AWS_REGION. C'est quelque chose de non évident et quelque chose qui m'a mordu dans le passé. Il est mis en surbrillance au bas du AWS SDK For Javascript Developer Guide - Setting Region, mais ce n'est pas évident
Dimitry K
12
Le SDK peut lire à partir de ~ / .aws / config, mais vous devez définir la variable d'environnement AWS_SDK_LOAD_CONFIGsurtrue
Gareth Oakley
2
C'était mon problème. Je pensais que ce ne serait pas stupide, et je suppose que c'était mon erreur.
Justin Force le
63

Si vous travaillez avec AWS CLI, vous avez probablement une région par défaut définie dans ~ / .aws / config. Malheureusement, AWS SDK for JavaScript ne le charge pas par défaut. Pour le charger, définissez env var

AWS_SDK_LOAD_CONFIG=1

Voir https://github.com/aws/aws-sdk-js/pull/1391

Peter Dotchev
la source
2
MERCI! J'avais déjà exécuté les autres commandes SET. Cependant, celui-ci était nécessaire pour les utiliser dans mon application Node.JS. set AWS_ACCESS_KEY_ID="KEY ID GOES HERE" set AWS_SECRET_ACCESS_KEY="SECRET KEY GOES HERE" set AWS_REGION="us-east-1"
SteckDEV
AWS_SDK_LOAD_CONFIG est pris en charge à partir de 2.44.0, selon le journal des modifications du SDK.
jarmod
2
a parfaitement fonctionné et ne nécessite aucun codage en dur dans votre script: il suffit de mettre process.env.AWS_SDK_LOAD_CONFIG = 1; avant d'inclure AWS
sashok_bg
a très bien fonctionné. Pour plus d'informations, toute personne utilisant vscode et bash shell, vous pouvez ajouter la variable d'environnement comme suit: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton le
12

Vous pouvez spécifier la région lors de la création de la connexion dynamodb (je n'ai pas essayé s3 mais cela devrait également fonctionner).

var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB({'region': 'us-east-1'});
GaufreSouffle
la source
1
new AWS.DynamoDB ({'region': 'us-east-1'}) ne fonctionne pas, vous devez appeler AWS.config.update ({region: 'your region'})
HaneTV
1
En ce moment, je teste avec dynamodb fonctionnant localement, donc le comportement peut être différent. Cela fonctionne certainement dans tout le code que j'utilise dans cet environnement. var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); Devrait fonctionner étant donné que c'est dans la documentation
WaffleSouffle
9
var AWS = require('aws-sdk');

// attribuez ici les informations d'identification AWS de la manière suivante:

AWS.config.update({
  accessKeyId: 'asdjsadkskdskskdk',
  secretAccessKey: 'sdsadsissdiidicdsi',
  region: 'us-east-1'
});

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
BHUVNESH KUMAR
la source
9

J'ai parcouru votre code et ici vous vous connectez aux services AWS avant de définir la région, je vous suggère donc de mettre à jour la région d'abord, puis de vous connecter aux services ou de créer une instance de ceux-ci comme ci-dessous -

var express = require('express');
var router = express.Router();
var AWS = require('aws-sdk');
AWS.config.update({region:'us-east-1'});

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
var bucketName = 'my-bucket';
Himanshu Tongya
la source
8

Même erreur pour moi:

Après avoir fait de nombreux essais, je me suis arrêté sur ce qui suit:

OPTION 1

  1. définir la AWS_REGIONvariable d'environnement dans le système local uniquement, sur us-east-1(exemple)

Pour Linux:

export AWS_ACCESS_KEY_ID = AKIAIOSFODNN7EXAMPLE
exportation AWS_SECRET_ACCESS_KEY = wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY
export AWS_DEFAULT_REGION = us-east-1

Pour Windows,
voir: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

  1. maintenant, pas besoin de définir de variables lambda pour la région
  2. également, pas besoin d'utiliser dans le code, par exemple:

    • AWS.config.update(...), ce n'est pas obligatoire
    • AWS.S3(), etc., ceux-ci fonctionneront sans aucun problème. À la place de S3, il peut y avoir n'importe quel service aws

Dans de rares cas, si quelque part certaines valeurs par défaut sont supposées dans le code et que vous êtes obligé d'envoyer une région, utilisez{'region': process.env.AWS_REGION})


OPTION 2

Au lieu des variables d'environnement, un autre moyen est le fichier AWS CONFIG:

Sous Linux, vous pouvez créer les fichiers ci-dessous:

~ / .aws / informations d'identification

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

~ / .aws / config

[default]
region=us-west-2
output=json

Voir https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html

Manohar Reddy Poreddy
la source
Où placez-vous cela environment variable? que voulez-vous dire local system?
Malcolm Salvador le
@MalcolmSalvador J'ai mis à jour la réponse pour vous, voir ci-dessus.
Manohar Reddy Poreddy le
4

Ce n'est peut-être pas la bonne façon de le faire, mais j'ai toutes mes configurations dans un fichier JSON séparé. Et cela résout le problème pour moi

Pour charger la configuration AWS, je fais ceci:

var awsConfig = config.aws;
AWS.config.region = awsConfig.region;
AWS.config.credentials = {
    accessKeyId: awsConfig.accessKeyId,
    secretAccessKey: awsConfig.secretAccessKey
}

config.aws n'est qu'un fichier JSON.

Tony
la source
1

Vous pouvez créer un module commun et l'utiliser en fonction de la région que vous souhaitez

var AWS = require('aws-sdk')

module.exports = {
    getClient: function(region) {
        AWS.config.update({ region: region })
        return new AWS.S3()
    }
}

et consommez-le comme,

 var s3Client = s3.getClient(config.region)

l'idée est de mettre à jour la configuration AWS avant d'instancier s3

Sajeetharan
la source