Dynamo Local из Node-aws: все операции не выполняются "Не удается выполнить операции с несуществующей таблицей"

У меня есть локальный динамо-db. Я установил свои таблицы с помощью консоли JavaScript, и они перечислили ОК оттуда.

Я также могу помещать и получать элементы в свои таблицы с консоли JavaScript:

var params = { TableName:"environmentId", Item: { environmentId: {"S":"a4fe1736-98cf-4560-bcf4-cc927730dd1b"} }};
dynamodb.putItem(params, function(err, data) {
    console.log("put : err was " + JSON.stringify(err) + " and data is " + JSON.stringify(data));
});

prints put: err was null and data is {} который я предполагаю, является "успехом", потому что

params = { "Key":{"environmentId":{"S":"a4fe1736-98cf-45e0-bcf4-cc927730dd1b"}},"TableName":"environmentId"}
dynamodb.getItem(params, function(err, data) {
    console.log("get : err was " + JSON.stringify(err) + " and data is " + JSON.stringify(data));
});

prints get: err was null and data is {"Item":{"environmentId":{"S":"a4fe1736-98cf-45e0-bcf4-cc927730dd1b"}}} т.е. он извлекает объект, который я только что положил в таблицу.

Однако, если он запустит узел REPL и введите:

var AWS = require('aws-sdk');
AWS.config.loadFromPath("./config/credentials.js");
endpoint = new AWS.Endpoint("http://localhost:8000");
var dynamoOpts = {apiVersion: '2012-08-10', 'endpoint':endpoint};
var dynamodb = new AWS.DynamoDB(dynamoOpts);
var params = { TableName:"environmentId", Item: { environmentId: {"S":"a4fe1736-98cf-4560-bcf4-cc927730dd1b"} }};
dynamodb.putItem(params, function(err, data) {
    console.log("put : err was " + JSON.stringify(err) + " and data is " + JSON.stringify(data));
}

Я получаю ошибку ресурса, не найденную:

{ "message":"Cannot do operations on a non-existent table",
    "code":"ResourceNotFoundException",
    "time":"2015-04 10T10:01:26.319Z",
    "statusCode":400,
    "retryable":false,
    "retryDelay":0
}

Объект ASW.request, возвращенный из putCommand, имеет правильную конечную точку:

{ protocol: 'http:',
    host: 'localhost:8000',
    port: 8000,
    hostname: 'localhost',
    pathname: '/',
    // etc.

То же самое происходит и с моим приложением Node, но тем же кодом, который подключается к реальным работам динамомастов AWS.

Ответ 1

Проблема заключается в том, что консоль JavaScript и ваше приложение используют разные профили (учетные данные и регион), и поэтому локальная сеть DynamoDB будет создавать для них отдельные файлы базы данных. При использовании флага -sharedDb при запуске локального DynamoDB единый файл базы данных будет использоваться для всех клиентов.

Из документа:

-sharedDb - DynamoDB Local будет использовать один файл базы данных вместо использования отдельных файлов для каждого учетного номера и региона. Если вы укажете -sharedDb, все локальные клиенты DynamoDB будут взаимодействовать с одним и тем же набором таблиц независимо от их региона и конфигурации учетных данных.

Ответ 2

Те, кто использует официальное изображение DynamoDB Local Docker, должны использовать эту строку, чтобы запустить его, чтобы включить sharedDb:

docker run -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -inMemory -sharedDb

Оригинальные ENTRYPOINT и CMD используемые изображением, можно увидеть в docker inspect amazon/dynamodb-local output, и являются:

"Entrypoint": [
    "java"
]
"Cmd": [
    "-jar",
    "DynamoDBLocal.jar",
    "-inMemory"
]

Поэтому нам нужно скопировать их и добавить -sharedDb.