有人可以解释如何使用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'});
(...)
答案 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
文件中读取。
要解决此问题,您有三种选择:
以编程方式(硬编码)配置:AWS.config.update({region:'your-region'});
使用环境变量。 CLI使用AWS_DEFAULT_REGION
时,Node SDK使用AWS_REGION
。
使用AWS.config.loadFromPath('./config.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
答案 3 :(得分:11)
您可以在创建dynamodb连接时指定区域(避免尝试s3,但这也应该有效)。
var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB({'region': 'us-east-1'});
答案 4 :(得分:6)
对我来说同样的错误:
做了很多试验后 我已经解决了以下问题:
此外,无需在代码中使用,例如:
AWS.config.update(...)这不是必需的 AWS.XYZ()这将没有任何问题,XYZ是任何aws服务,如S3或其他
[[在极少数情况下]]如果在代码中假设某些默认值并且您被迫发送区域,则使用{'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)
您可以直接在项目目录中解决此问题。
npm i -D dotenv
。.env
文件。AWS_SDK_LOAD_CONFIG=1
文件中设置环境变量.env
。const {config} = require("dotenv");
在配置与DynamoDB的连接的同一文件中。config()
,然后new AWS.DynamoDB()
之前。P.S。如前所述,问题是Node无法从您的aws.config文件中获取数据