在 perl 中从 GCE 远程连接到 Google Cloud SQL 时出错

Posted

技术标签:

【中文标题】在 perl 中从 GCE 远程连接到 Google Cloud SQL 时出错【英文标题】:Errors connecting remotely to Google cloud SQL from GCE in perl 【发布时间】:2020-05-20 19:42:32 【问题描述】:

在 Debian Buster DBD:mysql 4.0502 上使用 Perl。

my $dbh = DBI->connect_cached(
  'DBI:mysql:<db>:<host>;mysql_ssl=1;mysql_ssl_ca_file=/etc/ssl/mysql/server-ca.pem;mysql_ssl_client_cert=/etc/ssl/mysql/client-cert.pem;mysql_ssl_client_key=/etc/ssl/mysql/client-key.pem', 
  <username>, <pass>);

尝试通过 SSL 连接到 Google Cloud SQL (Mysql) 实例,但我反复收到错误消息:SSL connection error: Error while reading file.SSL connection error: Error in the certificate.

我已经在目录上运行chown 将所有权转移到 mysql:mysql,尝试了各种所有权配置,甚至移动了目录。

我通过 CLI 使用与脚本中相同的参数进行连接,通过脚本通过来自主机的不安全 SSL 进行连接,但是一旦我限制仅通过 SSL 的连接并使用这些命令,就会出现相同的错误。

更新: 在对此进行了更多研究之后,我认为问题在于 Google 如何为其客户端密钥和证书 (Certificate Validation on Cloud SQL) 签署主机名。这里的建议不适用于 Perl 的 DBD::mysql,因为他们决定在使用 SSL (https://github.com/perl5-dbi/DBD-mysql/issues/110) 时强制执行主机名验证。

我仍在寻找解决这个问题的方法,但我现在正在研究未来的私有 IP 和 VPC。

【问题讨论】:

您是否尝试过按照本文档了解如何使用 SSL 连接到 Cloud MySQL? cloud.google.com/sql/docs/mysql/connect-admin-ip#connect-ssl 我有,并且它列出了 CLI 步骤,这些都成功了。我认为问题在于 Perl mysql 驱动程序。 在这种情况下,我建议的解决方法是使用 Cloud SQL 代理:cloud.google.com/sql/docs/mysql/connect-admin-ip 【参考方案1】:

在撰写本文时,Perl 不是用于与 Google Cloud Platform 交互的受支持语言。即使您成功实施 perl 脚本以连接到 Cloud SQL 实例,由于该解决方案具有临时性质,它也有可能有一天会停止工作。确实实现并积极维护了几个用于多种其他语言的客户端库。如果您想以编程方式与 GCP 服务交互,我强烈建议您切换到这些库之一。此外,如果支持团队或通过 Github 问题给您带来任何不便,您将获得直接帮助。

话虽如此,一个可能的解决方法可能是从 perl 脚本调用 mysql 客户端,就像在 linux shell 中所做的那样。这个想法是将您的 sql 语句写入一个文件并运行 mysql 命令行工具来提供语句文件。这种方法有明显的警告,如果您需要交互式会话,它根本不起作用,但可能会完成从 perl 脚本触发简单任务的工作。我正在分享我制作的一个小sn-p。

-- sql statements file
show databases;
#!/usr/bin/perl
$data = `mysql --user=root --password=XXX  --host=XXX.XXX.XXX.XXX < file.sql`;
print("$data");

请记住,从安全角度来看,以这种方式公开密码是一个糟糕的主意。此方法还需要在 SQL 实例的“连接”选项卡中将 GCE 外部 IP 列入白名单,如 here 所示。


编辑: 可以在here找到支持的连接到Cloud SQL的库列表,几乎所有这些库都需要使用cloud_sql_proxy,它的配置说明如下相同的文档(向上滚动)。

另外,还有一些库可以让您像使用 gcloud 命令行工具一样管理您的实例,可以在 here 找到它。

【讨论】:

能否包含指定 GCP 支持的语言的文档?我在一个完全支持 Perl 的 Debian VM 上使用 GCE。感谢您的建议,但您说得对,以这种方式通过 CLI 进行交互充其量只是一种黑客行为。 @Mrenoe 我已更新答案以包含该信息

以上是关于在 perl 中从 GCE 远程连接到 Google Cloud SQL 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Perl 通过 TCP 和 UDP 连接到远程机器?

需要在 perl 中从远程机器获取 Oracle 和 MySQL 的版本

使用excel连接到远程sql数据库

无法在 Kubernetes 中从工作连接到服务

Perl 无法在 cronjob 中连接到 Oracle DB

如何在 Docker 中从 Docker 连接到 SQL Server 服务?