การกำหนดค่าภูมิภาคใน Node.js AWS SDK


123

ใครช่วยอธิบายวิธีแก้ไขข้อผิดพลาด config ที่หายไปกับ Node.js ได้ไหม ฉันได้ติดตามตัวอย่างทั้งหมดจากหน้าaws docแต่ฉันยังคงได้รับข้อผิดพลาดนี้ไม่ว่าจะเกิดอะไรขึ้น

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

นี่คือรหัสของฉัน:

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

(...)

คำตอบ:


208

การเปลี่ยนลำดับของงบเป็นอย่างไร? อัปเดต AWS config ก่อนที่จะอินสแตนซ์ s3 และ dd

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

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

1
ชั่วโมงแห่งการค้นหาว่าทำไมสิ่งนี้ถึงล้มเหลว .. สิ่งนี้ได้รับการแก้ไขแล้ว
FredArters

สิ่งนี้จะตั้งค่าภูมิภาคเป็นus-east-1สำหรับทรัพยากรทั้งหมดใช้พื้นที่เฉพาะของทรัพยากรในขณะที่สร้างวัตถุ
Atul Kumar

เป็นเพียงการแฮ็กโดยไม่ต้องพยายามหาสาเหตุว่าทำไมไคลเอนต์ nodejs aws จึงละเว้นการตั้งค่า ~ \ .aws \ config
ffeast

ขอบคุณนี่คือปัญหาที่ฉันพบเมื่อตั้งค่า httpOptions หลังจากสร้างอินสแตนซ์
cloudwatch

87

ฉันมีปัญหาเดียวกัน "Missing region in config" และในกรณีของฉันก็คือไม่เหมือนกับใน CLI หรือ Python SDK Node SDK จะไม่อ่านจาก ~\.aws\configไฟล์

ในการแก้ปัญหานี้คุณมีสามตัวเลือก:

  1. กำหนดค่าโดยใช้โปรแกรม (ฮาร์ดโค้ด): AWS.config.update({region:'your-region'});

  2. ใช้ตัวแปรสภาพแวดล้อม ในขณะที่การใช้ CLI AWS_DEFAULT_REGION, AWS_REGIONการใช้โหนด

  3. โหลดจากไฟล์ JSON โดยใช้ AWS.config.loadFromPath('./config.json');

รูปแบบ JSON:

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

3
ฮ่า ๆ. ดังนั้น SDK จะอ่านจากไฟล์ข้อมูลรับรองที่ใช้ร่วมกัน แต่การกำหนดค่านั้นจับคู่กับมันเสมออย่าลืม!
duhseekoh

10
รุ่งโรจน์สำหรับไฮไลต์ที่ใช้ CLI AWS_DEFAULT_REGIONและ AWS_REGIONSDK ของ นั่นเป็นสิ่งที่ไม่ชัดเจนและเป็นสิ่งที่กัดฉันในอดีต ไฮไลต์อยู่ที่ด้านล่างของAWS SDK For Javascript Developer Guide - การตั้งค่าภูมิภาคแต่ไม่ชัดเจน
Dimitry K

12
SDK สามารถอ่านได้จาก ~ / .aws / config แต่คุณต้องตั้งค่าตัวแปรสภาพแวดล้อมAWS_SDK_LOAD_CONFIGเป็นtrue
Gareth Oakley

2
นี่คือปัญหาของฉัน ฉันคิดว่ามันคงไม่โง่และฉันเดาว่านั่นเป็นความผิดพลาดของฉัน
Justin Force

63

หากคุณทำงานกับ AWS CLI คุณอาจมีขอบเขตเริ่มต้นที่กำหนดไว้ใน ~ / .aws / config ขออภัย AWS SDK สำหรับ JavaScript ไม่โหลดโดยค่าเริ่มต้น ในการโหลดให้กำหนด env var

AWS_SDK_LOAD_CONFIG=1

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


2
ขอบคุณ! ฉันได้ดำเนินการคำสั่ง SET อื่น ๆ แล้ว อย่างไรก็ตามสิ่งนี้จำเป็นต้องใช้ในแอป 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 ได้รับการสนับสนุนตั้งแต่ 2.44.0 ต่อบันทึกการเปลี่ยนแปลง SDK
jarmod

2
ทำงานได้อย่างสมบูรณ์แบบและไม่ต้องใช้การเข้ารหัสใด ๆ ในสคริปต์ของคุณ: เพียงแค่ใส่ process.env.AWS_SDK_LOAD_CONFIG = 1; ก่อนรวม AWS
sashok_bg

