Configurando a região no Node.js AWS SDK

122

Alguém pode explicar como corrigir um erro de configuração ausente com Node.js? Eu segui todos os exemplos da página de doc do aws, mas ainda recebo esse erro, não importa o quê.

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

Aqui está o meu código:

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

(...)
Anejah Daniels
fonte

Respostas:

208

Que tal mudar a ordem das declarações? Atualize a configuração da AWS antes de instanciar s3 e dd

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

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
guarda-chuva
fonte
1
Horas de busca para saber por que isso estava falhando .. isso corrigiu.
FredArters
Isso definirá a região us-east-1para todos os recursos, use região específica do recurso ao criar o objeto.
Atul Kumar
É apenas um hack sem tentar descobrir por que o cliente nodejs aws ignora as configurações de ~ \ .aws \ config
festa de
Graças, este foi o problema que tive ao configurar httpOptions após instanciar CloudWatch
LJT
87

Eu tive o mesmo problema "Região ausente na configuração" e no meu caso era que, ao contrário do CLI ou Python SDK, o Node SDK não lê o ~\.aws\configarquivo.

Para resolver isso, você tem três opções:

  1. Configure-o programaticamente (codificado): AWS.config.update({region:'your-region'});

  2. Use uma variável de ambiente. Enquanto a CLI usa AWS_DEFAULT_REGION, o Node SDK usa AWS_REGION.

  3. Carregar de um arquivo JSON usando AWS.config.loadFromPath('./config.json');

Formato JSON:

{ 
    "accessKeyId": "akid", 
    "secretAccessKey": "secret", 
    "region": "us-east-1" 
}
Zanon
fonte
3
Ri muito. Portanto, o SDK irá ler o arquivo de credenciais compartilhado, mas a configuração que está sempre associada a ele, esqueça!
duhseekoh
10
Parabéns por destacar que CLI usa AWS_DEFAULT_REGIONe Sdk AWS_REGION. Isso é algo não óbvio e algo que me mordeu no passado. Ele é destacado na parte inferior do AWS SDK For Javascript Developer Guide - Definindo a região, mas não é óbvio
Dimitry K
12
O SDK pode ler de ~ / .aws / config, mas você precisa definir a variável de ambiente AWS_SDK_LOAD_CONFIGparatrue
Gareth Oakley
2
Esse era o meu problema. Achei que não seria estúpido e acho que foi esse o meu erro.
Justin Force
63

Se você trabalha com AWS CLI, provavelmente tem uma região padrão definida em ~ / .aws / config. Infelizmente, o SDK da AWS para JavaScript não o carrega por padrão. Para carregá-lo, defina env var

AWS_SDK_LOAD_CONFIG=1

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

Peter Dotchev
fonte
2
OBRIGADO! Já havia executado os outros comandos SET. No entanto, este foi necessário para usá-los em meu aplicativo 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 é compatível a partir de 2.44.0, de acordo com o log de alterações do SDK.
jarmod
2
funcionou perfeitamente e não requer codificação permanente em seu script: basta colocar process.env.AWS_SDK_LOAD_CONFIG = 1; antes de incluir AWS
sashok_bg
funcionou muito bem. Para obter informações de qualquer pessoa usando vscode e bash shell, você pode adicionar a variável de ambiente da seguinte forma: - $ export AWS_SDK_LOAD_CONFIG = 1
Tim Newton
12

Você pode especificar a região ao criar a conexão dynamodb (não tentei s3, mas também deve funcionar).

var AWS = require('aws-sdk');
var dd = new AWS.DynamoDB({'region': 'us-east-1'});
WaffleSouffle
fonte
1
new AWS.DynamoDB ({'region': 'us-east-1'}) não funciona, você precisa chamar AWS.config.update ({region: 'your region'})
HaneTV
1
No momento estou testando com dynamodb rodando localmente, então o comportamento pode ser diferente. Certamente funciona em todo o código que estou usando naquele ambiente. var dynamodb = new AWS.DynamoDB({ 'region': 'eu-west-1', 'endpoint': 'http://localhost:8000' }); var docClient = new AWS.DynamoDB.DocumentClient({"service": dynamodb}); Deve funcionar
conforme
9
var AWS = require('aws-sdk');

// atribua credenciais AWS aqui da seguinte maneira:

AWS.config.update({
  accessKeyId: 'asdjsadkskdskskdk',
  secretAccessKey: 'sdsadsissdiidicdsi',
  region: 'us-east-1'
});

var dd = new AWS.DynamoDB();
var s3 = new AWS.S3();
BHUVNESH KUMAR
fonte
9

Analisei seu código e aqui você está se conectando aos serviços da AWS antes de definir a região, então sugiro que você atualize a região primeiro e, em seguida, conecte-se aos serviços ou crie uma instância como abaixo -

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';
Himanshu Tongya
fonte
8

Mesmo erro para mim:

Depois de fazer muitos testes, resolvi o seguinte:

OPÇÃO 1

  1. definir a AWS_REGIONvariável de ambiente apenas no sistema local, para us-east-1(exemplo)

Para Linux:

export AWS_ACCESS_KEY_ID = AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY = wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY
export AWS_DEFAULT_REGION = us-east-1

Para Windows,
consulte: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

  1. agora, não há necessidade de definir nenhuma variável lambda para a região
  2. também, não há necessidade de usar no código, por exemplo:

    • AWS.config.update(...), isso não é necessário
    • AWS.S3()etc., funcionarão sem problemas. No lugar do S3, pode haver qualquer serviço aws

Em um caso raro, se em algum lugar alguns padrões forem assumidos no código e você for forçado a enviar região, use{'region': process.env.AWS_REGION})


OPÇÃO 2

Em vez de variáveis ​​de ambiente, outra maneira é o arquivo AWS CONFIG:

No Linux, você pode criar os arquivos abaixo:

~ / .aws / credentials

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

~ / .aws / config

[default]
region=us-west-2
output=json

Consulte https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html

Manohar Reddy Poreddy
fonte
Onde você define isso environment variable ? o que você quer dizer com local system?
Malcolm Salvador
@MalcolmSalvador Atualizei a resposta para você, veja acima.
Manohar Reddy Poreddy
4

Essa pode não ser a maneira certa de fazer isso, mas tenho todas as minhas configurações em um arquivo JSON separado. E isso resolve o problema para mim

Para carregar a configuração da AWS, eu faço o seguinte:

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

config.aws é apenas um arquivo JSON.

Tony
fonte
1

Você pode criar um módulo comum e usá-lo com base na região que deseja

var AWS = require('aws-sdk')

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

e consumi-lo como,

 var s3Client = s3.getClient(config.region)

a ideia é atualizar a configuração da AWS antes de instanciar s3

Sajeetharan
fonte