我正在运行一个使用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
文件。但是,从阅读来看,特别是在这里,似乎 sdk 应该自动检测我的环境变量,而不需要凭据文件。
我的问题是,如何让aws-sdk
在我的环境变量中使用凭据,而不会因没有凭据文件而出错?
我相信如果您访问需要区域(大多数(的功能,您会遇到此问题。
您需要导出AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_REGION。你错过了AWS_REGION。
注意:如果这不起作用,您可以提供 AWS 开发工具包版本的堆栈跟踪。
潜在原因:确保未设置AWS_SDK_LOAD_CONFIG
在以前的项目中,我在我的环境中闲逛了 AWS_SDK_LOAD_CONFIG=1。这一直迫使 AWS 开发工具包查找凭证文件。我从我的bash_profile中删除了它,SDK 终于能够将 env 变量用于我的密钥/机密。
我遇到了同样的问题。这让我头疼,因为我在 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
。(很难看出区别,对吧?
所以可能会仔细检查环境变量的名称(或者如果你使用配置文件,则仔细检查配置文件中的所有行(
AWS-SDK 会自动获取 .aws/credential 文件的凭证。
- 在Windows中,它位于C:\Users\username\.aws\credentials中
- 在 Linux 中,它很可能位于 ~/.aws/credentials 位置。 另外,您应该按如下方式对其进行注释,
[default]
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX
您是否在 shell 配置文件中导出了 env 变量?如果您能够在节点代码中打印process.env.AWS_ACCESS_KEY_ID
,那么您的节点就可以读取 env 文件。aws 开发工具包获取信条的优先级顺序是首先是 env 变量,然后是凭证文件。因此,您的 env 变量很可能没有正确导出(或对于您的节点代码来说是可读的(。请注意,您必须重新启动终端控制台才能使 env var 更改生效。希望这有帮助。
目前 AWS提供了自己的方法来从外部文件动态加载 AWS 凭证,无需使用任何像 'dotenv' 这样的库。 在您的项目文件夹中创建creds.json文件,在此文件中您可以添加任何 AWS 凭证,例如,仅供参考区域是硬编码的
creds.json
{
"region": "us-east-1", // region also you can change
"accessKeyId": "YOUR_ACCESS_KEY",
"secretAccessKey": "YOUR_SECRET_KEY"
}
使用以下代码 snipet 将此文件加载到索引.js或应用中.js
索引.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/凭据,只需在正确的路径中创建预期的空文件
在项目的根文件夹中创建 .env 文件的一种可能方法:
AWS_ACCESS_KEY_ID=aws_access_key
AWS_SECRET_ACCESS_KEY=aws_secret_key
然后只需将这行代码require("dotenv").config();
添加到 node.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();