4

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

AWS_ACCESS_KEY_ID=XXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX

env我可以通过运行命令以及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文件。但是从阅读中,特别是这里似乎 sdk 应该自动检测我的环境变量并且不需要有凭据文件。

我的问题是我怎样才能aws-sdk在我的环境变量中使用凭据而不会因为没有凭据文件而出错?

4

6 回答 6

3

我相信如果您访问需要区域(最多)的功能,您会遇到此问题。

您需要导出 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_REGION。您缺少 AWS_REGION。

注意:如果这不起作用,您可以提供 AWS 开发工具包版本的堆栈跟踪。

于 2020-02-03T06:50:49.090 回答
0

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

于 2019-02-22T20:05:41.353 回答
0

潜在原因:确保未设置 AWS_SDK_LOAD_CONFIG

在之前的项目中,我的环境中有 AWS_SDK_LOAD_CONFIG=1。这一直迫使 AWS 开发工具包查找凭证文件。我从我的 bash_profile 中删除了它,SDK 终于能够将 env 变量用于我的密钥/秘密。

于 2021-03-26T18:26:49.863 回答
0

我有同样的问题。这让我很头疼,因为我在 AWS Fargate 中运行了它,并且在那里调试并不容易。

该错误表示 Javascript 开发工具包找不到 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. (很难看出区别,对吧?)

所以可能会仔细检查你的环境变量的名称(或者如果你使用配置文件,配置文件中的所有行)

于 2020-11-17T13:05:31.227 回答
0

目前 aws 提供了自己的方法来从外部文件动态加载 aws 凭证,无需使用任何像“dotenv”这样的库。只需在您的项目文件夹中创建creds.json文件,在此文件中您可以添加任何 aws 凭据,例如,fyi 区域是硬编码的

信用.json

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

使用以下代码片段将此文件加载到您的index.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只需在正确的路径中创建预期的空文件

于 2021-03-18T14:40:59.567 回答
0

AWS-SDK 自动获取 .aws/credential 文件的凭证。

  • 在 Windows 中,它位于 C:\Users\username\.aws\credentials 内
  • 在 Linux 中,它很可能位于 ~/.aws/credentials 位置。另外,您应该将其注释如下,

[default] AWS_ACCESS_KEY_ID=XXXXXXXXXXXXX AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX

于 2018-07-11T06:57:31.320 回答