AWS-SDK NodeJS从环境变量中读取凭证

时间:2018-07-09 21:07:26

标签: node.js amazon-web-services aws-sdk aws-sdk-js

我正在运行一个使用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文件。但是,通过阅读,特别是here,似乎sdk应该可以自动检测到我的环境变量,而无需具有凭据文件。

我的问题是如何获得aws-sdk在我的环境变量中使用凭据,而又不会因为没有凭据文件而出错?

6 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我有同样的问题。这让我非常头痛,因为我已经在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。 (很难看出区别,对吗?)

因此,可能需要仔细检查环境变量的名称(或者,如果使用配置文件,则查看配置文件中的所有行)

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

潜在原因:确保未设置 AWS_SDK_LOAD_CONFIG

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