Konfigurowanie regionu w Node.js AWS SDK

123

Czy ktoś może wyjaśnić, jak naprawić brakujący błąd konfiguracji w Node.js? Postępowałem zgodnie ze wszystkimi przykładami ze strony dokumentu aws, ale nadal otrzymuję ten błąd bez względu na wszystko.

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

Oto mój kod:

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
źródło

Odpowiedzi:

209

Co powiesz na zmianę kolejności wyciągów? Zaktualizuj konfigurację AWS przed utworzeniem instancji s3 i dd

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

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
baldachim
źródło
1
Godziny poszukiwań przyczyn niepowodzenia… to rozwiązało problem.
FredArters
Spowoduje to ustawienie regionu na us-east-1dla wszystkich zasobów, użycie regionu określonego zasobu podczas tworzenia obiektu.
Atul Kumar
To tylko hack bez próby zrozumienia, dlaczego klient nodejs aws ignoruje ustawienia ~ \ .aws \ config
ffeast
Dzięki, to był problem, który miałem podczas ustawiania httpOptions po utworzeniu wystąpienia chmury
LJT
87

Miałem ten sam problem „Brakujący region w konfiguracji” iw moim przypadku było tak, że w przeciwieństwie do CLI lub Python SDK, Node SDK nie czyta z ~\.aws\configpliku.

Aby rozwiązać ten problem, masz trzy opcje:

  1. Skonfiguruj to programowo (zakodowane): AWS.config.update({region:'your-region'});

  2. Użyj zmiennej środowiskowej. Podczas gdy CLI używa AWS_DEFAULT_REGION, Node SDK używa AWS_REGION.

  3. Załaduj z pliku JSON przy użyciu AWS.config.loadFromPath('./config.json');

Format JSON:

{ 
    "accessKeyId": "akid", 
    "secretAccessKey": "secret", 
    "region": "us-east-1" 
}
Zanon
źródło
3
Lol. Więc SDK będzie czytać z udostępnionego pliku poświadczeń, ale konfiguracja, która jest zawsze z nim powiązana, zapomnij o tym!
duhseekoh
10
Uznanie za podkreślenie, że CLI używa AWS_DEFAULT_REGIONi Sdk AWS_REGION. To coś nieoczywistego i coś, co ugryzło mnie w przeszłości. Jest podświetlony na dole AWS SDK dla Javascript Developer Guide - Setting Region, ale nie jest to oczywiste
Dimitry K
12
SDK może czytać z ~ / .aws / config, ale musisz ustawić zmienną środowiskową AWS_SDK_LOAD_CONFIGnatrue
Gareth Oakley
2
To był mój problem. Myślałem, że to nie byłoby głupie i myślę, że to był mój błąd.
Justin Force
63

Jeśli pracujesz z AWS CLI, prawdopodobnie masz domyślny region zdefiniowany w ~ / .aws / config. Niestety AWS SDK dla JavaScript nie ładuje go domyślnie. Aby go załadować, zdefiniuj zmienną env

AWS_SDK_LOAD_CONFIG=1

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

Peter Dotchev
źródło
2
DZIĘKUJĘ CI! Wykonałem już inne polecenia SET. Jednak ten był konieczny, aby używać ich w mojej aplikacji 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 jest obsługiwany od 2.44.0, zgodnie z dziennikiem zmian SDK.
jarmod
2
działał idealnie i nie wymaga zakodowania niczego w skrypcie: wystarczy umieścić process.env.AWS_SDK_LOAD_CONFIG = 1; przed włączeniem AWS
sashok_bg
działał świetnie. Aby uzyskać informacje dla każdego używającego vscode i powłoki bash, możesz dodać zmienną enviornment w następujący sposób: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton
12

Możesz określić region podczas tworzenia połączenia z dynamodb (nie próbowałem s3, ale to też powinno działać).

var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB({'region': 'us-east-1'});
WaffleSouffle
źródło
1
nowy AWS.DynamoDB ({'region': 'us-east-1'}) nie działa, musisz zadzwonić do AWS.config.update ({region: 'your region'})
HaneTV
1
W tej chwili testuję z dynamodb działającym lokalnie, więc zachowanie może być inne. Z pewnością działa w całym kodzie, którego używam w tym środowisku. var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); Powinien działać, biorąc pod uwagę, że jest to w dokumentacji
WaffleSouffle
9
var AWS = require('aws-sdk');

// przypisz tutaj referencje AWS w następujący sposób:

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

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
BHUVNESH KUMAR
źródło
9

Przejrzałem twój kod i tutaj łączysz się z usługami AWS przed ustawieniem regionu, więc sugeruję, aby najpierw zaktualizować region, a następnie połączyć się z usługami lub utworzyć instancję tych, jak poniżej -

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
źródło
8

Dla mnie ten sam błąd:

Po wykonaniu wielu prób zdecydowałem się na poniższe:

OPCJA 1

  1. ustaw AWS_REGIONzmienną środowiskową tylko w systemie lokalnym, na us-east-1(przykład)

W systemie Linux:

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

W przypadku systemu Windows
patrz: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

  1. teraz nie ma potrzeby ustawiania żadnych zmiennych lambda dla regionu
  2. również nie ma potrzeby używania w kodzie, na przykład:

    • AWS.config.update(...)nie jest to wymagane
    • AWS.S3()itp. będą działać bez żadnych problemów. Zamiast S3 może istnieć dowolna usługa aws

W rzadkich przypadkach, jeśli gdzieś w kodzie są przyjmowane wartości domyślne i jesteś zmuszony wysłać region, użyj{'region': process.env.AWS_REGION})


OPCJA 2

Zamiast zmiennych środowiskowych, innym sposobem jest plik AWS CONFIG:

W systemie Linux możesz utworzyć poniższe pliki:

~ / .aws / poświadczenia

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

~ / .aws / config

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

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

Manohar Reddy Poreddy
źródło
Gdzie to ustawiasz environment variable? co masz na myśli local system?
Malcolm Salvador
@MalcolmSalvador Zaktualizowałem odpowiedź, patrz wyżej.
Manohar Reddy Poreddy
4

Może to nie jest właściwy sposób, ale mam wszystkie moje konfiguracje w osobnym pliku JSON. I to rozwiązuje problem

Aby załadować konfigurację AWS, robię to:

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

config.aws to po prostu plik JSON.

Tony
źródło
1

Możesz stworzyć wspólny moduł i używać go w oparciu o wybrany region

var AWS = require('aws-sdk')

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

i konsumuj jako,

 var s3Client = s3.getClient(config.region)

chodzi o to, aby zaktualizować konfigurację AWS przed utworzeniem instancji s3

Sajeetharan
źródło