47

我有一个本地 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 托管发电机的相同代码可以工作。

4

3 回答 3

70

问题是 JavaScript 控制台和您的应用程序使用不同的配置文件(凭据和区域),因此 DynamoDB local 将为它们创建单独的数据库文件。通过在启动本地 DynamoDB 时使用 -sharedDb 标志,将为所有客户端共享单个数据库文件。

文档

-sharedDb — DynamoDB Local 将使用单个数据库文件,而不是为每个凭证和区域使用单独的文件。如果您指定 -sharedDb,则所有 DynamoDB Local 客户端都将与同一组表进行交互,而不管它们的区域和凭证配置如何。

于 2015-04-10T11:13:44.610 回答
43

那些使用官方 DynamoDB Local Docker 镜像的人应该使用这一行来启动它以启用sharedDb

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

图像的原始ENTRYPOINTCMD使用可以在docker inspect amazon/dynamodb-local输出中看到,它们是:

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

所以我们基本上需要复制它们并添加-sharedDb.

于 2018-12-06T19:35:10.297 回答
0

如果您使用的是 CircleCI,您的 executor 应该是这样的:

# using service containers on CircleCI
# https://circleci.com/docs/2.0/databases/
executors:
  with-dynamodb:
    docker:
      # image used to install source code,
      # run our server and run Cypress tests
      - image: cypress/base:14.17.3

      # image used to run Dynamodb in a separate container
      - image: amazon/dynamodb-local:1.17.0
        # HERE IS THE IMPORTANT PART
        command: ["-jar", "DynamoDBLocal.jar", "-inMemory", "-sharedDb"]

command选项允许您覆盖CMDDockerfile 中的默认值,@madhead 指出。

于 2021-11-06T01:18:35.047 回答