我正在关注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
}
是否有人知道此异常的可能原因?
答案 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 代码匹配,问题得到解决。