我在GCP Cloud run中设置了我的实例,以连接到云SQL DB(Postgres(,但其中只有一个实例可以与云SQL建立连接,但其他实例不能,所有实例都使用相同的主机或内部IP,相同的用户和密码,我还创建了一个新的用户和口令,但我不能
提前感谢
您在将云运行部署的实例连接到云SQL或通常连接到云SQL时遇到问题吗?我的第一个猜测是,您没有将建立直接TCP连接的所有位置的公共Ipv4 IP地址列入白名单;但是,如果这只是部署的CR实例中的一个问题,那么我会根据您的连接方式检查以下内容:
- 云SQL身份验证代理
- 私有IP(可在专有网络上访问的IPv4或IPv6地址(
- 公共IP(公众可访问的IPv4或IPv6地址(
最简单的方法是使用公共IP,确保所有IAM角色和服务帐户都可用于云运行服务帐户,并使用代理将连接主机更改为使用Unix套接字,而不是原始IP地址。
例如,在本地开发中,您的主机可能类似于35.333.333.1,但当部署到生产环境中时,您需要更改主机以使用Cloud SQL实例的Unix域套接字,该套接字在路径"上访问/cloudsql/<INSTANCE_CONNECTION_NAME>";。
INSTANCE_CONNECTION_NAME可以在谷歌云控制台的实例概览页面上找到,也可以运行以下命令:
gcloud sql instances describe [INSTANCE_NAME].
- 确保云运行使用的服务帐户(即,在部署新版本页面的安全选项卡上看到的服务帐户,通常是以"@serverless-robot-prod.iam.gserviceaccount.com"结尾的默认计算引擎服务帐户(具有连接到云SQL所需的正确角色和权限。至少需要以下其中一项
- 云SQL客户端(首选(
- 云SQL编辑器
- 云SQL管理员或手动分配IAM权限:
- cloudsql.instances.connect
- cloudsql.instances.get
这一切都可以通过使用gcloud
部署到云来解决(假设代码中的envvars/connection参数正确(:
如果您正在部署一个新容器,请使用以下命令:
gcloud run deploy --image IMAGE
--add-cloudsql-instances INSTANCE-CONNECTION-NAME
--update-env-vars INSTANCE_CONNECTION_NAME="INSTANCE-CONNECTION-NAME"
如果您正在更新现有服务,请使用以下命令:
gcloud run services update SERVICE-NAME
--add-cloudsql-instances INSTANCE-CONNECTION-NAME
--update-env-vars INSTANCE_CONNECTION_NAME="INSTANCE-CONNECTION-NAME"
有关详细信息,请参见此处:https://cloud.google.com/sql/docs/postgres/connect-run