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

How to securely connect to Cloud SQL from Cloud Run?

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

更新: 从云 运行 连接到云 SQL 请参阅 official documentation


Cloud SQL 现在由 Cloud 运行 的完全托管版本支持(GKE 用户上的 Cloud 运行 已经能够使用私有的 Cloud SQL知识产权)

开始:

  • 如果您还没有,create a Cloud SQL instance
  • 确保 Cloud SQL admin API 已启用
  • 使用 gcloud alpha 和以下标志部署 Cloud 运行 服务的新版本: $ gcloud run services update --add-cloudsql-instances [INSTANCE_CONNECTION_NAME] INSTANCE_CONNECTION_NAME 的类型在哪里 project:region:instancename.

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

从云连接 运行(完全托管)到云 SQL 使用 UNIX 域套接字(Java)

At this time Cloud Run (fully managed) does not support connecting to the Cloud SQL instance using TCP. Your code should not try to access the instance using an IP address such as 127.0.0.1 or 172.17.0.1. link

1.Install and initialize the Cloud SDK

2.Update 成分:

gcloud components update

3.Create一个新项目

gcloud projects create run-to-sql
gcloud config set project run-to-sql
gcloud projects describe run-to-sql

4.Enable 计费

gcloud alpha billing projects link  run-to-sql --billing-account  XXXXXX-XXXXXX-XXXX

5.Set 计算项目信息元数据:

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.Enable 云 SQL 管理员 API:

 gcloud services enable sqladmin.googleapis.com

7.Create 具有 public 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

Cloud Run (fully managed) uses a service account to authorize your connections to Cloud SQL. This service account must have the correct IAM permissions to successfully connect. Unless otherwise configured, the default service account is in the format PROJECT_NUMBER-compute@developer.gserviceaccount.com.

8.Ensure 您服务的服务帐户具有以下 IAM roles: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.Clone 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.Inspect 处理云连接的文件 SQL

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

11.Containerizing 应用程序并将其上传到 Container Registry

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

12.Deploy 云服务 运行

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

13.Configure 与云一起使用的服务 运行

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.Test它

 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

    • 健全性检查,总是先做这个。您不想在没有首先排除错误的连接字符串的情况下花费数小时研究解决方案。
    • 测试时(且仅在测试时):考虑在应用程序初始化时记录数据库连接字符串,以便您可以明确确认您的连接字符串正确。
  2. 为我的 cloudrun 默认服务帐户提供 Cloud SQL Client 角色。

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