ทำงานได้ดี สำหรับข้อมูลทุกคนที่ใช้ vscode และ bash shell คุณสามารถเพิ่มตัวแปรสภาพแวดล้อมได้ดังนี้: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton

12

คุณสามารถระบุภูมิภาคเมื่อสร้างการเชื่อมต่อ dynamodb (ยังไม่ได้ลอง s3 แต่ก็น่าจะใช้ได้เช่นกัน)

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

1
AWS.DynamoDB ใหม่ ({'region': 'us-east-1'}) ไม่ทำงานคุณต้องโทรไปที่ AWS.config.update ({region: 'your region'})
HaneTV

1
ในขณะนี้ฉันกำลังทดสอบโดย dynamodb ทำงานในเครื่องดังนั้นพฤติกรรมอาจแตกต่างออกไป แน่นอนว่ามันใช้ได้กับทุกรหัสที่ฉันใช้ในสภาพแวดล้อมนั้น var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); ควรใช้งานได้รับในเอกสาร
WaffleSouffle

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

// กำหนดข้อมูลรับรอง AWS ที่นี่ด้วยวิธีต่อไปนี้:

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

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

9

ฉันได้อ่านรหัสของคุณและที่นี่คุณกำลังเชื่อมต่อกับบริการของ AWS ก่อนที่จะตั้งค่าภูมิภาคดังนั้นฉันขอแนะนำให้คุณอัปเดตภูมิภาคก่อนจากนั้นจึงเชื่อมต่อกับบริการหรือสร้างอินสแตนซ์ของสิ่งเหล่านั้นดังต่อไปนี้ -

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

ข้อผิดพลาดเดียวกันสำหรับฉัน:

หลังจากทำการทดลองหลายครั้งฉันได้ตัดสินด้านล่าง:

ตัวเลือกที่ 1

  1. ตั้งค่าAWS_REGIONตัวแปรสภาพแวดล้อมในระบบโลคัลเท่านั้นเป็นus-east-1(ตัวอย่าง)

สำหรับ Linux:

ส่งออก AWS_ACCESS_KEY_ID = AKIAIOSFODNN7EXAMPLE
ส่งออก AWS_SECRET_ACCESS_KEY = wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY
ส่งออก AWS_DEFAULT_REGION = us-east-1

สำหรับ Windows
โปรดดู: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

  1. ตอนนี้ไม่จำเป็นต้องตั้งค่าตัวแปรแลมด้าสำหรับภูมิภาค
  2. ยังไม่จำเป็นต้องใช้ในโค้ดตัวอย่างเช่น:

    • AWS.config.update(...)นี้จะไม่จำเป็นต้องใช้
    • AWS.S3()ฯลฯ สิ่งเหล่านี้จะทำงานได้โดยไม่มีปัญหาใด ๆ แทนที่ S3 สามารถมีบริการ aws ใดก็ได้

ในบางกรณีที่เกิดขึ้นไม่บ่อยนักหากมีการใช้ค่าเริ่มต้นบางอย่างในรหัสและคุณถูกบังคับให้ส่งภูมิภาคจากนั้นใช้{'region': process.env.AWS_REGION})


ตัวเลือก 2

แทนที่จะเป็นตัวแปรสภาพแวดล้อมอีกวิธีหนึ่งคือไฟล์ AWS CONFIG:

บน Linux คุณสามารถสร้างไฟล์ด้านล่าง:

~ / .aws / ข้อมูลประจำตัว

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

~ / .aws / config

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

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


คุณตั้งค่านี้ไว้environment variableที่ไหน คุณหมายถึงlocal systemอะไร?
Malcolm Salvador

@MalcolmSalvador ฉันได้อัปเดตคำตอบสำหรับคุณแล้วดูด้านบน
Manohar Reddy Poreddy

4

นี่อาจไม่ใช่วิธีที่ถูกต้อง แต่ฉันมีการกำหนดค่าทั้งหมดในไฟล์ JSON แยกต่างหาก และนี่จะช่วยแก้ปัญหาให้ฉันได้

ในการโหลดการกำหนดค่า AWS ฉันทำสิ่งนี้:

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

config.aws เป็นเพียงไฟล์ JSON


1

คุณสามารถสร้างโมดูลทั่วไปและใช้งานได้ตามภูมิภาคที่คุณต้องการ

var AWS = require('aws-sdk')

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

และบริโภคมันเป็น

 var s3Client = s3.getClient(config.region)

แนวคิดคือการอัปเดตการกำหนดค่า AWS ก่อนที่จะอินสแตนซ์ s3

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.