Configuración de región en AWS SDK de Node.js

123

¿Alguien puede explicar cómo corregir un error de configuración faltante con Node.js? He seguido todos los ejemplos de la página de documentos de aws, pero sigo recibiendo este error pase lo que pase.

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

Aquí está mi código:

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
fuente

Respuestas:

209

¿Qué tal cambiar el orden de las declaraciones? Actualice la configuración de AWS antes de crear instancias de s3 y dd

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

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
umbrel
fuente
1
Horas de búsqueda de por qué esto estaba fallando ... esto lo solucionó.
FredArters
Esto establecerá la región us-east-1para que todos los recursos utilicen la región específica del recurso al crear el objeto.
Atul Kumar
Es solo un truco sin tratar de averiguar por qué el cliente aws de nodejs ignora la configuración de ~ \ .aws \ config
ffeast
Gracias, este fue el problema que tuve al configurar httpOptions después de crear una instancia de cloudwatch
LJT
87

Tuve el mismo problema "Falta la región en la configuración" y, en mi caso, fue que, a diferencia de la CLI o el SDK de Python, el SDK de nodo no lee el ~\.aws\configarchivo.

Para solucionar esto, tienes tres opciones:

  1. Configúrelo programáticamente (codificado): AWS.config.update({region:'your-region'});

  2. Utilice una variable de entorno. Mientras que la CLI usa AWS_DEFAULT_REGION, el SDK de Node usa AWS_REGION.

  3. Cargar desde un archivo JSON usando AWS.config.loadFromPath('./config.json');

Formato JSON:

{ 
    "accessKeyId": "akid", 
    "secretAccessKey": "secret", 
    "region": "us-east-1" 
}
Zanon
fuente
3
Jajaja Entonces, el SDK leerá desde el archivo de credenciales compartido, pero la configuración que siempre está emparejada con él, ¡olvídese!
duhseekoh
10
Felicitaciones por destacar que CLI utiliza AWS_DEFAULT_REGIONy Sdk AWS_REGION. Eso es algo que no es obvio y algo que me mordió en el pasado. Está resaltado en la parte inferior de AWS SDK para Javascript Developer Guide - Setting Region pero no es obvio
Dimitry K
12
El SDK puede leer desde ~ / .aws / config, pero debe establecer la variable de entorno AWS_SDK_LOAD_CONFIGentrue
Gareth Oakley
2
Este era mi problema. Pensé que no sería estúpido y supongo que fue mi error.
Justin Force
63

Si trabaja con AWS CLI, probablemente tenga una región predeterminada definida en ~ / .aws / config. Lamentablemente, AWS SDK para JavaScript no lo carga de forma predeterminada. Para cargarlo, defina env var

AWS_SDK_LOAD_CONFIG=1

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

Peter Dotchev
fuente
2
¡GRACIAS! Ya había ejecutado los otros comandos SET. Sin embargo, este era necesario para usarlos en mi aplicación 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 es compatible a partir de 2.44.0, según el registro de cambios del SDK.
jarmod
2
funcionó perfectamente y no requiere codificar nada en su script: simplemente coloque process.env.AWS_SDK_LOAD_CONFIG = 1; antes de incluir AWS
sashok_bg
funcionó muy bien. Para obtener información, cualquiera que use vscode y bash shell, puede agregar la variable de entorno de la siguiente manera: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton
12

Puede especificar la región al crear la conexión dynamodb (no he probado s3 pero eso también debería funcionar).

var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB({'region': 'us-east-1'});
WaffleSouffle
fuente
1
el nuevo AWS.DynamoDB ({'region': 'us-east-1'}) no funciona, debe llamar a AWS.config.update ({region: 'your region'})
HaneTV
1
En este momento estoy probando con dynamodb ejecutándose localmente, por lo que el comportamiento puede ser diferente. Ciertamente funciona en todo el código que estoy usando en ese entorno. var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); Debería funcionar dado que está en la documentación
WaffleSouffle
9
var AWS = require('aws-sdk');

// asigne aquí las credenciales de AWS de la siguiente manera:

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

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

Revisé su código y aquí se está conectando a los servicios de AWS antes de configurar la región, por lo que le sugiero que actualice la región primero y luego se conecte a los servicios o cree una instancia de los siguientes:

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
fuente
8

Mismo error para mi:

Después de hacer muchas pruebas, me he decidido por lo siguiente:

OPCIÓN 1

  1. establezca la AWS_REGIONvariable de entorno solo en el sistema local, en us-east-1(ejemplo)

Para Linux:

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

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

  1. ahora, no es necesario establecer ninguna variable lambda para la región
  2. Además, no es necesario usarlo en el código, por ejemplo:

    • AWS.config.update(...), esto no es necesario
    • AWS.S3(), etc., funcionarán sin problemas. En lugar de S3, puede haber cualquier servicio AWS

En un caso raro, si en algún lugar se asumen algunos valores predeterminados en el código y se ve obligado a enviar la región, utilice{'region': process.env.AWS_REGION})


OPCION 2

En lugar de variables de entorno, otra forma es el archivo AWS CONFIG:

En Linux puede crear los siguientes archivos:

~ / .aws / credentials

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

~ / .aws / config

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

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

Manohar Reddy Poreddy
fuente
¿Dónde pones esto environment variable? ¿qué es lo que quiere decir con local system?
Malcolm Salvador
@MalcolmSalvador He actualizado la respuesta para ti, ver arriba.
Manohar Reddy Poreddy
4

Puede que esta no sea la forma correcta de hacerlo, pero tengo todas mis configuraciones en un archivo JSON separado. Y esto me soluciona el problema

Para cargar la configuración de AWS, hago esto:

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

config.aws es solo un archivo JSON.

Tony
fuente
1

Puede crear un módulo común y usarlo según la región que desee

var AWS = require('aws-sdk')

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

y consumirlo como,

 var s3Client = s3.getClient(config.region)

la idea es actualizar la configuración de AWS antes de instanciar s3

Sajeetharan
fuente