配置Node.js AWS SDK中的区域

192

有人能解释一下如何修复 Node.js 中的缺失配置错误吗?我已经按照AWS 文档页面中的所有示例操作了,但无论如何仍然会收到此错误。

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

(...)
19个回答

277

改变语句的顺序如何?在实例化 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();

3
搜索了数小时才找出原因,最后解决了这个问题。 - FredArters
1
这将为所有资源设置区域为 us-east-1,在创建对象时使用特定于资源的区域。 - Atul Kumar
3
这只是一个hack,没有尝试弄清楚为什么Node.js AWS客户端会忽略~/.aws/config设置。 - Oleg Kuralenko
@AtulKumar,你说得对,这确实很不安全。在我的情况下,SQS服务在us-east-1,其余部分在us-east-2,一些SNS在拉丁美洲。 - pmiranda
请注意:使用此方法会导致更高的内存使用率。您应该改用 AWS_REGION。在我的测试中,仅导入所需的客户端会导致总体RAM使用率提高了多达600 Mi(根据k8s指标服务器)。 - Marvin
显示剩余2条评论

129

我遇到了同样的问题“Missing region in config”,在我的情况下,与CLI或Python SDK不同,Node SDK不会从~\.aws\config文件中读取。

要解决此问题,您有三个选项:

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

  2. 使用环境变量。虽然CLI使用AWS_DEFAULT_REGION,但Node SDK使用AWS_REGION

  3. 使用AWS.config.loadFromPath('./config.json');从JSON文件加载。

JSON格式:

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

7
哈哈,所以SDK将从共享凭据文件中读取,但是始终与其配对的配置文件,就忘了它吧! - duhseekoh
14
感谢您强调CLI使用AWS_DEFAULT_REGION,而SDK使用AWS_REGION。这是一些非显而易见的内容,过去也曾给我带来了困扰。在AWS SDK For Javascript开发者指南—设置区域的底部进行了强调,但它并不明显。 - Dimitry K
31
SDK可以读取~/.aws/config文件,但需要将环境变量AWS_SDK_LOAD_CONFIG设置为true - Gareth Oakley
5
这是我的问题。我原以为这不会很蠢,但我想这就是我的错误。 - Justin Force
谢谢。在我的情况下,我想运行一个Jest测试。总是得到这个错误,我尝试像在我的流水线中一样设置AWS_DEFAULT_REGION。现在我在测试上下文中设置了process.env.AWS_REGION,它可以工作了。 - DevNik

99
如果您使用AWS CLI,则可能在~/.aws/config中定义了默认区域。不幸的是,AWS JavaScript SDK默认不加载它。要加载它,请定义环境变量。
AWS_SDK_LOAD_CONFIG=1

请查看https://github.com/aws/aws-sdk-js/pull/1391


3
谢谢!我已经执行了其他SET指令。然而,这个指令在我的Node.JS应用程序中使用它们是必要的。set AWS_ACCESS_KEY_ID="输入密钥ID" set AWS_SECRET_ACCESS_KEY="输入秘钥" set AWS_REGION="us-east-1" - SteckDEV
从SDK更改日志来看,AWS_SDK_LOAD_CONFIG已于2.44.0得到支持。 - jarmod
3
运行正常,且不需要在脚本中硬编码任何内容: 只需在包含 AWS 之前加入 process.env.AWS_SDK_LOAD_CONFIG=1; 即可。 - sashok_bg
很好地工作。对于使用VSCode和Bash shell的任何人,您可以按以下方式添加环境变量: $ export AWS_SDK_LOAD_CONFIG=1 - Tim Newton

15

我也遇到了同样的错误:

经过多次尝试,我选择以下方案:

方案1

  1. 仅在本地系统中设置AWS_REGION环境变量为us-east-1(例如)

对于Linux:

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export 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/credentials

[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


你在哪里设置这个“环境变量”?“本地系统”是什么意思? - Malcolm Salvador
@MalcolmSalvador 我已经为您更新了答案,请参见上文。 - Manohar Reddy Poreddy
1
export AWS_REGION=us-east-1 instead of export AWS_DEFAULT_REGION=us-east-1 - Thomas Lehoux

13

在创建 DynamoDB 连接时,您可以指定区域(虽然我没有尝试 S3,但那应该也行)。

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

2
新的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

12
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();

无论我以什么方式添加区域,它始终为空。可以通过更新或在实例化内部进行添加。 - Jason G

10

我已经查看了您的代码,发现在设置地区之前即连接到 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';

10

我很惊讶这里还没有发布过这个内容。

你可以使用以下方法来设置区域,而不是使用AWS.config.update()

const s3 = new AWS.S3({
  region: "eu-central-1",
});

使其特定于实例。

我也想说这个。我很惊讶这没有被到处提及。这是官方的AWS指南:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-region.html - Thomas Cheng

6

这可能不是正确的方法,但我将所有配置都放在一个单独的JSON文件中。这对我来说解决了问题。

要加载AWS配置,我做了以下操作:

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

config.aws只是一个JSON文件。


3
对于上面的评论,您可以通过在本地的全局配置文件~./aws/config中添加以下内容来运行它:
process.env.AWS_SDK_LOAD_CONFIG="true";

这将加载您的本地全局配置文件并使用您当前的凭据/账户,当需要遍历多个账户/角色时非常方便。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接