Region in Node.js AWS SDK konfigurieren


122

Kann jemand erklären, wie ein fehlender Konfigurationsfehler mit Node.js behoben werden kann? Ich habe alle Beispiele von der aws-Dokumentseite befolgt, aber ich erhalte immer noch diesen Fehler, egal was passiert.

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

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

(...)

Antworten:


207

Wie wäre es mit einer Änderung der Reihenfolge der Anweisungen? Aktualisieren Sie die AWS-Konfiguration, bevor Sie s3 und dd instanziieren

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

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

1
Stundenlanges Suchen, warum dies fehlgeschlagen ist. Dies hat das Problem behoben.
FredArters

Dadurch wird die Region us-east-1für alle Ressourcen so eingestellt, dass beim Erstellen des Objekts eine ressourcenspezifische Region verwendet wird.
Atul Kumar

Es ist nur ein Hack ohne herauszufinden zu versuchen , warum NodeJS aws Client ignoriert ~ \ .aws \ config Einstellungen
ffeast

Vielen Dank, dies war das Problem, das ich hatte, als ich httpOptions nach dem Instanziieren von Cloudwatch eingestellt hatte
LJT

87

Ich hatte das gleiche Problem "Fehlende Region in Konfiguration" und in meinem Fall war es so, dass das Node SDK im Gegensatz zur CLI oder zum Python SDK nicht aus der ~\.aws\configDatei liest .

Um dies zu lösen, haben Sie drei Möglichkeiten:

  1. Programmieren Sie es programmgesteuert (fest codiert): AWS.config.update({region:'your-region'});

  2. Verwenden Sie eine Umgebungsvariable. Während die CLI verwendet AWS_DEFAULT_REGION, verwendet das Node SDK AWS_REGION.

  3. Laden aus einer JSON-Datei mit AWS.config.loadFromPath('./config.json');

JSON-Format:

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

3
Lol. Das SDK liest also aus der Datei mit den gemeinsam genutzten Anmeldeinformationen, aber die Konfiguration, die immer damit gepaart ist, vergiss es!
Duhseekoh

9
Ein AWS_DEFAULT_REGIONgroßes Lob für die Hervorhebung, die CLI und Sdk verwendet AWS_REGION. Das ist etwas nicht Offensichtliches und etwas, das mich in der Vergangenheit gebissen hat. Es wird am unteren Rand des AWS SDK für Javascript-Entwicklerhandbuchs hervorgehoben - Festlegen der Region, aber es ist nicht offensichtlich
Dimitry K

12
Das SDK kann aus ~ / .aws / config lesen, aber Sie müssen die Umgebungsvariable AWS_SDK_LOAD_CONFIGauftrue
Gareth Oakley

2
Das war mein Problem. Ich dachte, es wäre nicht dumm, und ich denke, das war mein Fehler.
Justin Force

63

Wenn Sie mit AWS CLI arbeiten, ist wahrscheinlich eine Standardregion in ~ / .aws / config definiert. Leider lädt AWS SDK für JavaScript es nicht standardmäßig. Um es zu laden, definieren Sie env var

AWS_SDK_LOAD_CONFIG=1

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


2
DANKE! Ich hatte bereits die anderen SET-Befehle ausgeführt. Dieser war jedoch erforderlich, um sie in meiner Node.JS-App zu verwenden. 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 wird ab 2.44.0 gemäß dem SDK-Änderungsprotokoll unterstützt.
Jarmod

2
hat perfekt funktioniert und erfordert keine Hardcodierung in Ihrem Skript: Setzen Sie einfach process.env.AWS_SDK_LOAD_CONFIG = 1; vor der Aufnahme von AWS
sashok_bg

hat super funktioniert. Zur Information kann jeder, der vscode und bash shell verwendet, die Umgebungsvariable wie folgt hinzufügen: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton

12

Sie können die Region beim Erstellen der Dynamodb-Verbindung angeben (haben s3 noch nicht ausprobiert, aber das sollte auch funktionieren).

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

1
neue AWS.DynamoDB ({'region': 'us-east-1'}) funktioniert nicht, Sie müssen AWS.config.update ({region: 'your region'})
aufrufen

1
Im Moment teste ich mit Dynamodb, das lokal ausgeführt wird, sodass das Verhalten möglicherweise anders ist. Es funktioniert auf jeden Fall in dem gesamten Code, den ich in dieser Umgebung verwende. var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); Sollte funktionieren, ist es in der Dokumentation
WaffleSouffle

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

// AWS-Anmeldeinformationen hier wie folgt zuweisen:

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

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

9

Ich habe Ihren Code durchgesehen und hier stellen Sie eine Verbindung zu AWS-Diensten her, bevor Sie die Region festlegen. Daher empfehle ich Ihnen, zuerst die Region zu aktualisieren und dann eine Verbindung zu Diensten herzustellen oder eine Instanz davon wie unten zu erstellen.

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

Gleicher Fehler für mich:

Nach vielen Versuchen habe ich mich für Folgendes entschieden:

OPTION 1

  1. Setzen Sie die AWS_REGIONUmgebungsvariable nur im lokalen System auf us-east-1(Beispiel)

Für Linux:

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

Für Windows
siehe: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

  1. Jetzt müssen keine Lambda-Variablen mehr für die Region festgelegt werden
  2. Außerdem muss kein Code verwendet werden, zum Beispiel:

    • AWS.config.update(...)ist nicht erforderlich
    • AWS.S3()usw. funktionieren diese problemlos. Anstelle von S3 kann es auch einen aws-Service geben

In seltenen Fällen, wenn irgendwo im Code einige Standardeinstellungen angenommen werden und Sie gezwungen sind, eine Region zu senden, verwenden Sie{'region': process.env.AWS_REGION})


OPTION 2

Anstelle von Umgebungsvariablen ist eine andere Möglichkeit die AWS CONFIG-Datei:

Unter Linux können Sie folgende Dateien erstellen:

~ / .aws / Anmeldeinformationen

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

~ / .aws / config

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

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


Wo stellst du das ein environment variable? was meinst du local system?
Malcolm Salvador

@MalcolmSalvador Ich habe die Antwort für Sie aktualisiert, siehe oben.
Manohar Reddy Poreddy

4

Dies ist möglicherweise nicht der richtige Weg, aber ich habe alle meine Konfigurationen in einer separaten JSON-Datei. Und das behebt das Problem für mich

Um die AWS-Konfiguration zu laden, gehe ich folgendermaßen vor:

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

config.aws ist nur eine JSON-Datei.


1

Sie können ein gemeinsames Modul erstellen und es basierend auf der gewünschten Region verwenden

var AWS = require('aws-sdk')

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

und verbrauchen es als,

 var s3Client = s3.getClient(config.region)

Die Idee ist, die AWS-Konfiguration zu aktualisieren, bevor s3 instanziiert wird

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.