我正在运行一个使用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
在我的环境变量中使用凭据,而又不会因为没有凭据文件而出错?
答案 0 :(得分:1)
我相信,如果您访问需要一个区域(最多)的功能,就会遇到此问题。
您需要导出AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY和AWS_REGION。您缺少AWS_REGION。
注意:如果不起作用,您可以提供带有AWS开发工具包版本的堆栈跟踪。
答案 1 :(得分:0)
AWS-SDK自动获取.aws / credential文件的凭证。
[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.js 或 app.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=1。这不断迫使 AWS 开发工具包寻找凭证文件。我从我的 bash_profile 中删除了它,SDK 终于能够将 env 变量用于我的密钥/秘密。