我正在运行使用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
在我的环境变量中使用凭据,而不会因为没有凭据文件而出错?
7条答案
按热度按时间nhaq1z211#
我相信你得到这个问题,如果你访问一个功能,需要一个地区(这是最)。
您需要导出AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_REGION。您缺少AWS_REGION。
注意:如果这不起作用,您可以使用AWS SDK版本提供堆栈跟踪。
2w3rbyxf2#
潜在原因:确保未设置AWS_SDK_LOAD_CONFIG
在以前的一个项目中,我的环境中有AWS_SDK_LOAD_CONFIG=1挂起。这一直迫使AWS SDK寻找凭据文件。我从我的bash_profile中删除了这个,SDK终于可以使用env变量作为我的key/secret。
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
。很难看出区别,对吧?)因此,可能要仔细检查环境变量的名称(如果使用配置文件,则检查配置文件中的所有行)
jq6vz3qz4#
AWS-SDK自动获取。aws/credentials文件的凭据。
[default] AWS_ACCESS_KEY_ID=XXXXXXXXXXXXX AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX
3ks5zfa05#
你是否在shell配置文件中导出了env变量?如果你能够在你的节点代码中打印
process.env.AWS_ACCESS_KEY_ID
,那么你的节点就能够读取env文件。aws sdk获取creds的precedence顺序是首先是env变量,然后是凭证文件。因此,很可能您的env变量没有正确导出(或者对于您的节点代码来说是可读的)。请注意,您必须重新启动终端控制台才能使env var更改生效。希望这能帮上忙。irtuqstp6#
目前AWS提供了自己的方法来从外部文件动态加载AWS凭证,不需要使用任何库,如'dotenv'。只需要创建creds。json文件在你的项目文件夹中,在这个文件中你可以添加任何aws凭证,比如,fyi区域是硬编码的
creds.json
在你的索引中加载这个文件。js或app。js使用以下代码片段
index.js
仅供参考我的项目文件夹就像
就像魅力一样。.如果你面对文件找不到错误**/.aws/credentials**只需在正确路径中创建预期的空文件
3yhwsihp7#
一种可能的方式来创造。在项目的根文件夹中的env文件:
然后简单地将这行代码
require("dotenv").config();
添加到节点。js文件。完整示例: