![](/img/trans.png)
[英]How do I get the username for the IAM user when trying to connect to Google CloudSQL using a unix socket on a cloudrun instance?
[英]Error when connecting CloudSQL MySQL public IP from C# CloudRun
您好,我正在尝试使用公共 IP 将我的 CloudRun 连接到 CloudSQL MySQL。我可以成功连接公共 ip,但我需要为 CloudSQL 允许 all.networks 0.0.0.0。
我现在正在尝试以这种方式连接:
public DapperContext(IConfiguration configuration)
{
// Equivalent connection string:
// "Server=<dbSocketDir>/<INSTANCE_CONNECTION_NAME>;Uid=<DB_USER>;Pwd=<DB_PASS>;Database=<DB_NAME>;Protocol=unix"
//String dbSocketDir = Environment.GetEnvironmentVariable("DB_SOCKET_PATH") ;
//String instanceConnectionName = Environment.GetEnvironmentVariable("INSTANCE_CONNECTION_NAME");
var connectionString = new MySqlConnectionStringBuilder
{
// The Cloud SQL proxy provides encryption between the proxy and instance.
SslMode = MySqlSslMode.None,
// Remember - storing secrets in plain text is potentially unsafe. Consider using
// something like https://cloud.google.com/secret-manager/docs/overview to help keep
// secrets secret.
Server = "/cloudsql/master-xxxxx-12341234:asia-southeast2:mysql-1",
//Server = $"{dbSocketDir}/{instanceConnectionName}",
UserID = "root", // e.g. 'my-db-user
Password = "123456", // e.g. 'my-db-password'
Database = "db-name", // e.g. 'my-database'
ConnectionProtocol = MySqlConnectionProtocol.UnixSocket,
Pooling = true
};
// Specify additional properties here.
_connectionString = connectionString.ConnectionString;
}
public IDbConnection CreateConnection() => new MySqlConnection(_connectionString);
但是我收到“未知套接字错误”和 CloudSQL 日志:“[MY-010914] [服务器] 读取通信数据包时出错”
首先,你的谷歌云不应该有一个公共的 IP(在你的场景中),因为他们可以私下交谈。 现在关于您的请求有一些选择:
1-在 Sql 屏幕检查公共 IP 和 New.network 上,提供名称和最重要的值 0.0.0.0/0注意警告
2-使用 Cloud SQL Auth 代理进行连接
使用 Cloud SQL Auth 代理是连接到 Cloud SQL 实例的推荐方法。 云 SQL Auth 代理:
那说直接去回应。
注意:一定要启用云 Sql 管理员 api,更多信息在这里
1-检查您的云运行配置,在命令行上进行以下替换。
IMAGE 与您正在部署的图像
SERVICE_NAME 为您的 Cloud Run 服务名称
INSTANCE_CONNECTION_NAME 与您的 Cloud SQL 实例的实例连接名称,或以逗号分隔的连接名称列表。
gcloud 运行部署
--image=图像
--add-cloudsql-instances=INSTANCE_CONNECTION_NAME
2-连接到CloudSQL
对于公共 IP 路径,Cloud Run 提供加密并使用Cloud SQL Auth 代理通过 Unix sockets 进行连接。
正确配置后,您可以将您的服务连接到您的云 SQL 实例的 Unix 域套接字,该套接字在环境的文件系统上访问,路径如下:/cloudsql/INSTANCE_CONNECTION_NAME。
INSTANCE_CONNECTION_NAME 使用格式 project:region:instance-id。 您可以在 Google Cloud 控制台中您的实例的概览页面上找到它,也可以通过运行以下命令来找到它:
gcloud sql 个实例描述 [INSTANCE_NAME]
下面显示的代码示例是从位于此处的更复杂示例中摘录的
using MySql.Data.MySqlClient;
using System;
namespace CloudSql
{
public class MySqlUnix
{
public static MySqlConnectionStringBuilder NewMysqlUnixSocketConnectionString()
{
// Equivalent connection string:
// "Server=<INSTANCE_UNIX_SOCKET>;Uid=<DB_USER>;Pwd=<DB_PASS>;Database=<DB_NAME>;Protocol=unix"
var connectionString = new MySqlConnectionStringBuilder()
{
// The Cloud SQL proxy provides encryption between the proxy and instance.
SslMode = MySqlSslMode.None,
// Note: Saving credentials in environment variables is convenient, but not
// secure - consider a more secure solution such as
// Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
// keep secrets safe.
Server = Environment.GetEnvironmentVariable("INSTANCE_UNIX_SOCKET"), // e.g. '/cloudsql/project:region:instance'
UserID = Environment.GetEnvironmentVariable("DB_USER"), // e.g. 'my-db-user
Password = Environment.GetEnvironmentVariable("DB_PASS"), // e.g. 'my-db-password'
Database = Environment.GetEnvironmentVariable("DB_NAME"), // e.g. 'my-database'
ConnectionProtocol = MySqlConnectionProtocol.UnixSocket
};
connectionString.Pooling = true;
// Specify additional properties here.
return connectionString;
}
}
}
经过 2 天的搜索,问题出在版本 MySQL.Data 上,对我有用的版本是 8.0.23,有关更多信息,请访问 https://bugs.mysql.com/bug.php?id=104685
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.