Configurazione della regione in Node.js SDK AWS


123

Qualcuno può spiegare come correggere un errore di configurazione mancante con Node.js? Ho seguito tutti gli esempi dalla pagina della documentazione di aws ma ricevo ancora questo errore, qualunque cosa accada .

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

Ecco il mio codice:

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

(...)

Risposte:


209

Che ne dici di cambiare l'ordine delle dichiarazioni? Aggiorna AWS config prima di creare un'istanza di s3 e dd

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

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();

1
Ore di ricerca del motivo per cui questo stava fallendo .. questo lo ha risolto.
FredArters

Questo imposterà la regione us-east-1per tutte le risorse, usa la regione specifica della risorsa durante la creazione dell'oggetto.
Atul Kumar

È solo un trucco senza cercare di capire perché il client nodejs aws ignora le impostazioni di ~ \ .aws \ config
festa

Grazie, questo era il problema che ho avuto durante l'impostazione di httpOptions dopo aver creato un'istanza di cloudwatch
LJT

87

Ho avuto lo stesso problema "Missing region in config" e nel mio caso era che, a differenza della CLI o di Python SDK, il Node SDK non leggeva dal ~\.aws\configfile.

Per risolvere questo problema, hai tre opzioni:

  1. Configurarlo a livello di codice (hardcoded): AWS.config.update({region:'your-region'});

  2. Usa una variabile d'ambiente. Mentre la CLI utilizza AWS_DEFAULT_REGION, il Node SDK utilizza AWS_REGION.

  3. Carica da un file JSON utilizzando AWS.config.loadFromPath('./config.json');

Formato JSON:

{ 
    "accessKeyId": "akid", 
    "secretAccessKey": "secret", 
    "region": "us-east-1" 
}

3
Lol. Quindi l'SDK leggerà dal file delle credenziali condivise, ma la configurazione è sempre associata a questo, dimenticalo!
duhseekoh

10
Complimenti per aver evidenziato che la CLI utilizza AWS_DEFAULT_REGIONe Sdk AWS_REGION. È qualcosa di non ovvio e qualcosa che mi ha morso in passato. È evidenziato nella parte inferiore della Guida per sviluppatori di SDK AWS per Javascript - Impostazione della regione ma non è ovvio
Dimitry K

12
L'SDK può leggere da ~ / .aws / config, ma è necessario impostare la variabile di ambiente AWS_SDK_LOAD_CONFIGsutrue
Gareth Oakley,

2
Questo era il mio problema. Ho pensato che non sarebbe stato stupido e credo che sia stato un mio errore.
Justin Force

63

Se lavori con AWS CLI, probabilmente hai una regione predefinita definita in ~ / .aws / config. Purtroppo l'SDK AWS per JavaScript non lo carica per impostazione predefinita. Per caricarlo definire env var

AWS_SDK_LOAD_CONFIG=1

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


2
GRAZIE! Avevo già eseguito gli altri comandi SET. Tuttavia questo era necessario per usarli nella mia app 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 è supportato a partire dalla 2.44.0, secondo il registro delle modifiche dell'SDK.
jarmod

2
ha funzionato perfettamente e non richiede alcun hardcoding nello script: basta mettere process.env.AWS_SDK_LOAD_CONFIG = 1; prima di includere AWS
sashok_bg

ha funzionato alla grande. Per informazioni chiunque utilizzi vscode e bash shell è possibile aggiungere la variabile enviornment come segue: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton

12

È possibile specificare la regione durante la creazione della connessione dynamodb (non ho provato s3 ma dovrebbe funzionare anche questo).

var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB({'region': 'us-east-1'});

1
new AWS.DynamoDB ({'region': 'us-east-1'}) non funziona, devi chiamare AWS.config.update ({region: 'your region'})
HaneTV

1
Al momento sto testando con dynamodb in esecuzione localmente, quindi il comportamento potrebbe essere diverso. Certamente funziona in tutto il codice che sto usando in quell'ambiente. var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); Dovrebbe funzionare dato che è nella documentazione
WaffleSouffle

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

// assegna qui le credenziali AWS nel modo seguente:

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

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();

9

Ho esaminato il tuo codice e qui ti stai connettendo ai servizi AWS prima di impostare la regione, quindi ti suggerisco di aggiornare prima la regione e poi connetterti ai servizi o creare istanze di quelli come di seguito -

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';

8

Stesso errore per me:

Dopo aver fatto molte prove, ho deciso quanto segue:

OPZIONE 1

  1. imposta la AWS_REGIONvariabile d'ambiente solo nel sistema locale, su us-east-1(esempio)

Per Linux:

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

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

  1. ora, non è necessario impostare alcuna variabile lambda per regione
  2. inoltre, non è necessario utilizzare nel codice, ad esempio:

    • AWS.config.update(...), questo non è richiesto
    • AWS.S3(), ecc., funzioneranno senza problemi. Al posto di S3, può esserci qualsiasi servizio aws

In rari casi, se da qualche parte nel codice si assumono alcuni valori predefiniti e sei costretto a inviare region, usa{'region': process.env.AWS_REGION})


OPZIONE 2

Invece delle variabili di ambiente, un altro modo è il file CONFIG AWS:

Su Linux puoi creare i seguenti file:

~ / .Aws / credenziali

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

~ / .Aws / config

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

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


Dove lo metti environment variable? cosa intendi con local system?
Malcolm Salvador

@MalcolmSalvador Ho aggiornato la risposta per te, vedi sopra.
Manohar Reddy Poreddy

4

Questo potrebbe non essere il modo giusto per farlo, ma ho tutte le mie configurazioni in un file JSON separato. E questo risolve il problema per me

Per caricare la configurazione AWS, faccio questo:

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

config.aws è solo un file JSON.


1

Puoi creare un modulo comune e usarlo in base alla regione che desideri

var AWS = require('aws-sdk')

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

e consumalo come,

 var s3Client = s3.getClient(config.region)

l'idea è di aggiornare AWS config prima di istanziare s3

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.