如何使用服务帐户连接到 Cloud SQL 实例?

How do I connect to a Cloud SQL instance using a service account?

这似乎是一个以前已经回答过的问题,但我没有找到任何其他答案,所以我提出了一个新问题。

我正在使用 python 脚本和 create/configure 数据库并使用 cloud_sql_proxy 连接到它。如果我不为 cloud_sql_proxy 提供服务帐户凭据,脚本运行得很好,但如果我这样做了,我会得到这个:

2017/08/18 15:34:12 using credential file for authentication; email=test-acc@project.iam.gserviceaccount.com
2017/08/18 15:34:12 Listening on 127.0.0.1:3306 for project:zone:instance
2017/08/18 15:34:12 Ready for new connections
2017/08/18 15:34:12 New connection for "project:zone:instance"
2017/08/18 15:34:13 couldn't connect to "project:zone:instance":
ensure that the account has access to "project:zone:instance"
(and make sure there's no typo in that name).
Error during createEphemeral for project:zone:instance:
googleapi: Error 403: The client is not authorized to make this request., notAuthorized

这不是 INSTANCE_CONNECTION_NAME 问题,因为当我在没有服务帐户的情况下进行身份验证时它工作正常:

2017/08/18 15:38:32 Listening on 127.0.0.1:3306 for project:zone:instance
2017/08/18 15:38:32 Ready for new connections
2017/08/18 15:38:32 New connection for "project:zone:instance"
Connection established.

我尝试过多种不同类型的服务帐户角色:SQLclient + SQLAdmin、SQLclient + SQLAdmin + ProjectEditor 等等

有什么想法吗?我被难住了。

我发现了问题。对于这个项目,我最初没有 IAM 的管理员访问权限。在此处获得管理员权限后,我可以将服务帐户添加到 IAM 页面。这解决了这个问题,尽管我仍然收到一个有趣的 400 错误,抱怨我的 JWT 签名无效。

更新:

我发现我的凭证文件秘密是我为同一个服务帐户创建的第二个凭证文件(您可以为一个服务帐户创建多个密钥)。在更新秘密以使用正确的密钥后,我能够让我的部署工作。