我在Google App Engine Flexible Environment中运行了一个dotnet core 2.0应用程序 . 在同一个Google项目中,我有一个Cloud SQL - MySQL数据库 . 在Cloud SQL Instance详细信息页面的“授权”选项卡下,它指出
此项目中的应用程序:全部授权 .
但是,除非我将 0.0.0.0/0
路由添加到授权网络部分,否则我无法从我的应用程序访问数据库 .
如何在不向全世界打开数据库的情况下为我的应用程序数据库访问提供什么?
Update 2018-05-21 from Jeffery Rennie (accepted answer)
App Engine现在支持使用端口号而不是unix域套接字连接到Cloud SQL实例 . 所以现在,您可以在 app.yaml
中添加这样的内容:
beta_settings:
cloud_sql_instances: "your-project-id:us-central1:instance-name=tcp:5432"
并在appsettings.json中的连接字符串中指定 Host=cloudsql
:
"ConnectionString": "Uid=aspnetuser;Pwd=;Host=cloudsql;Database=visitors"
在上面的示例中,端口是5432,这是PostgreSQL数据库的默认端口 . 对于MySQL数据库,请使用端口3306 .
可以在此处找到有关部署到App Engine的说明的完整示例:
https://github.com/GoogleCloudPlatform/dotnet-docs-samples/tree/master/appengine/flexible/CloudSql
2 回答
理想的解决方案是使用unix domain socket从您的应用引擎实例连接到Cloud SQL . 这就是像Python和PHP这样的其他编程语言 . 不幸的是,MySQL connector不适用于域套接字 . 我认为没有理由为什么它可以't, but it doesn't . 我希望他们能尽快解决这个问题 .
如https://cloud.google.com/appengine/kb/#static-ip所述,
如果证书不足以保护您的应用程序,那么我今天看到的唯一剩余选项是构建一个运行Cloud SQL Proxy的custom runtime . 代理可以将本地IP端口号转发到unix域套接字 . 如果您已经构建了一两个图像,那么它也不会太糟糕 .
随着情况的改善,我会更新这个答案 .
Update 2018-05-21
App Engine现在支持使用端口号而不是unix域套接字连接到Cloud SQL实例 . 所以现在,您可以在
app.yaml
中添加这样的内容:并在appsettings.json中的连接字符串中指定
Host=cloudsql
:在上面的示例中,端口是5432,这是PostgreSQL数据库的默认端口 . 对于MySQL数据库,请使用端口3306 .
可以在此处找到有关部署到App Engine的说明的完整示例:
https://github.com/GoogleCloudPlatform/dotnet-docs-samples/tree/master/appengine/flexible/CloudSql
虽然你没有错,“这个项目中的应用程序:所有授权的”似乎建议你可以开箱即用,只需将你的App Engine应用程序与Cloud SQL一起使用,但是有一些限制 .
首先,您的Cloud SQL需要是2nd generation instance,其次,specific instructions依赖于您使用的语言和App Engine类型(标准或flex) .
如果您的情况符合所有要求,它应该有效 .
对于您的特定用例,您需要.Net instructions,它确实说您需要添加具有0.0.0.0/0访问权限的网络和用户帐户 . 用户身份验证SSL应提供您所需的安全性 .