【问题标题】:Unable to connect to Cloud SQL (through Auth Proxy) from Cloud Run无法从 Cloud Run 连接到 Cloud SQL(通过 Auth 代理)
【发布时间】:2022-11-10 02:54:26
【问题描述】:

我正在尝试通过我在本地开发的 Cloud Run 应用程序 (Node.js) 访问我的 Cloud SQL 数据库 (PostgreSQL)(使用 Cloud Code 作为 VS Code 扩展的一部分)。

我可以通过终端中的 Cloud SQL Auth 代理访问数据库(使用 psql "host=127.0.0.1 port=5432 sslmode=disable dbname=*** user=***"),但一直无法从本地 Cloud Run 成功连接。

Cloud SQL 数据库在我的 Cloud Run 项目中设置为连接。

我已经尝试(但失败)了两种尝试连接的方法:

  1. 使用实例连接名称:当我做这样的事情时:
    const pg = require('knex')({
      client: 'pg',
      connection: {
        user: '...', 
        password: '...',
        database: '...',
        host: '/cloudsql/...',
      },
      debug: true,
    });
    

    我收到以下错误:

    connect ENOENT /cloudsql/.../.s.PGSQL.5432"
    
    1. 使用本地主机和端口:当我做这样的事情时:
    const pg = require('knex')({
      client: 'pg',
      connection: {
        user: '...', 
        password: '...',
        database: '...',
        host: '127.0.0.1',
        port: 5432,
      },
      debug: true,
    });
    

    我收到以下错误:

    Error: connect ECONNREFUSED 127.0.0.1:5432
    

【问题讨论】:

  • 你的主机看起来像/cloudsql/myproject:us-central1:myinstance吗?
  • 澄清一下:-当您在本地开发 Cloud Run 应用程序时,您的 Cloud SQL 代理是否继续运行? - 您的应用程序在本地运行时是否能够连接到数据库而无需 Cloud Code 中的 Cloud Run 模拟器(通常您也可以在本地运行 CR Local 应用程序,具体取决于您使用的 GCP 服务数量)
  • @enocom,是的——这就是我一直试图用于主机的,但我不认为该文件实际上是作为我的 Cloud Run 实例的一部分安装的(在我的本地开发机器上)
  • @IvanPortyankin,Cloud SQL 代理正在运行,我可以直接从终端连接到它,但我根本无法从通过 Cloud Code 在本地运行的 Cloud Run 应用程序连接

标签: node.js postgresql google-cloud-sql google-cloud-run google-cloud-code


【解决方案1】:

Cloud Code 本地 Cloud Run 实现目前不支持 Cloud SQL。添加在 Cloud Run 应用旁边运行的 Cloud SQL 代理的一种方法是将其添加为边车到 Cloud Code 在 Cloud Run 本地开发会话期间部署的容器。尝试以下操作:

  1. 启动云代码Cloud Run: Run Locally会话
  2. 等待应用程序构建和启动,端点可用
  3. 此时,您的应用程序作为容器在 minikube 中运行(在名为 cloud-run-dev-internal 的单独命名空间中),并且部署名称与您的 Cloud Run 服务名称匹配。
  4. 创建一个YAML 补丁文件这将在您的应用程序旁边启动 Cloud SQL 代理,因此它将在本地可用(通过 localhost):
    spec:
      template:
        spec:
          containers:
          - name: cloud-sql-proxy
            image: gcr.io/cloudsql-docker/gce-proxy
            command:
            - "/cloud_sql_proxy"
    
            # By default, the proxy will write all logs to stderr. In some
            # environments, anything printed to stderr is consider an error. To
            # disable this behavior and write all logs to stdout (except errors
            # which will still go to stderr), use:
            - "-log_debug_stdout"
    
            # Replace DB_PORT with the port the proxy should listen on
            # Defaults: MySQL: 3306, Postgres: 5432, SQLServer: 1433
            - "-instances=my-project:my-region:my-instance=tcp:3306"
    
    
    1. 另存为cloudsql-proxy-patch.yaml。通过以下方式应用此补丁文件: kubectl patch deployment {your_cloud_run_service_name} --patch-file cloudsql-proxy-patch.yaml --context cloud-run-dev-internal
    2. 一段时间后,Cloud SQL 代理应该会运行。要进行诊断,您可以使用 Kubernetes Explorer 并查看 cloud-run-dev-internal 命名空间,看看您的 pod 是否同时具有您的应用程序和 Cloud SQL Proxy 端汽车容器。

    其余的取决于您如何在本地配置 Cloud SQL 代理。有关如何将代理设置为 Sidecar 的更多详细信息,请参阅https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine#run_the_as_a_sidecar

【讨论】:

    猜你喜欢
    • 2018-06-03
    • 2021-07-18
    • 2021-12-29
    • 1970-01-01
    • 2021-02-12
    • 2021-08-10
    • 2021-08-01
    • 1970-01-01
    • 2020-06-15
    相关资源
    最近更新 更多