如何在Google Cloud ML-Engine训练脚本中安全访问Google Cloud SQL?
安全访问Cloud SQL用于Cloud ML Engine训练脚本
老兄,你现在用的「允许所有IP访问+仅靠密码保障」的方式风险真的不小——公网暴露的SQL实例简直是暴力破解的活靶子,密码一旦泄露或者被猜中,数据安全就彻底没保障了。下面给你几个更安全的实现方案,按推荐程度排序:
1. 用Cloud SQL Proxy(最推荐,配置简单)
Cloud SQL Proxy会在你的训练实例里搭个本地端口,把请求转发到Cloud SQL实例,全程走Google内部加密网络,而且根本不用给Cloud SQL开任何公网IP,完美规避公网暴露的风险。
操作步骤:
- 先给ML Engine默认用的服务账号(格式是
[你的项目ID]@cloudml-service-account.iam.gserviceaccount.com)加上「Cloud SQL Client」权限,在IAM控制台就能配置。 - 提交训练作业的时候,加个
--cloud_sql_instances参数,格式是项目ID:区域:实例名=tcp:端口,比如:gcloud ai-platform jobs submit training 我的训练作业名 \ --region us-central1 \ --module-name 我的脚本模块名 \ --package-path 我的代码包路径 \ --cloud_sql_instances 我的项目ID:us-central1:我的sql实例=tcp:3306 \ --runtime-version 2.11 \ --python-version 3.9 - 训练脚本里连接数据库的时候,直接用
127.0.0.1当主机,指定刚才的端口就行,比如MySQL的连接代码:import mysql.connector conn = mysql.connector.connect( host='127.0.0.1', port=3306, user='数据库用户名', password='数据库密码', database='目标数据库名' ) - 为啥推荐这个?因为不用改Cloud SQL的IP白名单,传输全程加密,还靠Google IAM权限控制访问,比开公网安全太多了。
2. 用VPC私有IP访问
如果你的训练环境需要和其他VPC里的资源打通,那把ML Engine训练作业放到和Cloud SQL同一个VPC里,用私有IP直接访问是个好选择。
操作步骤:
- 先给Cloud SQL实例开私有IP,在Cloud SQL控制台的「连接」页面配置,关联上你的VPC网络。
- 把ML Engine的训练网络和你的VPC做个 peering,或者直接指定训练作业用你的自定义VPC。
- 提交训练作业时加
--vpc-network参数,让训练实例加入你的VPC:gcloud ai-platform jobs submit training 我的训练作业名 \ --region us-central1 \ --module-name 我的脚本模块名 \ --package-path 我的代码包路径 \ --vpc-network projects/我的项目ID/global/networks/我的VPC名 \ --runtime-version 2.11 \ --python-version 3.9 - 脚本里直接用Cloud SQL的私有IP当主机地址连接就行,完全不用开公网IP。
- 优势:全程在私有网络里访问,根本没公网暴露的风险,适合企业级的复杂网络架构。
3. 搭配IAM数据库认证(彻底摆脱密码)
上面两种方法还能再升级——用IAM数据库认证,不用管数据库密码,直接用服务账号身份登录,安全又省心。
操作步骤:
- 在Cloud SQL控制台创建一个数据库用户,用户名就是ML Engine的服务账号邮箱(比如
[你的项目ID]@cloudml-service-account.iam.gserviceaccount.com)。 - 确保这个服务账号有「Cloud SQL Client」权限。
- 连接数据库的时候用IAM认证方式,举两个例子:
- MySQL用官方连接器:
import mysql.connector from google.cloud.sql.connector import Connector import sqlalchemy def get_db_connection(): connector = Connector() conn = connector.connect( "我的项目ID:us-central1:我的sql实例", "pymysql", user="[我的项目ID]@cloudml-service-account.iam.gserviceaccount.com", db="目标数据库名", enable_iam_auth=True ) return conn # 创建连接池,方便脚本里复用 db_pool = sqlalchemy.create_engine( "mysql+pymysql://", creator=get_db_connection, ) - PostgreSQL用OAuth2 token认证:
import psycopg2 import google.auth # 获取当前服务账号的凭证 credentials, project_id = google.auth.default() credentials.refresh(google.auth.transport.requests.Request()) conn = psycopg2.connect( host='127.0.0.1', # 如果用Cloud SQL Proxy的话 port=5432, user="[我的项目ID]@cloudml-service-account.iam.gserviceaccount.com", dbname="目标数据库名", password=credentials.token )
- MySQL用官方连接器:
- 优势:不用存密码、不用管密码过期,全靠IAM权限控制谁能访问,完全符合Google Cloud的最佳实践。
最后提醒一句:赶紧把原来的「允许所有IP」配置关掉!只保留上面这些安全的访问方式,彻底杜绝公网暴露的风险。
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

