Google Cloud Batch + Workflow:如何连接到 Google Cloud SQL?

问题描述 投票:0回答:2

我在 GCP 上实现了一个工作流程,可以触发容器化批处理作业。 (这里是类似教程:https://cloud.google.com/workflows/docs/tutorials/batch-and-workflows)。运行此作业的服务帐户具有“Cloud SQL 客户端”角色。

尽管如此,当我尝试连接到数据库时(在 python 中使用 psycopg2),我仍然不断收到此错误:

psycopg2.OperationalError: connection to server on socket "/cloudsql/PROJECT_NAME:us-central1:DB_NAME/.s.PGSQL.5432" failed: No such file or directory
    Is the server running locally and accepting connections on that socket?

为什么?

google-cloud-platform google-cloud-sql google-cloud-compute-engine
2个回答
2
投票

来自 Cloud SQL Connector 团队的 Jonathan。有两种方法可以解决这个问题。

第一个选项: 配置您的应用程序以使用 TCP 和适用于 Python 的 Cloud SQL Connector 连接到 Cloud SQL 数据库实例。 Python 连接器示例。这使用

pg8000
数据库驱动程序。不幸的是,该连接器不适用于
psycopg2
库。

第二个选项: 将 Cloud SQL Auth 代理容器添加到批处理作业中。

这是对运行批处理作业指南中的作业工作流程定义进行了稍微修改:

替换为数据库中的连接字符串,例如

my-project:uscentral-1:instance

替换为适合您的数据库的 TCP 端口。代理容器启动时将开始侦听此端口。您的应用程序应该使用它的数据库驱动程序来连接到

localhost:<DB_PORT>

在此配置中,您的应用程序仍需要使用数据库用户名和密码对数据库进行身份验证。如果您想使用 IAM 身份验证,则需要根据Cloud SQL 代理指南进行调整。

main:
  params: [args]
  steps:
  # ... snip ...
  - createAndRunBatchJob:
      call: googleapis.batch.v1.projects.locations.jobs.create
      args:
        parent: ${"projects/" + projectId + "/locations/" + region}
        jobId: ${jobId}
        body:
          taskGroups:
            taskSpec:
              runnables:
              # The Cloud SQL Proxy container, opens a database port at
              # localhost:<DB_PORT> accessible to your application container
              - container:
                  imageUri: gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.8.2
                  background: true
                  commands:
                  - "--structured-logs"
                  - "--port=<DB_PORT>"
                  - "<INSTANCE_CONNECTION_NAME>"

              # The application container, uses a standard database library to
              - container:
                  imageUri: ${imageUri}
                environment:
                  variables:
                    DB_HOST: "localhost"
                    DB_PORT: "<DB_PORT>"
            # Run 6 tasks on 2 VMs
            taskCount: 6
            parallelism: 2
          logsPolicy:
            destination: CLOUD_LOGGING
      result: createAndRunBatchJobResponse
# ...snip...```

Let me know if this works for you.

0
投票

这对我不起作用。这是描述作业的 yaml 输出

  taskSpec:
    environment:
      variables:
        POSTGRES_HOST: localhost
    runnables:
    - background: true
      container:
        commands:
        - /cloud_sql_proxy
        - -instances=myproject:myregion:myinstance=tcp:5432
        - -enable_iam_login
        - -structured_logs
        imageUri: gcr.io/cloudsql-docker/gce-proxy:1.28.1
    - container:
        commands:
        - load_postgres
        imageUri: myimage

还有日志

代理

message: "Listening on 127.0.0.1:5432 for myproject:myregion:myinstance"
Ready for new connections

客户

connection to server at "localhost" (127.0.0.1), port 5432 failed
© www.soinside.com 2019 - 2024. All rights reserved.