DynamoDB:ResourceNotFoundException创建表(本地)时

时间:2018-01-24 18:47:31

标签: node.js amazon-dynamodb

我正在关注AWS Node.js教程,但我无法获得提供的代码。

具体来说,我正在尝试在DynamoDB的本地实例上创建“Movies”表,并使用一些提供的示例数据加载它。但是,当我尝试创建表时,我收到”Cannot do operations on a non-existent table”,这看起来有点奇怪。

对于我的设置,我在一个控制台窗口中运行DynamoDB。我正在使用和输出的命令如下:

COMPUTERNAME:node-dyna-demo myUserName$ java -Djava.library.path=./dynamodb_local_latest/DynamoDBLocal_lib -jar ./dynamodb_local_latest/DynamoDBLocal.jar -sharedDb
Initializing DynamoDB Local with the following configuration:
Port:   8000
InMemory:   false
DbPath: null
SharedDb:   true
shouldDelayTransientStatuses:   false
CorsParams: *

在一个单独的控制台中,我正在执行以下代码:

AWS.config.update({
  credentials: {
    accessKeyId: ‘testAccessId’,
    secretAccessKey: ‘testAccessKey’
  },
  region: 'us-west-2',
  endpoint: 'http://localhost:8000'
})

const dynamodb = new AWS.DynamoDB()
const docClient = new AWS.DynamoDB.DocumentClient()

const dbParams = {
  TableName : "Movies",
  KeySchema: [ … ],
  AttributeDefinitions: [ … ],
  ProvisionedThroughput: { … }
}

dynamodb.createTable(dbParams, 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": "Cannot do operations on a non-existent table",
  "code": "ResourceNotFoundException",
  "time": "2018-01-24T15:56:13.229Z",
  "requestId": "c8744331-dd19-4232-bab1-87d03027e7fc",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 9.419252980728942
}

是否有人知道此异常的可能原因?

2 个答案:

答案 0 :(得分:1)

当没有 -sharedDb 标志启动Dynamodb local时,可能会发生此类问题。

在您的情况下,本地dynamodb按预期启动,

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

尝试以下解决方案,

解决方案1:删除AWS config中的凭据信息

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

原因:如果在没有 -sharedDb 标志的情况下运行dynamodb local,它将创建与该凭据相关的新数据库。

解决方案2:使用dynamodb shell(http://localhost:8000/shell/#)创建表,并使用以下命令验证是否已创建表

aws dynamodb list-tables --endpoint-url http://localhost:8000

答案 1 :(得分:0)

第一个答案给了我解决方案的提示。我将 Java 与 maven 结合使用。希望我的回答可以帮助其他人。 AWS 区域可能存在冲突。 Java 代码指向 eu-west-1。

amazonDynamoDB = AmazonDynamoDBClientBuilder
               .standard()
               .withEndpointConfiguration(
                 new AwsClientBuilder
                   .EndpointConfiguration("http://localhost:" + 
                       LocalDbCreationRule.port, "eu-west-1"))
               .build();

但是我的 AWS 配置在我本地机器上的主文件夹中

~/.aws/config

显示如下:

[default]
region = eu-central-1

我在本地配置中将区域更改为 eu-west-1,与 Java 代码匹配,问题得到解决。