我在 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?
为什么?
来自 Cloud SQL Connector 团队的 Jonathan。有两种方法可以解决这个问题。
第一个选项: 配置您的应用程序以使用 TCP 和适用于 Python 的 Cloud SQL Connector 连接到 Cloud SQL 数据库实例。 Python 连接器示例。这使用
pg8000
数据库驱动程序。不幸的是,该连接器不适用于 psycopg2
库。
第二个选项: 将 Cloud SQL Auth 代理容器添加到批处理作业中。
这是对运行批处理作业指南中的作业工作流程定义进行了稍微修改:
将
my-project:uscentral-1:instance
将
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.
这对我不起作用。这是描述作业的 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