Định cấu hình vùng trong Node.js AWS SDK


123

Ai đó có thể giải thích cách sửa lỗi cấu hình bị thiếu với Node.js không? Tôi đã làm theo tất cả các ví dụ từ trang tài liệu aws nhưng tôi vẫn gặp lỗi này bất kể điều gì.

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

Đây là mã của tôi:

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

(...)

Câu trả lời:


209

Làm thế nào về việc thay đổi thứ tự của các câu lệnh? Cập nhật cấu hình AWS trước khi khởi tạo s3 và dd

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

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

1
Hàng giờ tìm kiếm tại sao điều này không thành công .. điều này đã sửa nó.
FredArters

Điều này sẽ thiết lập khu vực us-east-1cho tất cả các tài nguyên, sử dụng khu vực tài nguyên cụ thể trong khi tạo đối tượng.
Atul Kumar

Đó chỉ là một vụ hack mà không cố gắng tìm ra lý do tại sao khách hàng của nodejs aws lại bỏ qua ~ \ .aws \ config settings
'19

Cảm ơn, đây là sự cố tôi gặp phải khi đặt httpOptions sau khi khởi tạo đồng hồ trên đám mây
LJT

87

Tôi đã gặp vấn đề tương tự "Thiếu vùng trong cấu hình" và trong trường hợp của tôi, đó là vấn đề, không giống như trong SDK CLI hoặc Python, SDK Node sẽ không đọc từ ~\.aws\configtệp.

Để giải quyết vấn đề này, bạn có ba lựa chọn:

  1. Định cấu hình nó theo chương trình (mã hóa cứng): AWS.config.update({region:'your-region'});

  2. Sử dụng một biến môi trường. Trong khi CLI sử dụng AWS_DEFAULT_REGION, Node SDK sử dụng AWS_REGION.

  3. Tải từ tệp JSON bằng AWS.config.loadFromPath('./config.json');

Định dạng JSON:

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

3
Cười lớn. Vì vậy, SDK sẽ đọc từ tệp thông tin xác thực được chia sẻ, nhưng cấu hình luôn được ghép nối với nó, hãy quên nó đi!
duhseekoh

10
Kudo để làm nổi bật CLI sử dụng AWS_DEFAULT_REGIONvà Sdk AWS_REGION. Đó là điều gì đó không hiển nhiên và là điều gì đó đã làm tôi đau đớn trong quá khứ. Nó được đánh dấu ở cuối AWS SDK cho Hướng dẫn dành cho nhà phát triển Javascript - Khu vực thiết lập nhưng nó không rõ ràng
Dimitry K

12
SDK có thể đọc từ ~ / .aws / config, nhưng bạn cần phải thiết lập các biến môi trường AWS_SDK_LOAD_CONFIGđếntrue
Gareth Oakley

2
Đây là vấn đề của tôi. Tôi nghĩ nó sẽ không ngu ngốc, và tôi đoán đó là sai lầm của tôi.
Justin Force

63

Nếu bạn làm việc với AWS CLI, bạn có thể có một vùng mặc định được xác định trong ~ / .aws / config. Rất tiếc, AWS SDK cho JavaScript không tải nó theo mặc định. Để tải nó xác định env var

AWS_SDK_LOAD_CONFIG=1

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


2
CẢM ƠN BẠN! Tôi đã thực hiện các lệnh SET khác. Tuy nhiên, điều này là cần thiết để sử dụng chúng trong ứng dụng Node.JS của tôi. 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 được hỗ trợ kể từ 2.44.0, theo nhật ký thay đổi SDK.
jarmod

2
hoạt động hoàn hảo và không yêu cầu mã hóa cứng bất kỳ thứ gì trong tập lệnh của bạn: chỉ cần đặt process.env.AWS_SDK_LOAD_CONFIG = 1; trước khi bao gồm AWS
sashok_bg

hoạt động tốt. Đối với thông tin bất kỳ ai sử dụng vscode và bash shell, bạn có thể thêm biến enviornment như sau: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton

12

Bạn có thể chỉ định khu vực khi tạo kết nối dynamicodb (chưa thử s3 nhưng điều đó cũng sẽ hoạt động).

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

1
AWS.DynamoDB mới ({'region': 'us-west-1'}) không hoạt động, bạn cần gọi AWS.config.update ({region: 'your region'})
HaneTV 22/12/16

1
Hiện tại, tôi đang thử nghiệm với động cơ chạy cục bộ nên hoạt động có thể khác. Nó chắc chắn hoạt động trong tất cả các mã tôi đang sử dụng trong môi trường đó. var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); Nên làm việc cho nó trong tài liệu
WaffleSouffle

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

// gán thông tin đăng nhập AWS tại đây theo cách sau:

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

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

9

Tôi đã xem qua mã của bạn và ở đây bạn đang kết nối với các dịch vụ AWS trước khi thiết lập khu vực, vì vậy tôi khuyên bạn nên cập nhật khu vực trước rồi kết nối với các dịch vụ hoặc tạo phiên bản của những dịch vụ đó như bên dưới -

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

Cùng một lỗi đối với tôi:

Sau khi thực hiện rất nhiều thử nghiệm, tôi đã giải quyết được những điều dưới đây:

LỰA CHỌN 1

  1. chỉ đặt AWS_REGIONbiến môi trường trong hệ thống cục bộ, thành us-east-1(ví dụ)

Đối với Linux:

xuất AWS_ACCESS_KEY_ID = AKIAIOSFODNN7EXAMPLE
xuất AWS_SECRET_ACCESS_KEY = wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY
xuất AWS_DEFAULT_REGION = us-East-1

Đối với Windows,
hãy xem: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

  1. bây giờ, không cần đặt bất kỳ biến lambda nào cho vùng
  2. ngoài ra, không cần sử dụng trong mã, ví dụ:

    • AWS.config.update(...), điều này không bắt buộc
    • AWS.S3(), v.v., những điều này sẽ hoạt động mà không gặp bất kỳ sự cố nào. Thay cho S3, có thể có bất kỳ dịch vụ aws nào

Trong một trường hợp hiếm hoi, nếu ở đâu đó một số giá trị mặc định được giả định trong mã và bạn buộc phải gửi vùng, thì hãy sử dụng{'region': process.env.AWS_REGION})


LỰA CHỌN 2

Thay vì các biến môi trường, một cách khác là tệp AWS CONFIG:

Trên Linux, bạn có thể tạo các tệp dưới đây:

~ / .aws / thông tin xác thực

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

~ / .aws / config

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

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


Bạn đặt cái này ở environment variableđâu? ý bạn là local system
Malcolm Salvador

@MalcolmSalvador Tôi đã cập nhật câu trả lời cho bạn, xem ở trên.
Manohar Reddy Poreddy

4

Đây có thể không phải là cách thích hợp để làm điều đó, nhưng tôi có tất cả các cấu hình của mình trong một tệp JSON riêng biệt. Và điều này khắc phục sự cố cho tôi

Để tải cấu hình AWS, tôi làm như sau:

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

config.aws chỉ là một tệp JSON.


1

Bạn có thể tạo một mô-đun chung và sử dụng nó dựa trên khu vực bạn muốn

var AWS = require('aws-sdk')

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

và tiêu thụ nó như,

 var s3Client = s3.getClient(config.region)

ý tưởng là Cập nhật cấu hình AWS trước khi khởi tạo s3

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.