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

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

【问题讨论】:

  • 请注意,Cloud SQL 很快就会得到 Cloud Run 的正式支持。它不需要在容器内安装 Cloud SQL 代理。

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


【解决方案1】:

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

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

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

    • 包含以下权限:
      cloudsql.instances.connect
      cloudsql.instances.get
  3. 在数据库网络内创建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 中。
      猜你喜欢
      • 2020-06-15
      • 2019-10-28
      • 2020-02-23
      • 1970-01-01
      • 2021-07-18
      • 2020-07-01
      • 2020-08-31
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多