Настройка региона в 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 файл.

Чтобы решить эту проблему, у вас есть три варианта:

  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" 
}

Если вы работаете с AWS CLI, у вас, вероятно, есть регион по умолчанию, определенный в ~/.aws/config. К сожалению, AWS SDK для JavaScript не загружает его по умолчанию. Чтобы загрузить его, определите env var

AWS_SDK_LOAD_CONFIG=1

См. https://github.com/aws/aws-sdk-js/pull/1391

Та же ошибка для меня:

После многих испытаний
Я остановился на следующем:

  1. установить переменную среды AWS_REGION только в локальной системе, us-east-1 (пример)
  2. Теперь нет необходимости устанавливать лямбда-переменные для региона
  3. также нет необходимости использовать в коде, например:

    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";

Это загрузит ваш локальный глобальный файл конфигурации и будет использовать любые учетные данные / учетную запись, в которой вы находитесь, что действительно удобно при итерации через несколько учетных записей / ролей.

Вы можете решить эту проблему прямо в каталоге вашего проекта.

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

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файл.

Другие вопросы по тегам