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

(...)
Anejah Daniels
sumber

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();
payung
sumber
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" 
}
Zanon
sumber
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

Peter Dotchev
sumber
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'});
WaffleSouffle
sumber
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();
BHUVNESH KUMAR
sumber
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';
Himanshu Tongya
sumber
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

Manohar Reddy Poreddy
sumber
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.

Tony
sumber
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

Sajeetharan
sumber