【问题标题】:What is the correct Cloud SQL connection string syntax for dotnetcore app with Cloud Run?带有 Cloud Run 的 dotnetcore 应用程序的正确 Cloud SQL 连接字符串语法是什么?
【发布时间】:2022-01-27 08:07:14
【问题描述】:

我想使用 Google Cloud SQL 数据库在 Cloud Run 上设置一个 .NET Core Web 应用程序。我轻松地在 Cloud SQL 上部署了具有公共 IP 的数据库,并在 Cloud Run 上使用 Docker 容器部署了我的 Web 应用程序。我可以毫无困难地使用 SQL Server Management Studio 访问数据库,并且 Web 应用程序已按预期启动并运行。唯一缺少的部分是它们之间允许它们连接的链接。

在我的网络应用程序中,我得到了该格式的连接字符串:

Data Source=***;Initial Catalog=***;User ID=***;Password=***;Pooling=true;Trusted_Connection=false;Connection Timeout=60;Integrated Security=false;Persist Security Info={0};Encrypt=true;TrustServerCertificate=true;MultipleActiveResultSets=true;

从 Cloud SQL 获得 公共 IP连接名称 后,应该如何准确地 成为连接字符串和/或下一步?

此外,在 Cloud Run Service 下的连接选项卡中,我添加了 Cloud SQL 连接。这应该为我配置 Cloud SQL 代理。

【问题讨论】:

标签: api .net-core connection-string google-cloud-sql google-cloud-run


【解决方案1】:

要从 Cloud Run 连接到 Cloud SQL,您必须关注 this guide


您已经在 Connections 选项卡中进行了一些配置,如Configuring Cloud Run 部分所述。您可以查看Public IP 的指南,因为您以这种方式配置了您的实例,以确保遵循所有步骤。

简单来说,步骤是:

  • Cloud SQL Client(首选)
  • Cloud SQL Admin

如果授权服务帐号与 Cloud SQL 实例属于不同的项目,则需要为这两个项目添加 Cloud SQL Admin API 和 IAM 权限。

与任何配置更改一样,为 Cloud SQL 连接设置新配置会导致创建新的 Cloud Run 修订版。后续修订也将自动获取此 Cloud SQL 连接,除非您进行显式更新以更改它。

  1. 转到 Cloud Run
  2. 配置服务:
    • 如果您要向现有服务添加 Cloud SQL 连接:
      • 点击服务名称。
      • 单击“连接”选项卡。
      • 点击部署。
  3. 启用连接到 Cloud SQL 实例:
    • 点击高级设置。
    • 单击“连接”选项卡。
    • 如果您要在项目中添加与 Cloud SQL 实例的连接,请从下拉菜单中选择所需的 Cloud SQL 实例。
    • 如果您要删除连接,请将光标悬停在连接右侧以显示“废纸篓”图标,然后单击它。
  4. 单击创建或部署。

仔细检查上述步骤后,您可以继续阅读Connecting to Cloud SQL 部分。您可以按照Public IP 标签上的步骤操作。

与 Unix 套接字连接

正确配置后,您可以将服务连接到 Cloud SQL 实例的 Unix 域套接字,该套接字在环境文件系统上通过以下路径访问:/cloudsql/INSTANCE_CONNECTION_NAME

可以在Google Cloud Console 的实例的概述页面上找到 INSTANCE_CONNECTION_NAME,也可以通过运行以下命令找到:

gcloud sql instances describe [INSTANCE_NAME].

这些连接会自动加密,无需任何额外配置。

下面显示的代码示例摘自 GitHub 站点上更完整的示例。要在 Web 应用程序的上下文中查看此 sn-p,请查看 the README on GitHub

// 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") ?? "/cloudsql";
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 = String.Format("{0}/{1}", dbSocketDir, instanceConnectionName),
    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;

Google 建议您使用 Secret Manager 来存储敏感信息,例如 SQL 凭据。您可以使用 Cloud Run pass secrets as environment variables or mount as a volume

在 Secret Manager 中的 creating a secret 之后,使用以下命令更新现有服务:

gcloud run services update SERVICE_NAME  \  
--add-cloudsql-instances=INSTANCE_CONNECTION_NAME  
--update-env-vars=INSTANCE_CONNECTION_NAME=INSTANCE_CONNECTION_NAME_SECRET  \  
--update-secrets=DB_USER=DB_USER_SECRET:latest \  
--update-secrets=DB_PASS=DB_PASS_SECRET:latest \  
--update-secrets=DB_NAME=DB_NAME_SECRET:latest

另见:

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 2020-11-15
    • 2015-09-13
    • 2020-07-08
    • 2019-10-28
    • 2020-06-15
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多