通过 Cloud SQL Proxy 进行 Python 应用 IAM 服务帐号身份验证

通过 Cloud SQL Proxy 进行 Python 应用 IAM 服务帐号身份验证

错误描述

嗨!我想使用 CloudSQL 代理在本地以服务帐户身份向 Google Cloud SQL 进行身份验证。这是通过 Kubernetes sidecar 容器模式完成的,其中安装了服务帐户 JSON 凭据,并在 GKE 中使用工作负载身份功能。但是,每当我通过应用程序的代理连接到我的 Cloud SQL postgresql 服务器时,它仍然会要求输入用户名和密码?

我的服务帐号具有以下角色:roles/cloudsql.clientroles/cloudsql.instanceUserroles/cloudsql.connect我的 Cloud SQL 数据库已启用 IAM 权限标志。

以下操作不起作用并导致以下psycopg2错误:

fe_sendauth: no password supplied

例如在Python中:

    def getDBConnection(self, dbHost: str, dbPort: int, dbName: str, dbUser: str):
        dbConn = None 
        try:
            dbConn = psycopg2.connect(host=dbHost, port=dbPort, database=dbName, user=dbUser)
            dbConn.execute('SELECT 1')
        except Exception as e:
            ...
        return dbConn

我也尝试过不用user

示例代码(或命令)

        imagePullPolicy: Always
        image: gcr.io/cloudsql-docker/gce-proxy:latest
        name: cloudsql-proxy
        command: ['/cloud_sql_proxy', '-instances=xxx:europe-west1:yyy=tcp:3126']

        livenessProbe:
          tcpSocket:
            host: '127.0.0.1'
            port: 3126
          failureThreshold: 5
          initialDelaySeconds: 5
          periodSeconds: 3

        env:
        -
          name: GOOGLE_APPLICATION_CREDENTIALS
          value: /sa.json

        volumeMounts:
        -
          mountPath: /sa.json
          name: sajson
          readOnly: true

        resources:
          requests:
            cpu: 0.5
            memory: 0.5Gi
          limits:
            cpu: 0.5
            memory: 0.5Gi

        securityContext:
          readOnlyRootFilesystem: true
          privileged: false
          runAsNonRoot: true
          allowPrivilegeEscalation: false
          capabilities:
            drop: [all]
          seccompProfile:
            type: RuntimeDefault

我应该如何通过分配给我的 Pod 的 IAM 服务帐号向 Cloud SQL 进行身份验证?我看到了使用usernamepassword身份验证的示例,但这违背了 Workload Identity 和 IAM 服务帐号身份验证的要点?

答案1

您可以使用 Cloud SQL 的IAM 数据库身份验证功能可创建仅可由特定 IAM 身份访问的数据库帐号。它与 Cloud SQL Auth 代理兼容,因此您可以修改现有设置以将其与 Workload Identity 一起使用。

相关内容