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

25
如何在不将凭据文件添加到容器内的情况下连接云SQL数据库?

2
请注意,Cloud SQL 很快将由 Cloud Run 正式支持。它不需要在容器内安装 Cloud SQL 代理。 - Steren
3个回答

20

更新:为了从Cloud Run连接到Cloud SQL,请查看官方文档


现在,完全托管的Cloud Run版本支持使用Cloud SQL(Cloud Run on GKE 用户已经可以使用私有IP使用Cloud SQL)。

开始使用:

  • 如果您还没有Cloud SQL实例,请创建一个Cloud SQL实例
  • 确保启用了Cloud SQL管理API
  • 使用gcloud alpha部署Cloud Run服务的新修订版本,并添加以下标志:$ gcloud run services update --add-cloudsql-instances [INSTANCE_CONNECTION_NAME],其中INSTANCE_CONNECTION_NAMEproject:region:instancename类型的连接名称。

这样做时,Cloud Run将为您激活和配置Cloud SQL代理。然后,您应通过Unix套接字/cloudsql/[INSTANCE_CONNECTION_NAME]连接到它。


注意:对于那些感兴趣的人,我现在已经成功将WordPress运行在Cloud Run上。一旦Cloud SQL与Cloud Run正确配合,我计划立即记录下来。 - John Hanley
通过将gcloud命令更改为:gcloud alpha run services update wordpress2 --set-cloudsql-instances cloudrun-sql,解决了崩溃问题。 - John Hanley
我的Cloud SQL实例在us-central1之外,我按照指示操作(gcloud beta run deploy --image [IMAGE] --add-cloudsql-instances [CONNECTION-NAME]),但没有/cloudsql目录。我也尝试了@john-hanley的建议--set-cloudsql-instances cloudrun-sql。 - Michael Ribbons
2
自动设置对我不起作用。 我可以看到 /cloudsql 挂载 (none on /cloudsql type 9p (rw)),但里面没有任何东西。如果我安装 cloud_sql_proxy 并手动运行 cloud_sql_proxy -instances="[CONNECTION-NAME]" -dir=/tmp,那么套接字就在 /tmp 中。 - Leonid Makarov
这个支持postgres IAM集成吗? - red888
显示剩余5条评论

3

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

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

1.安装和初始化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

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

成功!


0

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

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

    • 先进行一次合理性检查,这是首要任务。您不希望在排除错误的连接字符串之前花费数小时研究解决方案。
    • 测试时(仅限测试时):考虑在应用程序初始化时记录db连接字符串,以便您可以明确确认连接字符串是否正确。
  2. 向我的cloudrun默认服务帐户提供Cloud SQL Client角色。

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


我几周前配置了这个,发现 VPC 连接器正在向我收费。有没有不使用 VPC 连接器的方法?你是否注意到 VPC 连接器的一些费用? - atreeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接