如何使用指定参数手动操作Cloud SQL Proxy并解决空密码错误
非服务账号已拥有roles/cloudsql.client(Cloud SQL Client)和roles/cloudsql.instanceUser(Cloud SQL Instance User)角色,且对应的IAM账号(用户邮箱)已添加至数据库实例,但使用Cloud SQL Proxy连接时触发错误:
FATAL: empty password returned by client
当前执行的启动命令:
docker run --rm --network=host gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.1 --address 0.0.0.0 --port 5432 --token=$(gcloud auth print-access-token) $(gcloud sql instances describe MY_INSTANCE --format='value(connectionName)')
代理启动日志显示正常:
2023/09/15 18:53:56 Authorizing with OAuth2 token
2023/09/15 18:53:57 [MY_ORG:us-central1:MY_INSTANCE] Listening on [::]:5432
2023/09/15 18:53:57 The proxy has started successfully and is ready for new connections!
正确启动命令
问题核心是未启用IAM数据库认证,添加--auto-iam-authn参数即可解决空密码错误,正确命令如下:
docker run --rm --network=host gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.1 --address 0.0.0.0 --port 5432 --auto-iam-authn --token=$(gcloud auth print-access-token) $(gcloud sql instances describe MY_INSTANCE --format='value(connectionName)')
各参数手动使用说明
--login-token
该参数用于传递IAM用户的身份验证令牌,专门用于IAM数据库登录场景,命令示例:
docker run --rm --network=host gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.1 --address 0.0.0.0 --port 5432 --login-token=$(gcloud auth print-identity-token) <INSTANCE_CONNECTION_NAME>
注意:需用gcloud auth print-identity-token获取令牌,而非访问令牌,此令牌直接用于数据库用户身份校验
--token
该参数是代理自身访问GCP API的授权凭证,用于让代理获取Cloud SQL实例的元数据等信息,命令示例:
docker run --rm --network=host gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.1 --address 0.0.0.0 --port 5432 --token=$(gcloud auth print-access-token) <INSTANCE_CONNECTION_NAME>
此参数仅服务于代理与GCP的通信,不直接参与数据库用户的登录认证
--auto-iam-authn
启用后代理会自动处理IAM数据库认证流程,将用户的身份凭证转换为数据库登录所需的临时凭证,无需手动输入密码,命令示例:
docker run --rm --network=host gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.1 --address 0.0.0.0 --port 5432 --auto-iam-authn <INSTANCE_CONNECTION_NAME>
可搭配--token使用,或依赖本地已登录的gcloud应用默认凭证,这是解决本次空密码错误的关键参数
内容的提问来源于stack exchange,提问作者pocesar

