在Node.js AWS SDK中配置区域

时间:2015-06-25 01:54:31

标签: javascript node.js amazon-web-services aws-sdk

有人可以解释如何使用Node.js修复丢失的配置错误吗?我已经按照aws doc page中的所有示例进行了操作,但无论如何我仍然会收到此错误。

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

(...)

14 个答案:

答案 0 :(得分:158)

如何改变陈述的顺序? 在实例化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 :(得分:62)

我遇到了同样的问题“在配置中缺少区域”,在我的情况下,与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');

  4. 从JSON文件加载

    JSON格式:

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

答案 2 :(得分:33)

如果您使用AWS CLI,则可能在〜/ .aws / config中定义了默认区域。遗憾的是,AWS SDK for JavaScript默认情况下不会加载它。要加载它,请定义env var

AWS_SDK_LOAD_CONFIG=1

请参阅https://github.com/aws/aws-sdk-js/pull/1391

答案 3 :(得分:11)

您可以在创建dynamodb连接时指定区域(避免尝试s3,但这也应该有效)。

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

答案 4 :(得分:6)

对我来说同样的错误:

做了很多试验后 我已经解决了以下问题:

  1. 仅将本地系统中的AWS_REGION环境变量设置为us-east-1(示例)
  2. 现在,无需为区域
  3. 设置任何lambda变量
  4. 此外,无需在代码中使用,例如:

    AWS.config.update(...)这不是必需的 AWS.XYZ()这将没有任何问题,XYZ是任何aws服务,如S3或其他

  5. [[在极少数情况下]]如果在代码中假设某些默认值并且您被迫发送区域,则使用{'region':process.env.AWS_REGION})

答案 5 :(得分:5)

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

答案 6 :(得分:4)

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

要加载AWS配置,请执行以下操作:

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

config.aws只是一个JSON文件。

答案 7 :(得分:2)

我已经遍历了您的代码,在这里您要在设置区域之前连接到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)

对于上面的评论,您始终可以通过添加以下内容从本地全局配置文件〜。/ aws / config中运行它:

process.env.AWS_SDK_LOAD_CONFIG="true";

这将加载您的本地全局配置文件,并使用您使用的任何凭据/帐户在遍历多个帐户/角色时非常方便。

答案 9 :(得分:1)

给我留下深刻印象的是这里还没有发布。

您可以使用

来代替使用AWS.config.update()设置区域
const s3 = new AWS.S3({
  region: "eu-central-1",
});

使其特定于实例。

答案 10 :(得分:0)

您可以创建一个公共模块,并根据您想要的区域

使用它
mvn -Dtest=YourTestCase test

并将其消费为,

var AWS = require('aws-sdk')

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

我们的想法是在实例化s3之前更新AWS配置

答案 11 :(得分:0)

最佳做法是利用Amazon Cognito身份池。

创建一个IAM策略,该策略定义对所需资源的访问。 (最低访问权限)

然后创建一个允许未经身份验证的身份的Amazon Cognito身份池。 然后将您创建的IAM策略附加到身份池的未经身份验证的角色。

设置完成后,您将使用以下代码:

   AWS.config.region = 'us-east-1';
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'IdentityPoolIdHere',
    });

Amazon Cognito假定在未经身份验证的身份中指定了IAM角色,在后台使用了Amazon STS,然后使用临时身份凭证填充配置,该临时凭据具有如IAM角色所附的IAM策略中所定义的可访问性。

答案 12 :(得分:0)

我知道我晚会很晚,但是我有一个适用于我的其他解决方案。

将凭据直接传递给每个资源可能是值得的。

let lambda = AWS.Lambda({region: "us-east-1"});
let credentials = new AWS.SharedIniFileCredentials({
    profile: PROFILE_NAME,   
});

lambda.config.credentials = credentials;

答案 13 :(得分:0)

您可以直接在项目目录中解决此问题。

  1. npm i -D dotenv
  2. 在我们项目的根目录中创建.env文件。
  3. 在该AWS_SDK_LOAD_CONFIG=1文件中设置环境变量.env
  4. const {config} = require("dotenv");在配置与DynamoDB的连接的同一文件中。
  5. config(),然后new AWS.DynamoDB()之前。

P.S。如前所述,问题是Node无法从您的aws.config文件中获取数据