Node.js AWS SDKでのリージョンの構成


122

誰かがNode.jsで不足している設定エラーを修正する方法を説明できますか?私はaws docページのすべての例に従いましたが、何があってもこのエラーが発生します。

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

ステートメントの順序を変更するのはどうですか?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
これが失敗した理由を検索する時間。これで修正されました。
FredArters 2017

これによりus-east-1、すべてのリソースのリージョンが設定され、オブジェクトの作成時にリソース固有のリージョンが使用されます。
Atul Kumar

これは、AWSクライアントは無視〜\ .aws \コンフィグ設定nodejs理由を理解しようとせずに、単にハック
ffeast

おかげで、これは、cloudwatchをインスタンス化した後にhttpOptionsを設定するときに私が抱えていた問題でした
LJT

87

同じ問題「Missing region in config」がありましたが、私の場合は、CLIまたはPython SDKとは異なり、Node SDKが~\.aws\configファイルから読み取れません。

これを解決するには、3つのオプションがあります。

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

3
笑。そのため、SDKは共有の認証情報ファイルから読み取りますが、常にそれとペアになっている構成は無視されます。
duhseekoh

10
CLIがAWS_DEFAULT_REGIONSdkを使用していることを強調した功績AWS_REGION。それは自明ではないものであり、過去に私を悩ませたものです。AWS SDK For Javascript開発者ガイド-リージョンの設定の下部で強調表示されていますが、明確ではありません
Dimitry K

12
SDKには、〜/ .aws /設定から読み取ることはできますが、環境変数を設定する必要がありますAWS_SDK_LOAD_CONFIGtrue
ギャレス・オークリー

2
これが私の問題でした。ばかじゃないと思ったのは間違いだったと思います。
ジャスティンフォース

63

AWS CLIを使用している場合は、〜/ .aws / configにデフォルトのリージョンが定義されている可能性があります。残念ながら、AWS SDK for 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 2018年

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
Tim Newton

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});
いれ

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の場合:

export AWS_ACCESS_KEY_ID = AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY = wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY
export 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 / credentials

[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回答を更新しました。上記をご覧ください。
Manohar Reddy Poreddy

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)

アイデアは、s3をインスタンス化する前にAWS構成を更新することです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.