如何连接到 Cloud SQL 上的数据库,而无需在容器中添加我的凭据文件?
3 回答
更新:要从 Cloud Run 连接到 Cloud SQL,请参阅官方文档
Cloud SQL 现在由 Cloud Run 的完全托管版本支持(GKE 上的 Cloud Run 用户已经能够使用私有 IP 使用 Cloud SQL)
开始:
- 如果您还没有,请创建一个 Cloud SQL 实例。
- 确保已启用Cloud SQL 管理 API
- 使用 gcloud alpha 和以下标志部署 Cloud Run 服务的新版本:
$ gcloud run services update --add-cloudsql-instances [INSTANCE_CONNECTION_NAME]
Where isINSTANCE_CONNECTION_NAME
的类型为project:region:instancename
.
当您执行此操作时,Cloud Run 将为您激活和配置Cloud SQL 代理。然后,您应该通过/cloudsql/[INSTANCE_CONNECTION_NAME]
Unix 套接字连接到它。
使用 UNIX 域套接字 (Java) 从云运行(完全托管)连接到云 SQL
目前 Cloud Run(全托管)不支持使用 TCP 连接到 Cloud SQL 实例。您的代码不应尝试使用 IP 地址(例如 127.0.0.1 或 172.17.0.1)访问实例。 关联
2.更新组件:
gcloud components update
3.新建项目
gcloud projects create run-to-sql
gcloud config set project run-to-sql
gcloud projects describe run-to-sql
4.启用计费
gcloud alpha billing projects link run-to-sql --billing-account XXXXXX-XXXXXX-XXXX
5.设置计算项目信息元数据:
gcloud compute project-info describe --project run-to-sql
gcloud compute project-info add-metadata --metadata google-compute-default-region=europe-west2,google-compute-default-zone=europe-west2-b
6.启用 Cloud SQL Admin API:
gcloud services enable sqladmin.googleapis.com
7.创建一个公网IP的Cloud SQL实例
#Create the sql instance in the same region as App Engine Application
gcloud --project=run-to-sql beta sql instances create database-external --region=europe-west2
#Set the password for the "root@%" MySQL user:
gcloud sql users set-password root --host=% --instance database-external --password root
#Create a user
gcloud sql users create user_name --host=% --instance=database-external --password=user_password
#Create a database
gcloud sql databases create user_database --instance=database-external
gcloud sql databases list --instance=database-external
gcloud sql instances list
Cloud Run(全托管)使用服务帐号来授权您与 Cloud SQL 的连接。此服务帐户必须具有正确的 IAM 权限才能成功连接。除非另有配置,否则默认服务帐户的格式为 PROJECT_NUMBER-compute@developer.gserviceaccount.com。
8.确保您的服务的服务帐户具有以下 IAM 角色之一:Cloud SQL 客户端(首选)
gcloud iam service-accounts list
gcloud projects add-iam-policy-binding run-to-sql --member serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com. --role roles/cloudsql.client
9.克隆 java-docs-repository
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
cd java-docs-samples/cloud-sql/mysql/servlet/
ls
#Dockerfile pom.xml README.md src
10.检查处理与 Cloud SQL 的连接的文件
cat src/main/java/com/example/cloudsql/ConnectionPoolContextListener.java
11.将应用容器化并上传到 Container Registry
gcloud builds submit --tag gcr.io/run-to-sql/run-mysql
12.将服务部署到 Cloud Run
gcloud run deploy run-mysql --image gcr.io/run-to-sql/run-mysql
13.配置服务以与 Cloud Run 一起使用
gcloud run services update run-mysql --add-cloudsql-instances run-to-sql:europe-west2:database-external --set-env-vars CLOUD_SQL_CONNECTION_NAME=run-to-sql:europe-west2:database-external DB_USER=user_name,DB_PASS=user_password,DB_NAME=user_database
14.测试一下
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://run-mysql-xxxxxxxx-xx.x.run.app
成功!
我在通过私有 ip 从 dockerized FastApi 应用程序连接到 CloudSQL 时遇到问题。我采取了以下 3 个步骤来解决我的问题:
确保您的应用程序使用正确的
database-connection-string
.- 健全性检查,总是先做这个。您不想在没有首先排除错误的连接字符串的情况下花费数小时研究解决方案。
- 测试时(并且仅在测试时):考虑在应用程序初始化时记录数据库连接字符串,以便您可以明确确认您的连接字符串是正确的。
将
Cloud SQL Client
角色提供给我的 cloudrun 默认服务帐户。- 包含以下权限:
cloudsql.instances.connect
cloudsql.instances.get
- 包含以下权限:
VPC connector
在数据库的网络内创建一个(文档)。并将 VPC 连接器分配给 Cloud Run 服务。