使用代理连接到Google Cloud SQL - 错误403:权限不足

时间:2018-04-21 21:57:47

标签: go google-cloud-sql google-kubernetes-engine

EDIT:

我现在认为问题在于我的Golang pod通过localhost与代理pod通信,如第二条错误消息所示。

我将服务帐户凭据JSON文件添加到Docker镜像的GOOGLE_APPLICATION_CREDENTIALS环境变量中。完成此操作后,使用my-project:us-central1:my-instance作为下面的connName工作。

但是,当我尝试将容器中的DB_HOST环境变量用作connName时,我仍然会收到以下404错误。

ORIGINAL POST

我正在关注this guide从Kubernetes Engine上的pod连接到Google Cloud SQL。该pod正在运行两个容器:一个包含Cloud SQL代理映像,另一个包含Golang服务以执行实际的数据库查询。

当我的Golang服务尝试启动连接时,我收到以下错误:

  

确保为您的项目启用了Cloud SQL API   (https://console.cloud.google.com/flows/enableapi?apiid=sqladmin)。   在createEphemeral期间出错   my-project:us-central1:my-instance:googleapi:错误403:   许可不足,许可不足

我已经看过这里和其他地方的几个主题,这是我到目前为止所做的:

  • 确保实际启用了Cloud SQL API。
  • Editor角色添加到我正在使用的服务帐户中。
  • 删除并重新添加了我正在使用的服务帐户的Cloud SQL Client角色。
  • 已验证创建了正确的机密,其名称与pod相同。

以下是我正在使用的Golang代码片段,摘自here

cfg := mysql.Cfg(connName, dbUser, dbPassword)
cfg.DBName = dbName
db, err := mysql.DialCfg(cfg)

if err != nil {
    log.Println(err)
    return c.NoContent(http.StatusInternalServerError)
}

connName与错误中显示的字符串相同:my-project:us-central1:my-instance。我已尝试将其更改为127.0.0.1:3306,但我在下面收到此错误:

  

确保该帐户有权访问“127.0.0.1:3306”(并确保   这个名字没有拼写错误。在createEphemeral期间出错   127.0.0.1:3306:googleapi:获取带有正文的HTTP响应代码404:未找到

此外,这是我用于部署pod的yaml文件的片段。

    env: 
    - name: DB_HOST
      value: 127.0.0.1:3306
    - name: DB_USER
      valueFrom:
        secretKeyRef:
          name: cloudsql-db-credentials
          key: username
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: cloudsql-db-credentials
          key: password
  - name: cloudsql-proxy
    image: gcr.io/cloudsql-docker/gce-proxy:1.11
    command: ["/cloud_sql_proxy",
              "-instances=my-project:us-central1:my-instance=tcp:3306",
              "-credential_file=/secrets/cloudsql/credentials.json"]
    volumeMounts:
      - name: cloudsql-instance-credentials
        mountPath: /secrets/cloudsql
        readOnly: true
  volumes:
    - name: cloudsql-instance-credentials
      secret:
        secretName: cloudsql-instance-credentials

我还验证了Cloud SQL代理启动没有问题:

2018/04/21 20:41:19 Listening on 127.0.0.1:3306 for my-project:us-central1:my-instance
2018/04/21 20:41:19 Ready for new connections

我不确定还有什么可以尝试的。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您好在这里可以阅读[1]:"如果您的程序是用Go编写的,那么您可以将Cloud SQL Proxy用作库,从而无需启动代理作为协同进程。&#34 ;,所以你已经使用SQL代理作为代码,并且不需要将SQL代理用作POD。

如果你仍想使用SQL代理作为POD,你可以使用GO Companion Process,你可以在这里阅读[2]:" Companion Process":

import (
        "github.com/go-sql-driver/mysql"
)

dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s",
       dbUser,
       dbPassword,
       "127.0.0.1:3306",
       dbName)
db, err := sql.Open("mysql", dsn)

[1] https://github.com/GoogleCloudPlatform/cloudsql-proxy#to-use-inside-a-go-program [2] https://cloud.google.com/sql/docs/mysql/connect-external-app#languages