sourcecode

Node.js AWS SDK에서 영역 구성

copyscript 2023. 8. 27. 09:46
반응형

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

(...)

진술 순서를 변경하는 것은 어떻습니까?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();

in config한 문제가 , 제 SDK가 "Missing region in config"에서 수 . "구성에 지역이 없습니다". 경 CLI 는 Python SDK 리 Node SDK 달~\.aws\configjava.

이 문제를 해결하려면 다음과 같은 세 가지 옵션이 옵션은 다음과 같습니다.

  1. 프로그래밍 방식으로 구성(하드 코딩):AWS.config.update({region:'your-region'});

  2. 환경 변수를 사용합니다.가 CLI를 사용하는 AWS_DEFAULT_REGION는 사용노 SDK를 합니다.AWS_REGION.

  3. 파일을 사용하여 AWS.config.loadFromPath('./config.json');

JSON 형식:

{ 
    "accessKeyId": "akid", 
    "secretAccessKey": "secret", 
    "region": "us-east-1" 
}

AWS CLI로 작업하는 경우 ~/.aws/config에 정의된 기본 영역이 있을 수 있습니다.안타깝게도 AWS SDK for JavaScript는 기본적으로 로드되지 않습니다.로드 방법환경 정의

AWS_SDK_LOAD_CONFIG=1

https://github.com/aws/aws-sdk-js/pull/1391 참조하십시오.

저도 같은 오류입니다.

여러 번 시험해 본 결과, 다음과 같은 결론을 내렸습니다.

옵션 1

  1. 을 설정합니다.AWS_REGION, " " " " ", "us-east-1 (소리)

Linux의 경우:

AKIAIOSFODNN7예 ID=AKIAIOSFODNN7"
/K7MDENG/bPxRfiCYEAMPLEKAWS_SECRET_ACCESS_KEY=wJalrXutnFEMI/K7MDENG/BPxFICYEX샘플키
AWS_DEFAULT_REGINAL AWS_DEFAULT_REGINAL=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, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS, AWS,

드문 경우이지만 코드에서 일부 기본값을 가정하고 지역을 전송해야 하는 경우에는 다음을 사용합니다.{'region': process.env.AWS_REGION})


옵션 2

환경 변수 대신 다른 방법은 AWS CONFIG 파일입니다.

Linux에서 다음 파일을 만들 수 있습니다.

~/.aw/자격 증명

[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 을 참조하십시오.

dynamicodb 연결을 만들 때 영역을 지정할 수 있습니다(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 그점서에..envjava.
  4. const {config} = require("dotenv");DynamoDB에 대한 연결을 구성하는 동일한 파일에 있습니다.
  5. config() 앞에서new AWS.DynamoDB().

추신: 이전에 누군가가 언급했듯이, 문제는 노드가 aws.config 파일에서 데이터를 가져오지 않는다는 것입니다.

2022년이고 이것은 "구성에서 지역 누락"에 대한 구글의 최고 결과입니다.

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

공통 모듈을 생성하여 원하는 지역에 따라 사용할 수 있습니다.

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 구성을 업데이트하는 것입니다.

제가 파티에 엄청나게 늦었다는 것을 알지만, 저에게 효과가 있는 추가적인 해결책이 있습니다.

각 리소스에 자격 증명을 직접 전달할 수 있습니다.

let lambda = AWS.Lambda({region: "us-east-1"});
let credentials = new AWS.SharedIniFileCredentials({
    profile: PROFILE_NAME,   
});

lambda.config.credentials = credentials;

팀원 중 한 명이 AWS Node SDK로 SNS Text Messaging을 설정할 때 이 문제가 발생했습니다.

프로세스를 실행할 때 다음 오류가 발생했습니다.

구성 오류:구성에 잘못된 영역이 있습니다.

그가 해결한 방법은 다음과 같습니다.

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

그리고 그것은 나중에 잘 작동했습니다.

Amazon Cognito Identity 풀을 사용하는 것이 가장 좋습니다.

원하는 리소스에 대한 액세스 권한을 정의하는 IAM 정책을 만듭니다.(최소 액세스 권한)

그런 다음 인증되지 않은 ID를 허용하는 Amazon Cognito ID 풀을 만듭니다.그런 다음 생성한 IAM 정책을 ID 풀의 인증되지 않은 역할에 연결합니다.

설정이 완료되면 다음 코드를 사용합니다.

   AWS.config.region = 'us-east-1';
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'IdentityPoolIdHere',
    });

Amazon Cognito는 Amazon STS가 백그라운드에서 사용되는 인증되지 않은 ID에 지정된 IAM 역할을 가정하고 IAM 역할에 대해 첨부된 IAM 정책에 정의된 대로 액세스 가능성이 있는 임시 자격 증명으로 구성을 채웁니다.

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

저 같은 경우에는 리액트에서 사용하려고 했습니다. 튜토리얼 이후의 JS 앱.

구성 데이터를 호출할 때와 동일한 파일로 이동해야 했습니다.DocumentClient내 구성 대신index.js파일.

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)

언급URL : https://stackoverflow.com/questions/31039948/configuring-region-in-node-js-aws-sdk

반응형