Dynamo DB Local - 拒绝连接

时间:2015-11-19 10:36:44

标签: amazon-dynamodb aws-sdk

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

开始

现在,当我尝试通过AWS SDK访问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)

4 个答案:

答案 0 :(得分:10)

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

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

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

验证它是否正在http://localhost:8000/shell/

运行

答案 1 :(得分:2)

只是为同一个问题而战 - 在端点上添加一个斜线url为我解决了这个问题。

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

答案 2 :(得分:1)

如果你正在使用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

从Code do

访问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 :(得分:0)

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

我找到了2个选项:

选项1

您必须使用计算机的IP http://192.168.xx.xxx:8000

,而不是调用 http:// localhost:8080

选项2

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

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