我正在尝试从另一个项目上的App Engine应用程序访问存储在一个Cloud Platform项目中的Google Cloud SQL实例,但它无法正常工作。
与SQL实例的连接失败,并显示以下错误:OperationalError: (2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 38")
我按照Google文档中的说明操作,将第二个项目的App Engine服务帐户添加到容纳Cloud SQL实例的项目的IAM权限列表中(以“Cloud SQL Editor”作为角色)。我在我的应用程序中使用的连接详细信息和配置与在与Cloud SQL实例位于同一项目中的功能完善的App Engine应用程序中使用的相同。
关于我的配置似乎唯一的一点是,在我的第二个GCP项目中,当看起来像默认的App Engine服务帐户([MY-PROJECT-NAME]@appspot.gserviceaccount.com
)出现在IAM权限列表中时,此服务帐户未列在“服务帐户”选项卡下IAM和管理员列出的唯一服务帐户是Compute Engine default service account
。我没有删除任何服务帐户;这里没有列出App Engine默认服务帐户,但除了MySQL连接外,App Engine应用程序运行正常。
不确定它是否相关,但我在App Engine标准环境上运行Python 2.7应用程序,使用MySQLdb连接。
最终想出来 - 也许这对遇到同样问题的其他人有用。
问题:
问题在于,“Cloud SQL Editor”角色不是我所想象的“Cloud SQL Client”的超集; “Cloud SQL Editor”允许管理Cloud SQL实例,但不允许与数据库的基本连接。
解:
删除授予Cloud SQL编辑器权限的IAM条目并将其替换为授予Cloud SQL Client权限的权限可修复该问题并允许数据库连接通过。