首页 > 解决方案 > 如何使用 laravel 连接到 Amazon Keyspaces (Cassandra)?

问题描述

我正在尝试连接到托管在亚马逊密钥空间的 Cassandra,并且需要在每个连接上包含 SSL 证书。

我已经安装了驱动程序并且连接成功,但是身份验证失败,因为我缺少证书。

我尝试了以下包装器,但这些包装器都不包含配置 SSL 证书的参数:

Sonvq/laravel-cassandra Fuitad/laravel-cassandra cubettech/lacassa

在我的 config/database.php 文件中,我配置了以下内容,我猜证书在“选项”参数中,但它不起作用:

   'cassandra' => [
        'driver' => 'cassandra',
        'host' => env('CASSANDRA_DB_HOST', ''),
        'port' => env('CASSANDRA_DB_PORT', 9142),
        'keyspace' => env('CASSANDRA_DB_DATABASE', ''),
        'username' => env('CASSANDRA_DB_USERNAME', ''),
        'password' => env('CASSANDRA_DB_PASSWORD', ''),
        'options'   => array(
        Cassandra::VERIFY_PEER_CERT    => '/home/user/AmazonRootCA1.pem',
       ),
     ]

通过命令行使用“cqlsh”效果很好,因为在该命令中很容易配置证书路径,但在 laravel 上我无法找到如何设置该路径。

任何帮助都会很棒!谢谢!

标签: phplaravelcassandra

解决方案


自从过去两天试图将我的 laravel 应用程序连接到亚马逊键空间以来,我一直在努力。

最后,对 cubettech/lacassa 进行了一些更改,我让它工作了

在 datastax 阅读文档后,我找到了加载 amazon PEM 证书的方法,终于可以连接了。

如果对 connection.php 进行以下更改,那就太好了

protected function createConnection(array $config)
    {
       $ssl = Cassandra::ssl()
               ->withVerifyFlags(Cassandra::VERIFY_PEER_CERT)
               ->withTrustedCerts($config['cert_path'])
               ->build();     
        
        $cluster   = Cassandra::cluster()
        ->withContactPoints($config['host'])
        ->withPort((int) $config['port'])
        ->withCredentials($config['username'],$config['password'])
        ->withSSL($ssl)
        ->withDefaultConsistency(Cassandra::CONSISTENCY_LOCAL_QUORUM)
        ->build();

        $keyspace  = $config['keyspace'];
        $connection   = $cluster->connect($keyspace);
        return $connection;

    }

还需要设置证书路径变量。

出于某种原因,我发现即使配置了环境变量,也总是与 localhost 建立连接,这就是我使用 $config 数组加载环境变量的原因。

查询返回一个 Cassandra/Rows Object ,我必须将它们转换为字符串或循环读取它们,但这不是问题。


推荐阅读