繁体   English   中英

从 C# CloudRun 连接 CloudSQL MySQL public IP 时出错

[英]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 代理:

  • 适用于公共和私有 IP 端点
  • 使用用户或服务帐户的凭据验证连接
  • 将连接包装在为 Cloud SQL 实例授权的 SSL/TLS 层中

那说直接去回应。

注意:一定要启用云 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM