web-dev-qa-db-ja.com

Node-awsからのDynamo Local:すべての操作が失敗する「存在しないテーブルで操作を実行できません」

ローカルのdynamo-dbを実行しています。 JavaScriptコンソールを使用してテーブルを設定しましたが、そこからOKが表示されます。

また、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));
});

プリント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));
});

プリント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
}

PutCommandから返されたASW.requestオブジェクトには正しいエンドポイントがあります。

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

私のNodeアプリからも同じことが起こりますが、実際のAWSがホストするダイナモに接続する同じコードは機能します。

22
Rog

問題は、JavaScriptコンソールとアプリが異なるプロファイル(認証情報とリージョン)を使用しているため、DynamoDBローカルがそれらに対して個別のデータベースファイルを作成することです。ローカルDynamoDBの起動時に-sharedDbフラグを使用することにより、単一のデータベースファイルがすべてのクライアントで共有されます。

doc から:

-sharedDb — DynamoDBローカルは、資格情報とリージョンごとに個別のファイルを使用するのではなく、単一のデータベースファイルを使用します。 -sharedDbを指定すると、すべてのDynamoDBローカルクライアントは、リージョンと認証情報の設定に関係なく、同じテーブルセットと対話します。

43
ootterskog

公式DynamoDBローカルDockerイメージ を使用している場合は、この行を使用してsharedDbを有効にします。

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

画像で使用されている元の ENTRYPOINT および CMD は、docker inspect Amazon/dynamodb-local出力で確認できます。

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

したがって、基本的にはそれらをコピーして-sharedDbを追加する必要があります。

20
madhead