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

Posted

技术标签:

【中文标题】如何从 Cloud Run 安全地连接到 Cloud SQL?【英文标题】:How to securely connect to Cloud SQL from Cloud Run? 【发布时间】:2019-09-05 16:12:17 【问题描述】:

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

【问题讨论】:

请注意,Cloud SQL 很快就会得到 Cloud Run 的正式支持。它不需要在容器内安装 Cloud SQL 代理。 【参考方案1】:

我在通过私有 ip 从 dockerized FastApi 应用程序连接到 CloudSQL 时遇到问题。我采取了以下 3 个步骤来解决我的问题:

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

    健全性检查,总是先做这个。您不希望在没有首先排除错误的连接字符串的情况下花费数小时研究解决方案。 在测试时(并且仅在测试时):考虑在应用初始化时记录数据库连接字符串,以便您可以明确确认您的连接字符串是正确的。

    为我的 cloudrun 默认服务帐户提供Cloud SQL Client 角色。

    包含以下权限:cloudsql.instances.connectcloudsql.instances.get

    在数据库网络内创建VPC connector (documentation)。并将 VPC 连接器分配给 Cloud Run 服务。

【讨论】:

【参考方案2】:

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

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

1.Install and initialize the Cloud SDK

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.将应用容器化并上传到容器注册表

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

成功!

【讨论】:

【参考方案3】:

更新:要从 Cloud Run 连接到 Cloud SQL,请参阅official documentation


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

开始:

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

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

【讨论】:

这实际上是行不通的。语法与 CLI 不匹配。但是,在第一次成功更新后,所有后续更新都会使 gcloud gcloud alpha run services update wordpress2 --add-cloudsql-instances cloudrun-sql 崩溃并出现错误:"version": "0.0.1", "verbosity": "ERROR", "timestamp": "2019-04-30T06:09:07.382Z", "message": "gcloud crashed (TypeError): can only join an iterable" 注意。对于那些感兴趣的人,我现在在 Cloud Run 中使用 WordPress。我计划在 Cloud SQL 与 Cloud Run 一起正常工作后立即记录这一点。 把gcloud命令改成:gcloud alpha run services update wordpress2 --set-cloudsql-instances cloudrun-sql解决了crash 但是,使用--add-cloudsql-instances 不应使 gcloud 崩溃。 自动设置对我不起作用。我可以看到 /cloudsql 挂载 (none on /cloudsql type 9p (rw)) 但里面什么都没有。如果我安装 cloud_sql_proxy 并手动运行 cloud_sql_proxy -instances="[CONNECTION-NAME]" -dir=/tmp ,那么套接字就在 /tmp 中。

以上是关于如何从 Cloud Run 安全地连接到 Cloud SQL?的主要内容,如果未能解决你的问题,请参考以下文章

如何从无服务器应用程序安全地连接到 AWS DynamoDB 或其他 aws 数据库

如何使用 PHP 安全地连接到内部网络 SQLSRV 数据库?

如何使用 GUI 工具安全地连接到 GKE 中的数据库?

将存储安全地连接到 Azure Data Lake Analytics 或数据工厂

如何从Java脚本安全地调用Google Cloud Run服务?

通过启用 IAM 登录的 cloud-sql-proxy 从 Cloud Run 连接到 Cloud SQL