Подключение к AWS Managed Cassandra Service от Lagom

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

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

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

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

https://www.lagomframework.com/documentation/1.6.x/scala/CassandraServer.html

Суть инструкции состоит в том, чтобы добавить следующие строки в 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 ответ

Нашел решение, просмотрев документацию по AWS MCS Python (документация Java явно ничего не говорит по этому поводу). Оказывается, мне действительно нужно настроить учетные данные для конкретной службы MCS, а затем предоставить их в Lagom'sapplication.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}
  }
}
Другие вопросы по тегам