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

时间:2019-04-15 16:08:40

标签: google-cloud-sql google-cloud-run

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

3 个答案:

答案 0 :(得分:7)

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

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

该功能目前处于Alpha状态,因此您需要使用gcloud alpha(它将在10天内在gcloud beta中使用)

开始使用:

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

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

答案 1 :(得分:1)

使用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 Client(首选)

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

成功!

答案 2 :(得分:0)

我在通过私有 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 Run 服务。