javascript 在Node中本地使用dynamodb时,“无法从任何提供程序加载凭据”

ax6ht2ek  于 2023-04-28  发布在  Java
关注(0)|答案(9)|浏览(90)

我在本地设置了一个dynamodb来测试我的Node应用程序。为了设置它,我只是简单地从here复制了代码,并根据我的需要进行了调整。
这就是代码:

var AWS = require("aws-sdk");

var config = ({
  "apiVersion": "2012-08-10",
  "accessKeyId": "abcde",
  "secretAccessKey": "abcde",
  "region": "us-west-2",
  "endpoint": "http://localhost:8001",
});

var dynamodb = new AWS.DynamoDB(config);

var params = {
    TableName : "Movies",
    KeySchema: [       
        { AttributeName: "year", KeyType: "HASH"},  //Partition key
        { AttributeName: "title", KeyType: "RANGE" }  //Sort key
    ],
    AttributeDefinitions: [       
        { AttributeName: "year", AttributeType: "N" },
        { AttributeName: "title", AttributeType: "S" }
    ],
    ProvisionedThroughput: {       
        ReadCapacityUnits: 10, 
        WriteCapacityUnits: 10
    }
};

dynamodb.createTable(params, function(err, data) {
    if (err) {
        console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
    }
});

这抛出了一个错误,我不知道为什么:

Unable to create table. Error JSON: {
  "message": "Missing credentials in config",
  "code": "CredentialsError",
  "time": "2017-04-10T11:45:26.748Z",
  "retryable": true,
  "originalError": {
    "message": "Could not load credentials from any providers",
    "code": "CredentialsError",
    "time": "2017-04-10T11:45:26.747Z",
    "retryable": true,
    "originalError": {
      "message": "Connection timed out after 1000ms",
      "code": "TimeoutError",
      "time": "2017-04-10T11:45:26.747Z",
      "retryable": true
    }
  }
}

感谢任何帮助!

1zmg4dgp

1zmg4dgp1#

我也犯了同样的错误。在我的例子中,问题是它在本地从命令行运行时工作得很好,但在docker中却不行。
基本上,如何在aws-sdk(版本2)和@aws-sdk/s3-client(版本3)之间向AWS npm S3客户端传递凭据已经发生了变化。在v2的情况下,结构是这样的:

const credentials = {
    region: configuration.aws.region,
    accessKeyId: configuration.aws.accessKeyId,
    secretAccessKey: configuration.aws.secretAccessKey
};

在v3中:

const credentials = {
  region: configuration.aws.region,
  credentials: {
    accessKeyId: configuration.aws.accessKeyId,
    secretAccessKey: configuration.aws.secretAccessKey
  }
};

它在本地工作得很好,因为我已经通过CLI向AWS进行了身份验证,它忽略了我传递给v3客户端的v2样式凭据。
结论:使用 typescript 的一切男孩和女孩!

fslejnso

fslejnso2#

更改为以下代码,拥有虚拟accessKeyIdsecretAccessKey,然后运行它

var AWS = require("aws-sdk");

AWS.config.update({
  region: 'us-west-1',
  accessKeyId: 'accessKeyId',
  secretAccessKey: 'secretAccessKey',
  endpoint: new AWS.Endpoint('http://localhost:8000'),
});

var dynamodb = new AWS.DynamoDB();

var params = {
    TableName : "Movies",
    KeySchema: [
        { AttributeName: "year", KeyType: "HASH"},  //Partition key
        { AttributeName: "title", KeyType: "RANGE" }  //Sort key
    ],
    AttributeDefinitions: [
        { AttributeName: "year", AttributeType: "N" },
        { AttributeName: "title", AttributeType: "S" }
    ],
    ProvisionedThroughput: {
        ReadCapacityUnits: 10,
        WriteCapacityUnits: 10
    }
};

dynamodb.createTable(params, function(err, data) {
    if (err) {
        console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
    }
});
mzmfm0qo

mzmfm0qo3#

根据错误消息,您的凭据未在config中设置。
我给出了设置凭据然后使用服务的观点。

const aws = require('aws-sdk');
 aws.config = new aws.Config();
 aws.config.accessKeyId = "xxxxxxxxxxxxxx";
 aws.config.secretAccessKey = "xxxxxxxxxx";
 aws.config.region = "region";

现在使用Dynamodb

var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

更新

也可以使用文件设置凭据

aws.config.loadFromPath('./AwsConfig.json');

希望能成功!!

wfveoks0

wfveoks04#

显然我发现了问题所在。使用json文件设置凭据仍然会导致错误。只使用没有标志-inMemory的config对象也会导致错误。在脚本中硬编码凭证并在本地启动dynamodb时使用-inMemory标志的组合似乎可以解决这个问题。我真的不明白为什么。

xsuvu9jc

xsuvu9jc5#

这对我很有效

const sqsClient = new SQSClient({ region: REGION ,
   credentials: {
    accessKeyId: 'XXXXXXXXXXXXXXX',
    secretAccessKey: 'XXXXXXXXXXXXXXXXXXXXXX'
  }
});
thigvfpy

thigvfpy6#

您可能混淆了Web服务DynamoDB和本地版本。你可以在AWS documentation中找到两者的主要区别。
如果你想使用本地版本的DynamoDB,你会找到最新的信息来安装和运行它在AWS documentation
完成后,请确保运行本地DynamoDB示例:

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb -inMemory

你的错误可能会被避免。

brtdzjyr

brtdzjyr7#

DynamoDB local在端口8000上使用虚拟凭据运行良好。

注:

端口号为8000。我使用下面的虚拟凭据。

var creds = new AWS.Credentials('akid', 'secret', 'session');

AWS.config.update({
    region: "us-west-2",
    endpoint: "http://localhost:8000",
    credentials: creds
});

启动命令:-

java -Djava.library.path=DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

操作系统:-

windows

nfs0ujit

nfs0ujit8#

在node.js中,通过设置这些值,可以轻松地从.env值加载
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN(可选)
https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-node-credentials-environment.html

vof42yt1

vof42yt19#

这个问题的另一个选择/解决方案是在用户的家中创建一个credentials文件。
类似于:
~/.aws/credentials
而内容将是:

[default]
aws_access_key_id = *************************
aws_secret_access_key = *********************************************
aws_session_token =**************************************************

相关问题