Mengonfigurasi wilayah di Node.js AWS SDK


123

Adakah yang bisa menjelaskan cara memperbaiki kesalahan konfigurasi yang hilang dengan Node.js? Saya telah mengikuti semua contoh dari halaman dokumen aws tetapi saya masih mendapatkan kesalahan ini apa pun yang terjadi.

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

Ini kode saya:

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

(...)

Jawaban:


209

Bagaimana dengan mengubah urutan pernyataan? Perbarui konfigurasi AWS sebelum membuat contoh s3 dan dd

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

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

1
Berjam-jam mencari mengapa ini gagal .. ini memperbaikinya.
FredArters

Ini akan menyetel wilayah ke us-east-1untuk semua sumber daya, menggunakan wilayah khusus sumber daya saat membuat objek.
Atul Kumar

Ini hanya peretasan tanpa mencoba mencari tahu mengapa klien nodejs aws mengabaikan ~ \ .aws \ config settings
ffeast

Terima kasih, ini adalah masalah yang saya alami saat menyetel httpOptions setelah membuat instance cloudwatch
LJT

87

Saya memiliki masalah yang sama "Wilayah yang hilang dalam konfigurasi" dan dalam kasus saya, tidak seperti di CLI atau Python SDK, Node SDK tidak akan membaca dari ~\.aws\configfile.

Untuk mengatasi ini, Anda memiliki tiga opsi:

  1. Konfigurasikan secara terprogram (hard-code): AWS.config.update({region:'your-region'});

  2. Gunakan variabel lingkungan. Sementara CLI menggunakan AWS_DEFAULT_REGION, Node SDK menggunakan AWS_REGION.

  3. Muat dari file JSON menggunakan AWS.config.loadFromPath('./config.json');

Format JSON:

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

3
Lol. Jadi SDK akan membaca dari file kredensial bersama, tetapi konfigurasi yang selalu dipasangkan dengan itu, lupakan saja!
duhseekoh

10
Kudos untuk menyoroti bahwa CLI menggunakan AWS_DEFAULT_REGIONdan Sdk AWS_REGION. Itu adalah sesuatu yang tidak jelas dan sesuatu yang menggigit saya di masa lalu. Ini disorot di bagian bawah AWS SDK Untuk Panduan Pengembang Javascript - Menyetel Wilayah tetapi tidak jelas
Dimitry K

12
SDK dapat membaca dari ~ / .aws / config, tetapi Anda perlu menyetel variabel lingkungan AWS_SDK_LOAD_CONFIGketrue
Gareth Oakley

2
Ini adalah masalahku. Saya pikir itu tidak akan bodoh, dan saya rasa itu adalah kesalahan saya.
Justin Force

63

Jika Anda bekerja dengan AWS CLI, Anda mungkin memiliki wilayah default yang ditentukan di ~ / .aws / config. Sayangnya AWS SDK untuk JavaScript tidak memuatnya secara default. Untuk memuatnya, definisikan env var

AWS_SDK_LOAD_CONFIG=1

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


2
TERIMA KASIH! Saya sudah menjalankan perintah SET lainnya. Namun yang satu ini diperlukan untuk menggunakannya di aplikasi Node.JS saya. 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 didukung mulai 2.44.0, sesuai dengan log perubahan SDK.
jarmod

2
bekerja dengan sempurna dan tidak memerlukan hardcode apa pun di skrip Anda: cukup letakkan process.env.AWS_SDK_LOAD_CONFIG = 1; sebelum memasukkan AWS
sashok_bg

bekerja dengan baik. Untuk informasi siapa pun yang menggunakan vscode dan bash shell, Anda dapat menambahkan variabel enviornment sebagai berikut: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton

12

Anda dapat menentukan wilayah saat membuat koneksi dynamodb (belum mencoba s3 tetapi itu juga berfungsi).

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

1
AWS.DynamoDB baru ({'region': 'us-east-1'}) tidak berfungsi, Anda perlu memanggil AWS.config.update ({region: 'your region'})
HaneTV

1
Saat ini saya sedang menguji dengan dynamodb yang berjalan secara lokal sehingga perilakunya mungkin berbeda. Ini pasti berfungsi di semua kode yang saya gunakan di lingkungan itu. var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); Harus bekerja mengingat itu dalam dokumentasi
WaffleSouffle

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

// tetapkan kredensial AWS di sini dengan cara berikut:

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

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

9

Saya telah memeriksa kode Anda dan di sini Anda terhubung ke layanan AWS sebelum mengatur wilayah, jadi saya menyarankan Anda untuk memperbarui wilayah terlebih dahulu dan kemudian menghubungkan ke layanan atau membuat contoh seperti di bawah ini -

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

Kesalahan yang sama untuk saya:

Setelah melakukan banyak percobaan saya telah menetapkan di bawah ini:

PILIHAN 1

  1. atur AWS_REGIONvariabel lingkungan hanya di sistem lokal, ke us-east-1(contoh)

Untuk Linux:

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

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

  1. sekarang, tidak perlu menyetel variabel lambda apa pun untuk wilayah
  2. juga, tidak perlu digunakan dalam kode, misalnya:

    • AWS.config.update(...), ini tidak wajib
    • AWS.S3(), dll., ini akan berfungsi tanpa masalah. Di tempat S3, mungkin ada layanan AWS

Dalam kasus yang jarang terjadi jika di suatu tempat beberapa default diasumsikan dalam kode dan Anda dipaksa untuk mengirim wilayah, maka gunakan{'region': process.env.AWS_REGION})


PILIHAN 2

Alih-alih variabel lingkungan, cara lain adalah file AWS CONFIG:

Di Linux Anda dapat membuat file di bawah ini:

~ / .aws / credentials

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

~ / .aws / config

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

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


Di mana Anda mengatur ini environment variable? apa yang Anda maksud dengan local system?
Malcolm Salvador

@MalcolmSalvador Saya telah memperbarui jawaban untuk Anda, lihat di atas.
Manohar Reddy Poreddy

4

Ini mungkin bukan cara yang tepat untuk melakukannya, tetapi saya memiliki semua konfigurasi saya di file JSON terpisah. Dan ini memperbaiki masalah saya

Untuk memuat konfigurasi AWS, saya melakukan ini:

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

config.aws hanyalah file JSON.


1

Anda dapat membuat modul umum dan menggunakannya berdasarkan wilayah yang Anda inginkan

var AWS = require('aws-sdk')

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

dan mengkonsumsinya sebagai,

 var s3Client = s3.getClient(config.region)

idenya adalah untuk Memperbarui konfigurasi AWS sebelum membuat contoh s3

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.