【问题标题】:Google Cloud SQL proxy couldn't find default credentialsGoogle Cloud SQL 代理找不到默认凭据
【发布时间】:2017-05-04 02:18:30
【问题描述】:

我正在尝试像这样在本地运行 Google Cloud SQL 代理:

$ ./cloud_sql_proxy -instances project-name:region-name:instance-id tcp:3306

但它正在返回

google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for mor information.

我的 Google Cloud SDK 已经安装并登录到 Google。

我该如何解决这个问题?

【问题讨论】:

标签: google-cloud-platform google-cloud-sql google-cloud-sdk


【解决方案1】:

两个问题可能会导致您的问题。

要查找什么是登录,使用:

gcloud auth login

1。您没有应用默认凭据

如果您有最新版本的 gcloud,您将获得:

WARNING: `gcloud auth login` no longer writes application default credentials.

要让您的本地应用程序使用您的凭据,您需要执行以下操作 (ref):

gcloud auth application-default login

如果您没有看到此警告,请考虑updating gcloud,并附上:

gcloud components update

2。你还没有定义你的项目

登录后,您应该会看到:

Your current project is [project-id].

再有两个解决方案:

一个。关联项目

如果您没有看到这个,请执行 (ref):

gcloud config set project PROJECT_ID

b.在调用中使用全局--project 标志

在你的命令中关联一个项目:

.\cloud_sql_proxy -instances=project-id:region-name:instance-id=tcp:3306 --project=project-id

【讨论】:

    【解决方案2】:

    Google 应用程序默认凭据与 gcloud 凭据分开管理。

    使用

    gcloud auth application-default login
    

    而不是将您的用户凭据设置为应用程序默认值。请参阅reference 了解更多信息。

    以前gcloud auth login 这样做了,但随着更新的 Cloud SDK 版本不再是这种情况。

    请注意,切换 gcloud 配置或设置帐户不会更新应用默认凭据。只能使用gcloud auth application-default 中的命令来管理这些。

    还可以使用服务帐户作为应用程序默认凭据,您可以通过从开发人员console 下载其 json 密钥直接使用它。

    【讨论】:

    • 事情仍然返回相同的错误。我尝试了gcloud auth application-default login 和使用外部服务帐户 json 密钥。
    • 您是否设置了GOOGLE_APPLICATION_CREDENTIALS 环境变量?您是否也尝试过使用-credential_file 参数?
    • 看来我必须将 gcloud 中的默认项目设置为我的实例所在的项目。否则,它只会返回错误。
    【解决方案3】:

    如果您处于 CI/CD 环境而无法访问浏览器:

    或者如果您只是想自动化该过程。

    您需要使用变量 $GOOGLE_APPLICATION_CREDENTIALS 公开您的服务帐户 json 文件的位置,而不是运行 gcloud auth application-default login

    例如echo "export GOOGLE_APPLICATION_CREDENTIALS=${TF_VAR_gcp_service_account_file_loc}" >> $BASH_ENV(如果您需要在步骤/作业之间移动环境变量)。 $BASH_ENV 是 CircleCI 公开的一个特殊属性,如果您使用不同的 CI/CD 工具,您将需要找到 bash 配置文件的位置。

    或者干脆export GOOGLE_APPLICATION_CREDENTIALS=[path-to-service-account-json-file]在同一步骤中使用

    【讨论】:

      【解决方案4】:

      在这个使用cloud_sql_proxy的场景中,方法是使用GCP-GSA(服务账户), 下载云 sql 代理:

      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
      
      chmod +x cloud_sql_proxy
      

      创建代理用户:

      gcloud iam service-accounts create proxy-user --display-name "proxy-user"
      
      gcloud iam service-accounts list
      

      [SERVICE_ACCOUNT_EMAIL] 是关于 sql 实例详细信息的电子邮件。

      gcloud projects add-iam-policy-binding [PROJECT_ID] --member \
      serviceAccount:[SERVICE_ACCOUNT_EMAIL] --role roles/cloudsql.client
      
      gcloud iam service-accounts keys create key.json --iam-account [SERVICE_ACCOUNT_EMAIL]
      
      
      gcloud sql instances describe [INSTANCE_ID] | grep connectionName
      

      为 KUBE 引擎创建一个关键的 JSON 文件

      ./cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306 -credential_file=key.json &
      
      
      kubectl create secret generic cloudsql-instance-credentials --from-file=credentials.json=key.json
      

      您的部署:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: <DEPLOYMENT-NAME>
      spec:
        selector:
          matchLabels:
            app: <APPLICATION-NAME>
        template:
          metadata:
            labels:
              app: <APPLICATION-NAME>
          spec:
            serviceAccountName: <KSA-NAME>
            containers:
            - name: cloud-sql-proxy
              image: gcr.io/cloudsql-docker/gce-proxy:1.17
              command:
                - "/cloud_sql_proxy"
                - "-instances=<INSTANCE_CONNECTION_NAME>=tcp:<DB_PORT>"
              securityContext:
                runAsNonRoot: true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-12
        • 2019-02-17
        • 2017-05-21
        • 1970-01-01
        • 2017-07-13
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多