在Cloud Function中使用Cloud SQL(Postgres)

3
我正在尝试使用云函数Python脚本连接运行PostgreSQL 11的Cloud SQL。理想情况下,我想使用简单的连接到数据库,该连接需要sqlalchemy.create_engine()进行连接。

这是我的当前尝试(我已经尝试过带有/或不带有/.s.PGSQL.5432后缀):
engine = sqlalchemy.create_engine('postgresql+psycopg2://USERNAME:PASSWORD@/DB_NAME?host=/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432')
engine.connect()

我也尝试了Google提供的代码示例,该示例直接使用psycopg2,但仍然无法正常工作。
Error: function crashed. Details:
could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/cloudsql/vida-production:us-central1:vida-ops/.s.PGSQL.5432"?

编辑:

感谢@kurtisvg指出这一点。由于云函数正在尝试连接到不同项目上的云SQL,因此我必须将云函数的服务帐户添加到云SQL项目的IAM中。

设置IAM后,我使用以下Python代码将sqlalchemy引擎连接到Cloud SQL:

# Don't add the "/.s.PGSQL.5432 suffix" because it will already be added back automatically by the library...

engine = sqlalchemy.create_engine('postgresql+psycopg2://USERNAME:PASSWORD@/DB_NAME?host=/cloudsql/INSTANCE_CONNECTION_NAME')
engine.connect()

2
您是否正在使用第二代云SQL实例?https://cloud.google.com/functions/docs/sql#connecting_to_first_generation_cloud_sql_instances - Doug Stevenson
@DougStevenson 是的,我已经确认我正在使用第二代Cloud SQL。 - sasawatc
1个回答

1

请确保检查以下事项:

  • 启用了Cloud SQL Admin API
  • 确保Functions默认服务帐户具有Cloud SQL Client IAM角色

如果您在两个项目之间进行连接,请确保启用Admin API并授予权限(对于两个项目)给运行您正在尝试连接的函数的Service Account。


谢谢@kurtisvg,Cloud Function和Cloud SQL位于不同的项目中。所以在按照您的建议将服务帐户添加到Cloud SQL IAM角色后,它可以正常工作! - sasawatc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接