aws-sdk NodeJS从环境变量阅读凭证

pw136qt2  于 2023-04-29  发布在  Node.js
关注(0)|答案(7)|浏览(311)

我正在运行使用aws-sdk库的NodeJS应用程序。我导出了以下环境变量:

AWS_ACCESS_KEY_ID=XXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX

我可以通过运行env命令以及在Node代码中运行console.log(process.env)来验证它们是否正确设置。
当运行我的应用程序时,我得到以下错误:

Error: ENOENT: no such file or directory, open '/root/.aws/credentials'
    at Object.fs.openSync (fs.js:577:3)
    at Object.fs.readFileSync (fs.js:483:33)
    at Object.readFileSync (/app/node_modules/aws-sdk/lib/util.js:97:26)
    at SharedIniFile.loadFile [as ensureFileLoaded] (/app/node_modules/aws-sdk/lib/shared_ini.js:19:18)
    at SharedIniFile.loadProfile [as getProfile] (/app/node_modules/aws-sdk/lib/shared_ini.js:52:10)
    at Config.region (/app/node_modules/aws-sdk/lib/node_loader.js:88:34)
    at Config.set (/app/node_modules/aws-sdk/lib/config.js:448:39)
    at Config.<anonymous> (/app/node_modules/aws-sdk/lib/config.js:283:12)
    at Config.each (/app/node_modules/aws-sdk/lib/util.js:485:32)
    at new Config (/app/node_modules/aws-sdk/lib/config.js:282:19)
    at Object.<anonymous> (/app/node_modules/aws-sdk/lib/node_loader.js:99:14)
    at Module._compile (internal/modules/cjs/loader.js:702:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)
    at Module.load (internal/modules/cjs/loader.js:612:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
    at Function.Module._load (internal/modules/cjs/loader.js:543:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1

显然,确切的问题是显而易见的,我没有一个/root/.aws/credentials文件。然而,从阅读中,特别是here,似乎sdk应该自动检测我的环境变量,而不需要有凭证文件。
我的问题是如何让aws-sdk在我的环境变量中使用凭据,而不会因为没有凭据文件而出错?

nhaq1z21

nhaq1z211#

我相信你得到这个问题,如果你访问一个功能,需要一个地区(这是最)。
您需要导出AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_REGION。您缺少AWS_REGION。
注意:如果这不起作用,您可以使用AWS SDK版本提供堆栈跟踪。

2w3rbyxf

2w3rbyxf2#

潜在原因:确保未设置AWS_SDK_LOAD_CONFIG

在以前的一个项目中,我的环境中有AWS_SDK_LOAD_CONFIG=1挂起。这一直迫使AWS SDK寻找凭据文件。我从我的bash_profile中删除了这个,SDK终于可以使用env变量作为我的key/secret。

2w3rbyxf

2w3rbyxf3#

我也有同样的问题。这让我头疼不已,因为我在AWS Fargate中运行了这个程序,在那里调试并不容易。
该错误意味着Javascript SDK无法找到AWS凭据。在这里,您可以看到SDK尝试加载凭据的顺序:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html
我的错误是相当尴尬的,我只是在我的环境变量中有一个打字错误。我的变量是AWS_ACCESSS_KEY_ID而不是AWS_ACCESS_KEY_ID。很难看出区别,对吧?)
因此,可能要仔细检查环境变量的名称(如果使用配置文件,则检查配置文件中的所有行)

jq6vz3qz

jq6vz3qz4#

AWS-SDK自动获取。aws/credentials文件的凭据。

  • 在Windows中,它位于C:\Users\username\中。aws\凭据
  • 在Linux中,它很可能在~/中。aws/credentials位置。另外,你应该注解如下,

[default] AWS_ACCESS_KEY_ID=XXXXXXXXXXXXX AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX

3ks5zfa0

3ks5zfa05#

你是否在shell配置文件中导出了env变量?如果你能够在你的节点代码中打印process.env.AWS_ACCESS_KEY_ID,那么你的节点就能够读取env文件。aws sdk获取creds的precedence顺序是首先是env变量,然后是凭证文件。因此,很可能您的env变量没有正确导出(或者对于您的节点代码来说是可读的)。请注意,您必须重新启动终端控制台才能使env var更改生效。希望这能帮上忙。

irtuqstp

irtuqstp6#

目前AWS提供了自己的方法来从外部文件动态加载AWS凭证,不需要使用任何库,如'dotenv'。只需要创建creds。json文件在你的项目文件夹中,在这个文件中你可以添加任何aws凭证,比如,fyi区域是硬编码的
creds.json

{
 "region": "us-east-1", // region also you can change
 "accessKeyId": "YOUR_ACCESS_KEY",
 "secretAccessKey": "YOUR_SECRET_KEY"
}

在你的索引中加载这个文件。jsapp。js使用以下代码片段
index.js

var AWS = require("aws-sdk");
AWS.config.loadFromPath('./creds.json');

var ec2 = new AWS.EC2(); //just create whatever instance you like from aws-sdk

仅供参考我的项目文件夹就像

demo/
   index.js
   config.json
   package.json
   ...

>> node index.js

就像魅力一样。.如果你面对文件找不到错误**/.aws/credentials**只需在正确路径中创建预期的空文件

3yhwsihp

3yhwsihp7#

一种可能的方式来创造。在项目的根文件夹中的env文件:

AWS_ACCESS_KEY_ID=aws_access_key
AWS_SECRET_ACCESS_KEY=aws_secret_key

然后简单地将这行代码require("dotenv").config();添加到节点。js文件。完整示例:

require("dotenv").config(); // this line will use environment variables from local .env file of node.js app
import AWS from "aws-sdk";
import { AWSRegions } from "./types/aws";

AWS.config.update({ region: AWSRegions.EU_NORTH_1 });

const { DynamoDB } = AWS;
const dynamodb = new DynamoDB();

相关问题