如何从Cloud Run安全地连接到Cloud SQL?



如何在 Cloud SQL 上连接到数据库,而无需在容器内添加我的凭证文件?

更新:要从Cloud Run连接到Cloud SQL,请参阅官方文档

Cloud SQL

现在由完全托管版本的 Cloud Run 提供支持(GKE 上的 Cloud Run 用户已经能够使用私有 IP 使用云 SQL)

要开始使用:

  • 如果您还没有,请创建一个云 SQL 实例。
  • 确保已启用云 SQL 管理员 API
  • 使用 gcloud alpha 和以下标志部署 Cloud Run 服务的新版本:$ gcloud run services update --add-cloudsql-instances [INSTANCE_CONNECTION_NAME]INSTANCE_CONNECTION_NAME在哪里属于project:region:instancename类型。

执行此操作时,云运行将为您激活并配置云 SQL 代理。然后,您应该通过/cloudsql/[INSTANCE_CONNECTION_NAME]Unix套接字连接到它。

使用 UNIX 域套接字 (Java) 从 CLOUD RUN (完全托管) 连接到 CLOUD SQL

目前云运行(完全托管)不支持连接到 使用 TCP 的云 SQL 实例。您的代码不应尝试访问实例 使用 IP 地址,例如 127.0.0.1 或 172.17.0.1。 链接

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.启用云 SQL 管理 API:

gcloud services enable sqladmin.googleapis.com

7.创建具有公有 IP 的云 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

云运行(完全托管)使用服务帐户来授权您的 连接到云 SQL。此服务帐户必须具有正确的 成功连接的 IAM 权限。除非另有配置, 默认服务帐户的格式为 PROJECT_NUMBER-compute@developer.gserviceaccount.com。

8.确保您的服务账户具有以下 IAM 角色之一:云 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.检查处理与云 SQL 连接的文件

cat src/main/java/com/example/cloudsql/ConnectionPoolContextListener.java

11.将应用容器化并上传到容器注册表

gcloud builds submit --tag gcr.io/run-to-sql/run-mysql

12.将服务部署到云运行

gcloud run deploy run-mysql --image gcr.io/run-to-sql/run-mysql

13.配置服务以用于云运行

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 个步骤来解决我的问题:

  1. 确保您的应用程序使用正确的database-connection-string

    • 健全性检查,始终先执行此操作。您不希望花费数小时研究解决方案而不首先排除错误的连接字符串。
    • 测试时
    • (并且仅在测试时):请考虑在应用 init 上记录数据库连接字符串,以便可以显式确认连接字符串正确。
  2. 向我的 cloudrun 默认服务帐户提供Cloud SQL Client角色。

    • 包含以下权限:
      cloudsql.instances.connect
      cloudsql.instances.get
  3. 在数据库的网络内创建VPC connector(文档)。并将 VPC 连接器分配给云运行服务。

相关内容

  • 没有找到相关文章

最新更新