在本地使用cloud_sql_proxy时出现了notAuthorized错误

15

我正在尝试为第二代云SQL实例在本地建立连接。

代理的调用方式是:

./cloud_sql_proxy -dir=/cloudsql -instances=status-1268:us-central1:status-dev=tcp:3306 & mysql -u status_stg --host 127.0.0.1

我有点不清楚如何正确设置API部分的服务帐户,因此我尝试使用两个默认值,即App Engine默认服务帐户和Compute Engine默认服务帐户。我还创建了一个新的服务帐户。对于它们中的每一个,我都将服务帐户ID分配为“编辑器”和“所有者”,并从“管理权限”部分进行设置。也许还有另一种方法可以为这些帐户启用Cloud SQL Admin API吗?
当我的服务尝试与数据库通信时,代理输出如下:
./cloud_sql_proxy -dir=/cloudsql -instances=status-1268:us-central1:status-   dev=tcp:3306 & mysql -u status_stg --host 127.0.0.1
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)
2016/04/04 11:26:58 Open socket for "status-1268:us-central1:status-dev" at     "127.0.0.1:3306"
2016/04/04 11:26:58 Socket prefix: /cloudsql
2016/04/04 11:27:10 Got a connection for "status-1268:us-central1:status-dev"
2016/04/04 11:27:11 couldn't connect to "status-1268:us-central1:status-dev": googleapi: Error 403: The client is not authorized to make this request., notAuthorized
2016/04/04 11:29:08 Got a connection for "status-1268:us-central1:status-dev"
2016/04/04 11:29:08 couldn't connect to "status-1268:us-central1:status-dev": googleapi: Error 403: The client is not authorized to make this request., notAuthorized

你有什么建议吗?我觉得在配置服务帐户方面缺少一些基础知识。

总体而言,我的项目正在运行一个node.js express应用程序,并希望将其连接到第二代云SQL DB实例,而无需像我目前正在使用的那样将其公开为0.0.0.0。

谢谢

8个回答

12

TL;DR: 如果你的错误日志包含Error during createEphemeral..,请继续阅读。

对我有效的解决方案来自于Github Cloud-SQL-Proxy Issue Tracker

看起来您可能遇到了后端中的一个错误,当存在相同名称的旧服务帐户时会触发该错误。请按照以下步骤解决您的问题:
  1. 转到Cloud项目IAM页面(左侧菜单> IAM&管理> IAM)
  2. 查找出现问题的机器人帐户所在的行。
  3. 在角色列上应该写着“Cloud SQL客户端”。
  4. 单击它以打开下拉菜单
  5. 单击已选中的“Cloud SQL客户端”角色以取消选中。
  6. 单击上面的蓝色保存按钮。
  7. 验证服务帐户是否已从IAM页面中删除。
  8. 在同一页上方单击添加按钮。
  9. 输入服务帐户电子邮件地址并选择Cloud SQL客户端角色
  10. 单击添加
  11. 服务帐户应再次出现在列表中。
感谢Chees,但积分是我的:P。希望这可以解决您的问题。

2
非常感谢!这正是我的情况。我几天前创建了SA,然后删除了它,并使用相同的名称创建了新的SA。因此,解决方案就是从IAM中删除“新”SA,然后再次添加带有“Cloud SQL客户端”的SA。 - Stepan Vrany

5

在我的情况下,问题在于服务帐户没有正确的角色。您至少应将其设置为编辑器。


1
这也是我的问题,就像问题中概述的那样出现了错误消息。默认服务帐户没有所需的编辑权限来正确启动代理。 - tmarthal

4
请仔细检查连接字符串。看起来你的凭据是正确的,所以很可能是实例名称出现了错误。
我建议从云控制台页面上复制“实例连接名称”并粘贴到此处。

instance details


我已经通过设置GOOGLE_APPLICATION_CREDENTIALS环境变量来实现了这一点。如果这不起作用,启动代理时会出现不同的错误,提示需要使用-credential_file标志。 - georges
啊,我明白了,很抱歉原帖没有表述清楚。我已经更新了我的回答,请仔细检查实例名称(包括项目ID)。 - Vadim
1
太棒了。感谢建议,经过长时间的盯着看,它真的是个糟糕的名字。 - georges

3
有许多原因导致此错误。
以下是解决方案:
1)从sql实例的“概述”选项卡中复制实例名称。 enter image description here 2)您可能没有访问“云sql客户端”的权限。 这里有更多详细信息。

2

在我的情况下,我犯了两个错误:

  1. 确保您为云SQL实例使用正确的项目。

    $gcloud config set project my-project

  2. 使用正确的connectionName。如果像我一样遵循谷歌文档,你可能会在你的connectionName中放上方括号。请将它们删除。

Myname-MBP:django setoelkahfi$ ./cloud_sql_proxy -instances="[blitzkrig-9f158:us-central1:polls-instance]"=tcp:3306 2018/06/01 04:55:48 Listening on 127.0.0.1:3306 for [blitzkrig-9f158-9f158:us-central1:polls-instance] 2018/06/01 04:55:48 Ready for new connections 2018/06/01 04:56:48 New connection for "[blitzkrig-9f158-9f158:us-central1:polls-instance]" 2018/06/01 04:56:50 无法连接到 "[blitzkrig-9f158-9f158:us-central1:olls-instance]": 确保该帐户有权访问 "[blitzkrig-9f158-9f158:us-central1:polls-instance]"(并确保名称没有拼写错误)。在[blitzkrig-9f158-9f158:us-central1:polls-instance]的createEphemeral期间发生错误:googleapi:Error 403:客户端未被授权进行此请求。, notAuthorized


2
另一种解释是,如果您使用 -dir 标志,则表示您将通过 unix-socket 进行连接,对于 MySQL 来说这是一个额外的连接参数,因此 =tcp:3306 变得多余。当通过 127.0.0.1 连接时,这将不起作用,因为它是 TCP,并且正在套接字上等待连接。

0
在我的情况下,我已经建立了一个不同的项目。 设置正确的项目并进行检查。
gcloud init

./cloud_sql_proxy -instances=<project-name>:<location>:<dbname>=tcp:1433

0
"未经授权" 明确意味着根据此处的文档 https://cloud.google.com/sql/docs/mysql/connect-auth-proxy#service-account,"您用于连接 Cloud SQL 的用户没有 GCP Cloud SQL 客户端角色"。同时,请确保已启用 "Cloud SQL API"。一旦将该角色添加到您的服务帐户中,请确保在继续连接数据库之前再次运行命令进行身份验证。

gcloud auth activate-service-account sa-service-acct@<ProjectName>.iam.gserviceaccount.com --key-file=<Location/to/your/sa-service-acct.json> --project=<ProjectName>

其中,sa-service-acct 是您服务帐户的示例。

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