Настройка региона в Node.js AWS SDK

123

Может кто-нибудь объяснить, как исправить отсутствующую ошибку конфигурации с помощью 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'});

(...)
Анеджа Дэниэлс
источник

Ответы:

208

Как насчет изменения порядка заявлений? Обновите конфигурацию AWS перед созданием экземпляров s3 и dd

var AWS = require('aws-sdk');
AWS.config.update({region:'us-east-1'});

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
зонтик
источник
1
Часы поиска, почему это не удалось ... это исправило.
FredArters
Это установит регион us-east-1для всех ресурсов, используйте регион для конкретного ресурса при создании объекта.
Атул Кумар
Это просто хакерство без попытки понять, почему клиент nodejs aws игнорирует настройки ~ \ .aws \ config
ffeast
Спасибо, это была проблема , которую я имел при установке httpOptions после инстанцирования cloudwatch
LJT
87

У меня была такая же проблема «Отсутствует регион в конфигурации», и в моем случае это было то, что, в отличие от 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" 
}
Zanon
источник
3
Ржунимагу. Таким образом, SDK будет читать из файла общих учетных данных, но конфигурация, которая всегда связана с ним, забудьте об этом!
duhseekoh
10
Престижность за выделение того, что CLI использует AWS_DEFAULT_REGIONи Sdk AWS_REGION. Это что-то неочевидное и то, что укусило меня в прошлом. Он выделен в нижней части Руководства разработчика AWS SDK для Javascript - Установка региона, но это не очевидно
Дмитрий К.
12
SDK может читать из ~ / .aws / config, но вам необходимо установить для переменной среды AWS_SDK_LOAD_CONFIGзначениеtrue
Гарет Окли
2
Это была моя проблема. Я думал, что это будет не глупо, и думаю, что это была моя ошибка.
Джастин Форс,
64

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

AWS_SDK_LOAD_CONFIG=1

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

Петр Дочев
источник
2
СПАСИБО! Я уже выполнил другие команды SET. Однако это было необходимо, чтобы использовать их в моем приложении Node.JS. set AWS_ACCESS_KEY_ID="KEY ID GOES HERE" set AWS_SECRET_ACCESS_KEY="SECRET KEY GOES HERE" set AWS_REGION="us-east-1"
SteckDEV
AWS_SDK_LOAD_CONFIG поддерживается начиная с 2.44.0, согласно журналу изменений SDK.
jarmod
2
работал отлично и ничего не требует жесткого кодирования в вашем скрипте: просто поместите process.env.AWS_SDK_LOAD_CONFIG = 1; до включения AWS
sashok_bg
отлично работал. Для информации любой, кто использует vscode и оболочку bash, вы можете добавить переменную окружения следующим образом: - $ export AWS_SDK_LOAD_CONFIG = 1
Тим Ньютон,
12

Вы можете указать регион при создании соединения с Dynamodb (не пробовал s3, но это тоже должно работать).

var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB({'region': 'us-east-1'});
ВафлиСуфле
источник
1
новый 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
9
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();
БХУВНЕШ КУМАР
источник
9

Я просмотрел ваш код, и здесь вы подключаетесь к сервисам 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

  1. установить AWS_REGIONпеременную среды только в локальной системе us-east-1(пример)

Для Linux:

экспорт AWS_ACCESS_KEY_ID = AKIAIOSFODNN7EXAMPLE
экспорт AWS_SECRET_ACCESS_KEY = wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY
экспорт AWS_DEFAULT_REGION = us-east-1

Для Windows
см .: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html.

  1. теперь нет необходимости устанавливать лямбда-переменные для региона
  2. также нет необходимости использовать в коде, например:

    • AWS.config.update(...), это не требуется
    • AWS.S3()и т.д., они будут работать без проблем. Вместо S3 может быть любой сервис aws

В редком случае, если где-то в коде предполагаются некоторые значения по умолчанию, и вы вынуждены отправить регион, используйте{'region': process.env.AWS_REGION})


ВАРИАНТ 2

Другой способ - это не переменные среды, а файл AWS CONFIG:

В Linux вы можете создавать следующие файлы:

~ / .Aws / полномочия

[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.

Манохар Редди Поредди
источник
Где вы это устанавливаете environment variable? что вы имеете в виду local system?
Малькольм Сальвадор,
@MalcolmSalvador Я обновил для вас ответ, см. Выше.
Манохар Редди Поредди,
4

Возможно, это неправильный способ сделать это, но у меня все мои конфигурации находятся в отдельном файле JSON. И это решает проблему для меня

Чтобы загрузить конфигурацию AWS, я делаю следующее:

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

config.aws - это просто файл JSON.

Тони
источник
1

Вы можете создать общий модуль и использовать его в зависимости от региона, который вы хотите

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

Sajeetharan
источник