【问题标题】:Dynamo DB Local - Connection RefusedDynamodb 本地 - 连接被拒绝
【发布时间】:2021-12-07 02:08:43
【问题描述】:

我正在尝试使用 AWS Java SDK 连接到本地 Dynamo DB。所以我安装了 Local Dynamo DB 并启动了 javascript shell。一切正常,shell 从通常的地址 http://localhost:8000/shell/

开始

现在,当我尝试通过 AWS 开发工具包访问 Dynamo 数据库实例时,事情开始出现问题。

这是我的代码:

public class MyDynamoDB {
    private AmazonDynamoDBClient client;

    public MyDynamoDB() {
        client = new AmazonDynamoDBClient();
        client.setEndpoint("http://localhost:8000");
    }

    public void saveAndLoad() {
        DynamoDBMapperConfig config = new DynamoDBMapperConfig(new TableNameOverride("xyz"));
        DynamoDBMapper mapper = new DynamoDBMapper(client, config);
        Data data = new Data();
        ...
        mapper.save(data);


        //check if persisted
        Data d = mapper.load(Data.class, "Key");
        if (d != null) {
            System.out.println(" Found data: " + d.getStuff());
        } else {
            System.out.println("Data not found");
        }
    }
}

在运行它时,我得到以下堆栈跟踪

Nov 19, 2015 4:00:47 PM com.amazonaws.http.AmazonHttpClient executeHelper
INFO: Unable to execute HTTP request: Connection refused: connect
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:117)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)

【问题讨论】:

  • 您是如何启动 DynamoDBLocal 的?你能提供一个MCVE吗?
  • 我在通过 Maven 启动 DynamoDb 时遇到了同样的问题。向端点添加 / 没有帮助。你找到解决办法了吗?
  • @mark 我没有时间继续做同样的事情。我看到 Dani 发布了一个答案,如果可行,请告诉我...我会在几天后重试,如果可行,我会发布一个答案。
  • @AgentX 我尝试了 Dani 的建议,但遗憾的是它没有奏效。如果你确实得到了一些东西,我会很感兴趣的。
  • @mark 我知道已经晚了,但你能试试我的答案吗?

标签: amazon-dynamodb aws-sdk


【解决方案1】:

您需要在命令提示符下触发 DynamoDB..

转到安装 Dynamodb cli 的位置并运行以下命令

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

通过http://localhost:8000/shell/验证它是否正在运行

【讨论】:

    【解决方案2】:

    如果您使用 SAM-LOCAL 或使用 eclipse 开发 aws lambda 函数,此答案可能很有用。

    简答为环回分配一个 IP 别名,以使用与 127.0.0.1 不同的地址进行联系,并将端点更新为该地址

    从命令行运行

    ifconfig lo0 alias 172.16.123.1

    并且从 lambda 代码而不是访问 http://localhost:8000/ 使用 http://172.16.123.1:8000/

    请参阅此link 以获得解释。

    长答案

    在 lambda 函数 pom 中

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-dynamodb</artifactId>
        <version>1.11.313</version>
    </dependency>
    

    使用

    启动 dynomodb
    java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
    

    做IP别名

    ifconfig lo0 alias 172.16.123.1
    

    为了从代码访问 DynmoDb 做

    DynamoDB dynamoDb = new DynamoDB(AmazonDynamoDBClientBuilder.standard().withCredentials(new EnvironmentVariableCredentialsProvider()).withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://172.16.123.1:8000/", "local")).build());
    

    在你完成 lambda 函数的测试后做

    ifconfig lo0 -alias 172.16.123.1
    

    【讨论】:

      【解决方案3】:

      刚刚解决了同样的问题 - 在端点 url 上附加一个斜杠为我解决了这个问题。

      client.setEndpoint( "http://localhost:8000/");
      

      【讨论】:

        【解决方案4】:

        如果您使用的是 SAM-LOCAL,则无法直接访问 localhost:8080。

        我找到了 2 个选项:

        选项 1

        而不是调用 http://localhost:8080 ,你必须使用你机器的 IP http://192.168.xx.xxx:8000

        选项 2

        在 DynamoDB Docker 容器上创建网络。你可以在这里找到不同的方法:connecting AWS SAM Local with dynamodb in docker

        我最喜欢的:https://stackoverflow.com/a/57309422/13035616

        【讨论】:

          【解决方案5】:

          我最近遇到了这个问题。我的解决方案是将 dynamodb 端点更改为:http://docker.for.mac.localhost:8000

          new DocumentClient({
            endpoint: "http://docker.for.mac.localhost:8000",
            sslEnabled: false,
            region: 'eu-central-1', // change to your region
            accessKeyId: 'keyid123',
            secretAccessKey: 'secret123',
          })
          

          【讨论】:

            猜你喜欢
            • 2015-07-27
            • 2015-07-30
            • 1970-01-01
            • 1970-01-01
            • 2017-08-08
            • 2020-03-14
            • 1970-01-01
            • 2023-03-21
            • 1970-01-01
            相关资源
            最近更新 更多