如何让App Engine标准环境连接Compute Engine上的MySQL容器
搞定App Engine与Compute Engine上MySQL容器的通信问题
嘿,我来帮你梳理下后续的关键配置步骤——你已经设置了允许Compute服务账号的TCP 3306入站防火墙规则,接下来咱们一步步把剩下的环节补全:
1. 先捋清楚网络连通的基础配置
- 如果你的App Engine是标准环境:默认它没法直接访问VPC内的Compute实例,得先创建一个Serverless VPC Access连接器,把App Engine接入到你的VPC网络里。要是你用的是灵活环境,直接在配置里关联VPC就行。
- 另外,确认下你用的是Compute实例的内部IP还是外部IP:用内部IP的话必须走VPC/Serverless连接器;用外部IP的话,得确保实例有公网IP,而且防火墙规则里的目标服务账号确实绑定到了这个Compute实例上。
2. 让MySQL容器允许外部访问
MySQL容器默认只绑定127.0.0.1,只能自己玩,得改配置让它对外敞开:
- 启动容器的时候加个参数:
docker run -p 3306:3306 ... -e MYSQL_ROOT_HOST=% mysql:latest,这里%表示允许所有主机连接,嫌不安全的话可以换成App Engine的IP段或者Serverless连接器的IP范围。 - 或者修改容器里的
my.cnf文件,把bind-address改成0.0.0.0,然后重启容器。
3. 给MySQL的root用户开远程访问权限
默认root账号只能本地登录,得授权它从App Engine那边访问:
GRANT ALL PRIVILEGES ON name_of_my_database.* TO 'root'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;
同样,为了安全,把%换成App Engine的具体IP段会更好。
4. 调整App Engine的配置
- 标准环境的话,在
app.yaml里加上VPC连接器的配置:
别忘了在vpc_access_connector: name: "projects/你的项目ID/locations/你的区域/connectors/连接器名称"requirements.txt里加上MySQL驱动,比如mysqlclient>=2.2.0,不然Django连不上MySQL。 - 灵活环境的话,直接在
app.yaml里关联你的VPC:network: name: default subnetwork_name: default
5. 测试连通性排坑
- 可以先部署个简单的测试脚本,或者用
gcloud app shell进入App Engine的运行环境,执行telnet 你的Compute实例IP 3306或者nc -zv 你的Compute实例IP 3306,看看能不能连上。 - 也可以去Compute实例上抓包,看看有没有来自App Engine的请求打到3306端口。
几个容易踩的坑
- 防火墙规则的来源:如果用Serverless连接器,得允许连接器的IP范围;用外部IP的话,要允许App Engine的出站IP段。
- 检查Compute实例的标签:要是防火墙规则是用标签做目标的,得确保实例已经打上了对应的标签。
- 确认容器端口映射:用
docker ps看看3306端口是不是已经绑定到主机的3306端口了。
内容的提问来源于stack exchange,提问作者Terence Chow
相关产品推荐
相关产品推荐

