Подключение к AWS Управляемому сервису Cassandra от Lagom - PullRequest
0 голосов
/ 21 февраля 2020

У меня проблемы с подключением к AWS Управляемой службе Cassandra из моей среды Lagom. Вот что я попробовал и с какими результатами.

(1) Amazon предоставляет инструкции по подключению к AWS MCS с Java кодом:

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 для твой выбор. И я выбрал драйверы DataStax, предоставляемые с каркасом Lagom.

Это я сделал, добавив в 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, я хочу работать с ним в режиме Dev, но подключив его к AWS MCS вместо встроенного сервера Cassandra. Lagom предоставляет инструкции для этого в режиме Dev:

https://www.lagomframework.com/documentation/1.6.x/scala/CassandraServer.html#Connecting -to-a-a-local-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()

Это так просто, как только может. Но происходит то же время. Что я делаю не так?

1 Ответ

0 голосов
/ 25 февраля 2020

Нашел решение, посмотрев документацию AWS MCS Python (документация Java явно молчит по этому вопросу). Оказывается, мне нужно настроить учетные данные c для службы MCS и затем предоставить их в файле application.conf Lagom следующим образом:

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}
  }
}
...