Подключение к 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}
}
}