【问题标题】:Connecting to AWS Managed Cassandra Service from Lagom从 Lagom 连接到 AWS Managed Cassandra 服务
【发布时间】:2020-06-06 07:19:53
【问题描述】:

我在从 Lagom 环境连接到 AWS Managed Cassandra Service 时遇到问题。这是我尝试过的方法,结果如何。

(1) Amazon 提供了从 Java 代码连接到 AWS MCS 的说明:

https://docs.aws.amazon.com/fr_fr/mcs/latest/devguide/cqlsh.html#using_java_driver

说明的要点是您需要安装证书,然后将其传递给 JVM,如下所示:

-Djavax.net.ssl.trustStore=path_to_file/cassandra_truststore.jks 
-Djavax.net.ssl.trustStorePassword=amazon

然后,您可以使用您选择的任何 Cassandra Java 驱动程序。而我的选择是 Lagom 框架提供的 DataStax 驱动程序。

我通过将以下内容添加到 build.sbt 来做到这一点:

javaOptions ++= Seq(
  "-Djavax.net.ssl.trustStore=project/cassandra_truststore.jks",
  "-Djavax.net.ssl.trustStorePassword=amazon"
)

// Must enable JVM forking to use javaOptions with runAll.
fork := true

(2) 在将我的 Lagom 应用程序部署到 AWS 之前,我想在开发模式下使用它,但将它连接到 AWS MCS 而不是嵌入式 Cassandra 服务器。 Lagom 提供了在开发模式下执行此操作的说明:

https://www.lagomframework.com/documentation/1.6.x/scala/CassandraServer.html#Connecting-to-a-locally-running-Cassandra-instance

说明的要点是将以下几行添加到build.sbt:

lagomCassandraEnabled in ThisBuild := false
lagomUnmanagedServices in ThisBuild := Map("cas_native" -> "tcp://localhost:9042")

本示例中的 URI 假定 Cassandra 服务器在 localhost:9042 上运行。就我而言,我将其替换为 cassandra.us-east-1.amazonaws.com:9142。

(3) 然而,当我运行 sbt runAll 时,我在尝试访问 AWS MCS 时遇到超时:

Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: cassandra.us-east-1.amazonaws.com/3.83.168.143:9142 (com.datastax.driver.core.exceptions.OperationTimedOutException: [cassandra.us-east-1.amazonaws.com/3.83.168.143:9142] Operation timed out))

(4) 我通过完全绕过 Lagom 并且只编写了一段非常简单的代码来隔离问题,如下所示:

  System.setProperty("javax.net.ssl.trustStore", "redacted_absolute_file_path/cassandra_truststore.jks")
  System.setProperty("javax.net.ssl.trustStorePassword", "amazon")

  val cluster = Cluster.builder.addContactPoint("cassandra.us-east-1.amazonaws.com").withPort(9142).build()
  val session = cluster.connect()
  session.close()
  cluster.close()

这很简单。但是会发生同样的超时。我做错了什么?

【问题讨论】:

  • 您的 AWS MCS 的 IAM 策略是否已更新以接受来自 Lagom 环境的通信?如果是这样,您允许通信的端口是什么?查看他们的文档,似乎他们使用自定义端口 4000,而不是 Cassandra 的默认端口。 * 我不是 Lagom 用户,答案基于他们的文档
  • 谢谢。是的,这可能与权限有关。但是端口是 9142,而不是 4000。无论如何,我发现了这个:docs.aws.amazon.com/IAM/latest/UserGuide/…。不过,它并没有说明如何使用这些特定于服务的凭据。

标签: amazon-web-services cassandra lagom amazon-keyspaces


【解决方案1】:

通过查看 AWS MCS Python 文档找到了解决方案(Java 文档对此事明显保持沉默)。结果我确实需要配置 MCS 服务特定的凭据,然后在 Lagom 的 application.conf 文件中提供它们,如下所示:

cassandra.default {
  port = 9142

  ssl.truststore {
    path = "path/cassandra_truststore.jks"
    password = "amazon"
  }

  authentication {
    username = "service-specific username"
    password = "service-specific password"
  }
}

cassandra-journal {
  port = ${cassandra.default.port}

  ssl.truststore {
    path = ${cassandra.default.ssl.truststore.path}
    password = ${cassandra.default.ssl.truststore.password}
  }

  authentication {
    username = ${cassandra.default.authentication.username}
    password = ${cassandra.default.authentication.password}
  }
}

cassandra-snapshot-store {
  port = ${cassandra.default.port}

  ssl.truststore {
    path = ${cassandra.default.ssl.truststore.path}
    password = ${cassandra.default.ssl.truststore.password}
  }

  authentication {
    username = ${cassandra.default.authentication.username}
    password = ${cassandra.default.authentication.password}
  }
}

lagom.persistence.read-side.cassandra {
  port = ${cassandra.default.port}

  ssl.truststore {
    path = ${cassandra.default.ssl.truststore.path}
    password = ${cassandra.default.ssl.truststore.password}
  }

  authentication {
    username = ${cassandra.default.authentication.username}
    password = ${cassandra.default.authentication.password}
  }
}

【讨论】:

  • 感谢分享!你帮我省了好几个小时的头痛。
猜你喜欢
  • 2020-08-06
  • 2020-04-23
  • 1970-01-01
  • 2018-09-22
  • 2021-11-14
  • 2021-09-08
  • 1970-01-01
  • 2012-07-24
  • 2020-05-31
相关资源
最近更新 更多