Настройка региона в Node.js AWS SDK
Может кто-нибудь объяснить, как исправить отсутствующую ошибку конфигурации с 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 ответов
Как насчет изменения порядка выписок? Обновите конфигурацию AWS перед созданием экземпляров s3 и d d
var AWS = require('aws-sdk');
AWS.config.update({region:'us-east-1'});
var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
У меня была та же проблема "Отсутствует регион в конфигурации", и в моем случае это было то, что, в отличие от CLI или Python SDK, Node SDK не будет читать из ~\.aws\config
файл.
Чтобы решить эту проблему, у вас есть три варианта:
Настройте его программно (жестко):
AWS.config.update({region:'your-region'});
Используйте переменную окружения. В то время как CLI использует
AWS_DEFAULT_REGION
, Node SDK используетAWS_REGION
,Загрузить из файла JSON, используя
AWS.config.loadFromPath('./config.json');
Формат JSON:
{
"accessKeyId": "akid",
"secretAccessKey": "secret",
"region": "us-east-1"
}
Если вы работаете с AWS CLI, у вас, вероятно, есть регион по умолчанию, определенный в ~/.aws/config. К сожалению, AWS SDK для JavaScript не загружает его по умолчанию. Чтобы загрузить его, определите env var
AWS_SDK_LOAD_CONFIG=1
Та же ошибка для меня:
После многих испытаний
Я остановился на следующем:
- установить переменную среды AWS_REGION только в локальной системе, us-east-1 (пример)
- Теперь нет необходимости устанавливать лямбда-переменные для региона
также нет необходимости использовать в коде, например:
AWS.config.update (...) это не требуется
AWS.XYZ() это будет работать без проблем. XYZ - это любой сервис AWS, такой как S3 или другой.
[[В редких случаях]], если где-то в коде предполагаются некоторые значения по умолчанию, и вы вынуждены отправить регион, используйте {'region': process.env.AWS_REGION})
Вы можете указать регион при создании соединения DynamodB (не пробовал s3, но это тоже должно работать).
var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB({'region': 'us-east-1'});
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();
Я просмотрел ваш код, и здесь вы подключаетесь к сервисам 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';
Я впечатлен, это еще не было опубликовано здесь.
Вместо того, чтобы устанавливать регион с помощью
AWS.config.update()
, вы можете использовать
const s3 = new AWS.S3({
region: "eu-central-1",
});
чтобы сделать его конкретным.
Это может быть неправильный способ сделать это, но у меня есть все мои конфиги в отдельном файле JSON. И это решает проблему для меня
Чтобы загрузить конфигурацию AWS, я делаю это:
var awsConfig = config.aws;
AWS.config.region = awsConfig.region;
AWS.config.credentials = {
accessKeyId: awsConfig.accessKeyId,
secretAccessKey: awsConfig.secretAccessKey
}
config.aws - это просто файл JSON.
К приведенному выше комментарию вы всегда можете запустить его из локального глобального файла конфигурации ~./ Aws / config, добавив следующее:
process.env.AWS_SDK_LOAD_CONFIG="true";
Это загрузит ваш локальный глобальный файл конфигурации и будет использовать любые учетные данные / учетную запись, в которой вы находитесь, что действительно удобно при итерации через несколько учетных записей / ролей.
Вы можете решить эту проблему прямо в каталоге вашего проекта.
npm i -D dotenv
.- Создайте
.env
файл в корне нашего проекта. - Установить переменную среды
AWS_SDK_LOAD_CONFIG=1
в этом.env
файл. const {config} = require("dotenv");
в том же файле, где вы настраиваете подключение к DynamoDB.config()
до тебяnew AWS.DynamoDB()
.
PS Как кто-то упоминал ранее, проблема в том, что Node не получает данные из вашего файла aws.config
Сейчас 2022 год, и это лучший результат в Google по запросу «Отсутствует регион в конфигурации».
Для тех, кто получает эту ошибку при использовании AWS Node SDK в сочетании с профилями (т.е.~/.aws/config
и~/.aws/credentials
), решение — загрузить учетные данные для имени профиля (через AWS.SharedIniFileCredentials), а затем отдельно получить регион для имени профиля с помощью @aws-sdk/shared-ini-file-loader.
то есть
import AWS from "aws-sdk";
import { loadSharedConfigFiles } from "@aws-sdk/shared-ini-file-loader";
const profileName = "default"; // change this to whatever profile name you want
loadSharedConfigFiles().then((awsConfig) => {
// console.log(awsConfig);
const region = awsConfig?.configFile?.[profileName]?.region;
const credentials = new AWS.SharedIniFileCredentials({
profile: profileName,
});
// now use the credentials and the profile's region however you want
const pinpoint = new AWS.Pinpoint({
credentials: credentials,
region: region,
});
pinpoint.getApps({}, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
});
Я знаю, что Я КРАЙНЕ опаздываю на вечеринку, но у меня есть дополнительное решение, которое сработало для меня.
Возможно, стоит передавать учетные данные каждому ресурсу напрямую.
let lambda = AWS.Lambda({region: "us-east-1"});
let credentials = new AWS.SharedIniFileCredentials({
profile: PROFILE_NAME,
});
lambda.config.credentials = credentials;
Вы можете создать общий модуль и использовать его в зависимости от региона, который вы хотите
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
Член моей команды столкнулся с этой проблемой при попытке настроить обмен текстовыми сообщениями SNS с помощью AWS Node SDK.
Мы получали эту ошибку при запуске процесса:
ConfigError: Недопустимый регион в конфигурации
Вот как он это решил:
Первоначальный способ ссылки на учетные данные AWS:
AWS_ACCESS_KEY='AKIAR5NCt72I72Nrt267'
AWS_SECRET_ACCESS_KEY='DhnqpuPdfV9nwFufsKJLJsydfJb7HNjPb5suwpvM'
AWS_REGION='us-west-1'
Он просто убрал кавычки''
вокруг учетных данных, поэтому у нас было это:
AWS_ACCESS_KEY=AKIAR5NCt72I72Nrt267
AWS_SECRET_ACCESS_KEY=DhnqpuPdfV9nwFufsKJLJsydfJb7HNjPb5suwpvM
AWS_REGION=us-west-1
И потом нормально работало.
var AWS = require("aws-sdk");
AWS.config.getCredentials(function(err) {
if (err) console.log(err.stack);
// credentials not loaded
else {
console.log("Access key:", AWS.config.credentials.accessKeyId);
}
});
Лучше всего использовать пул Amazon Cognito Identity.
Создайте политику 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.
create a common module and use it based on the region you want to
var AWS = require('aws-sdk')
module.exports = {
getClient: function(region) {
AWS.config.update({ region: region })
return new AWS.S3()
}
}
----------------------------------------------------
And then you can use the following .
var s3Client = s3.getClient(config.region)
В моем случае я пытался использовать его в приложении React.JS, следуя этому руководству .
Мне нужно было переместить данные конфигурации в тот же файл, где я вызывал
DocumentClient
вместо того, чтобы иметь конфигурацию в моем
index.js
файл.