在Node.js AWS开发工具包中配置区域


123

有人可以解释如何使用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'});

(...)

Answers:


209

如何更改语句顺序?在实例化s3和dd之前更新AWS配置

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设置
最早

谢谢,这是我在实例化cloudwatch之后设置httpOptions时遇到的问题
LJT

87

我遇到了同样的问题“配置中缺少区域”,在我的情况下是,与CLI或Python SDK不同,Node SDK无法从~\.aws\config文件中读取。

要解决此问题,您有三种选择:

  1. 以编程方式进行配置(硬编码): AWS.config.update({region:'your-region'});

  2. 使用环境变量。在使用CLI的同时AWS_DEFAULT_REGION,Node SDK使用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和Sdk的荣誉AWS_REGION。那不是很明显,过去让我有些难过。它在AWS开发工具包Java版Java开发人员指南的底部-设置区域中突出显示,但并不明显
Dimitry K,

12
该SDK可以从〜/ .aws / config中读取,但是您需要将环境变量设置AWS_SDK_LOAD_CONFIGtrue
Gareth Oakley,

2
这是我的问题。我以为那不是愚蠢的,我想那是我的错误。
贾斯汀·

63

如果使用AWS CLI,则可能在〜/ .aws / config中定义了一个默认区域。不幸的是,适用于JavaScript的AWS开发工具包默认不会加载它。要加载它,请定义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 '18

根据SDK更改日志,自2.44.0起支持AWS_SDK_LOAD_CONFIG。
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}); 应该可以在文档中
找到

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. 现在,无需为区域设置任何lambda变量
  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
马尔科姆·萨尔瓦多

@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)

这个想法是在实例化s3之前更新AWS配置

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.