标准环境下的 GCP:MySQL 数据库连接被拒绝

2024-03-18

我的目标是让一个可用的 Python 2.7 项目(MySQL + MS Word 文件)在 GCP 上工作。 我意识到我需要

  1. App Engine - 应用程序将在其中运行(缩放等)。
  2. Cloud SQL working as MySQL db. For that I've followed that Cloud SQL for MySQL tut https://cloud.google.com/appengine/docs/standard/python/cloud-sql/using-cloud-sql-mysql and
    • Cloud SQL 实例的创建方式为root user.
    • App Engine 应用和 Cloud SQL 实例位于同一项目中。
  3. 云储存

SQL二代实例创建成功并显示root用户已设置。

我如何运行或部署

我使用 Cloud Shell 来测试该应用 -dev_appserver.py $PWD并从 Cloud Shell 部署应用程序 -gcloud app deploy. 它适用于 appspot.com https://coral-heuristic-215610.appspot.com/直到我尝试在其中使用 MySQL 连接。

MySQL连接

MySQL连接代码取自here https://cloud.google.com/appengine/docs/standard/python/cloud-sql/using-cloud-sql-mysql#code_sample_overview:

import MySQLdb
import webapp2    

CLOUDSQL_CONNECTION_NAME = os.environ.get('CLOUDSQL_CONNECTION_NAME')
CLOUDSQL_USER = os.environ.get('CLOUDSQL_USER')
CLOUDSQL_PASSWORD = os.environ.get('CLOUDSQL_PASSWORD')    
DB_NAME='test-db'
def connect_to_cloudsql():
    # When deployed to App Engine, the `SERVER_SOFTWARE` environment variable
    # will be set to 'Google App Engine/version'.
    if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
        # Connect using the unix socket located at
        # /cloudsql/cloudsql-connection-name.
        cloudsql_unix_socket = os.path.join(
            '/cloudsql', CLOUDSQL_CONNECTION_NAME)

        db = MySQLdb.connect(
            unix_socket=cloudsql_unix_socket,
            user=CLOUDSQL_USER,
            passwd=CLOUDSQL_PASSWORD)

    # If the unix socket is unavailable, then try to connect using TCP. This
    # will work if you're running a local MySQL server or using the Cloud SQL
    # proxy, for example:
    #
    #   $ cloud_sql_proxy -instances=your-connection-name=tcp:3306
    #
    else:
        db = MySQLdb.connect(
            host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD, db=DB_NAME)

    return db
db = connect_to_cloudsql()

变量设置在app.yaml:

runtime: python27
api_version: 1
threadsafe: true
env_variables:
    CLOUDSQL_CONNECTION_NAME: coral-heuristic-215610:us-central1:db-basic-1
    CLOUDSQL_USER: root
    CLOUDSQL_PASSWORD: xxxxx

当应用程序在测试模式下运行时dev_appserver.py $PWD我选择使用 MySQL 连接,但出现错误:

ERROR    2018-09-13 08:37:42,492 wsgi.py:263]
Traceback (most recent call last):
  ...
  File "/home/.../mysqldb.py", line 35, in connect_to_cloudsql
    host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 204, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (2003, 'Can\'t connect to MySQL server on \'127.0.0.1\' (111 "Connection refused")')

云 SQL 代理

我已下载并运行适用于 Win-64 的云代理(https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe)但问题仍然存在...似乎代理后台应用程序仅用于从我的本地计算机连接到 Cloud SQL。

您无需使用代理或配置 SSL 即可从 App Engine 标准或灵活环境连接到 Cloud SQL。 (source https://cloud.google.com/sql/docs/mysql/sql-proxy#what_the_proxy_provides)

为什么连接被拒绝?

我应该使用第一代 Cloud sql 实例来简化与 App Engine 的连接吗?

Update 1

我在 Cloud Console 中编辑代码,到目前为止 Cloud Console 运行良好。

Update 2

我已成功使用 Cloud Shell 连接到 sql 实例:

(coral-heuristic-215610)$ gcloud sql connect db-basic-1 --user=root

Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 48841
Server version: 5.7.14-google-log (Google)
MySQL [(none)]>

Update 3

The 对类似问题发表评论 https://github.com/GoogleCloudPlatform/getting-started-python/issues/129#issuecomment-367348828涉及的地区云 SQL 实例 and 应用程序引擎应用程序应该是,即在同一地区.

就我而言,我检查过:

  • 要连接到的 Cloud SQL 实例:美国中央1-a
  • 应用程序引擎应用程序:美国中央银行

这些是同一个地区的吗?- 结果是一个地区的这些.

Update 4

我本可以想出打开数据库连接:

DB connection: <_mysql.connection open to '127.0.0.1' at 7f628c02bc00>

但这似乎仅在我使用同一项目打开另一个 Cloud Shell 实例后才发生(珊瑚-启发式-215610)。在那个实例中,我开始连接到 SQL 实例并且成功:

(coral-heuristic-215610)$ gcloud sql connect db-basic-1 --user=root

Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:

我猜第一个cloud shell实例开始连接到db是因为第二个实例已将我的 IP 列入白名单,不是吗?


GAE 应用和 Google Cloud SQL 实例必须部署在同一区域如果您使用的是 MySQL 第一代 https://cloud.google.com/sql/docs/mysql/connect-app-engine#gaev1-csqlv1,否则,我验证了只要您使用 MySQL 第二代,它们就可以位于不同的区域。

我无法理解您试图从哪里进行连接。我假设您想使用代理从 Google Cloud Shell 进行连接,云SDK凭证 https://cloud.google.com/sql/docs/mysql/connect-admin-proxy#service-account。根据有关文件云 SQL 代理 https://cloud.google.com/sql/docs/mysql/sql-proxy:

Cloud SQL 代理提供对 Cloud SQL Second 的安全访问 生成实例,无需将 IP 地址列入白名单或 配置 SSL。

Cloud SQL 代理的工作原理是拥有一个称为代理的本地客户端, 在本地环境中运行。您的应用程序与 具有您的数据库使用的标准数据库协议的代理。 代理使用安全隧道与其同伴进行通信 进程在服务器上运行。

请记住,由于您没有部署应用程序,因此它没有使用您在 app.yaml 中建立的环境变量。因此,您必须在本地计算机中自行导出并设置它们:

export CLOUDSQL_CONNECTION_NAME=your-connection-name
export CLOUDSQL_USER=root
export CLOUDSQL_PASSWORD=xxxxx

通过执行以下操作验证它们是否已设置echo $CLOUDSQL_CONNECTION_NAME。当您部署应用程序时gcloud app deploy,这不是必需的,因为 GAE 设置 app.yaml 中指定的任何环境变量。

在尝试建立连接之前必须启动代理these https://cloud.google.com/sql/docs/mysql/connect-admin-proxy steps:

下载代理:

wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy

授予其执行权限:

chmod +x cloud_sql_proxy

启动代理替换<INSTANCE_CONNECTION_NAME>与您的 Cloud SQL 实例连接名称:

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306

你应该在最后看到类似这样的内容:

 2018/11/09 13:24:32 Rlimits for file descriptors set to {&{8500 1048576}} 
 2018/11/09 13:24:35 Listening on 127.0.0.1:3306 for my-project:cloud-sql-region:cloud-sql-name 
 2018/11/09 13:24:35 Ready for new connections

此时,您可以连接到从 Google 本地运行的代理Cloud Shell 实例 https://cloud.google.com/shell/docs/starting-cloud-shell,这会将您连接到 Cloud SQL 实例。

再开一个Cloud Shell 会话 https://cloud.google.com/shell/docs/using-the-session-window#opening_multiple_sessions(或选项卡)并启动您的代码python myapp.py。您将连接到本地运行的代理。您还可以通过运行来测试连接mysql -h 127.0.0.1 --user=root -p.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准环境下的 GCP:MySQL 数据库连接被拒绝 的相关文章

  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho
  • 从脚本内更改自动热键托盘图标

    如何从 Autohotkey 脚本中将托盘图标更改为 my ico 例如 当脚本暂停时 为此 我在托盘菜单中提出了自己的 暂停脚本 菜单项 SingleInstance ignore Menu Tray Tip AutoCase 0 11
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕
  • 我们什么时候应该在 Django 中使用“db_index=True”?

    当我们应该定义db index True在模型字段上 我正在尝试优化应用程序并且我想了解更多信息db index 什么情况下我们应该使用它 文档说使用db index True在模型字段上用于加速查找 但在存储和内存方面略有缺点 我们应该使
  • 如何制作过期/签名视频嵌入网址

    我是新来的 正在学习网络开发等等 我只知道如何将我的视频嵌入网站中 任何菜鸟都可以轻松获得源代码 他们也可以嵌入它 但在许多网站中 视频 src 均使用重定向器链接进行编码 例如 它会在一段时间后过期 在本例中是一天 我了解到这是一个签名网
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code
  • 如何在 kubernetes 中将秘密标记为可选?

    来自文档 除非将秘密标记为可选 否则必须先创建秘密 然后再将其作为环境变量在 pod 中使用 引用不存在的 Secret 将阻止 pod 启动 如何将秘密标记为可选 您正在寻找的是 name ENV NAME valueFrom secre
  • 一些基本的 PHP 问题 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是有一些基本的 php 问题来加深我对学习的理解 但我找不到简单的答案 我有一个 php ajax 应用程序 它生成 mysql
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g
  • View.post(),以及当Runnables被执行时

    我最初的问题是需要知道我的根的高度和宽度View这样我就可以进行程序化的布局更改 就我的目的而言 我不一定需要在onCreate 对于我来说 以编程方式添加我的孩子就足够了View根布局完成后 因此我很乐意使用onWindowFocusCh
  • SimpleIoC - 在缓存中找不到类型:Windows.UI.Xaml.Controls.Frame

    第一次由 SimpleIoC 实例化我的 ViewModel 时 我遇到了以下错误 我相信我已经按应有的方式设置了容器 但由于某种原因 我仍然收到以下错误 任何想法或帮助将非常感激 Microsoft Practices ServiceLo
  • svn 强制迁移

    我正在考虑将我们的 svn 代码库迁移到 perforce 看看谷歌搜索结果 我确实找到了两个具有相同功能的工具 P4转换ftp ftp perforce com pub perforce tools p4convert docs inde
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于
  • React 错误:目标容器不是 DOM 元素

    我刚刚开始使用 React 所以这可能是一个非常简单的错误 但我们开始吧 我的html代码非常简单 load staticfiles
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用
  • PLS-00103:遇到符号“;”当预期出现以下情况之一时:

    我正在尝试插入用户安全问题的答案 以用于密码重置功能 Ellucian 横幅 v8 提供了一个用于运行此 API 的 API 我对他们的 API 非常陌生 从下面的错误消息来看 我还远远没有正确运行它 任何帮助表示赞赏 我尝试在 Oracl
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁
  • 如何使用 dql 从数据表中获取唯一值?

    我有一个表 其中有一列存储了各种值 我想使用 dql 从该表中检索唯一值 Doctrine Query create gt select rec school gt from Records rec gt where rec city ci

随机推荐

  • 用于加载 Ionic / Cordova 应用程序外部的外部链接

    我正在开发一个 Ionic Cordova 应用程序 在其中加载有时包含外部链接的提要和新闻 我需要在应用程序外部加载这些外部链接 而不是在 InAppBrowser 中 而是在手机浏览器中 是否可以将此作为所有链接的默认行为 为了使用相应
  • 无法在 eclipse 中创建 Maven 项目

    我在企业防火墙后面的 Windows 7 计算机上安装了 Eclipse Luna 和 Maven 3 2 3 尝试从原型创建项目会导致以下错误 无法从任何配置的存储库解析原型 org apache maven archetypes mav
  • Lucene 中的关键字(OR、AND)搜索

    我在我的门户 基于 J2EE 中使用 Lucene 来提供索引和搜索服务 问题出在Lucene的关键字上 当您在搜索查询中使用其中之一时 您会收到错误消息 例如 searchTerms ik OR jij 这工作正常 因为它会搜索 ik o
  • 从 JSON 中插入 HTML 选择标签选项

    所以 事情是这样的 我有一个 JSON 对象保存在我的 web 应用程序的 localStorage 中 此 JSON 被保存为字符串 其中JSON stringify 在我的函数之一内 在页面加载上 localStorage setIte
  • socket.io的emit函数中允许使用数组吗?

    是否可以发送对象数组socket io发出函数 例如 io emit message data 123 data 456 Yes it is 您可以发送几乎任何类型 并且可以将任何类型嵌套在另一种类型中 Strings Numbers 12
  • 为什么匿名类型实例不能接受实体框架查询返回的空值?

    当我尝试运行以下实体框架查询时 var l from s in db Samples let action db Actions Where x gt s SampleID x SampleID x ActionTypeID 1 First
  • 如何存储/计算单个簇大小并在 NetLogo 中绘制它们

    我有一个生成黄色斑块簇的模型 我有兴趣查看簇大小的频率分布 为此 我从 NetLogo 代码库中的 补丁集群示例 中选择了代码 它似乎在查找簇方面起作用 参见下面的照片 尽管我希望它不计算簇中的绿色斑块 但我不知道如何获取大小 或斑块计数
  • 关于 printf 语句的混淆

    所以我正在运行这段代码 include
  • Android:使用 Gradle 构建,使用 Maven 签名

    我的 Android 构建在持续集成中运行良好 但 androidSigning 除外 Gradle 可以允许开发人员清晰地捕获密钥库路径和密码 这并不令人满意 1 你有解决方法吗 比如密码加密 2 我现在的想法是使用 Gradle 进行构
  • 自动递增第二列[重复]

    这个问题在这里已经有答案了 我有一个有 2 列的表 ID 列自动递增 我正在尝试自动增加与 ID 相同的用户列id列 但带有 user 前缀 例如 user100 其中 ID 也是 100 基本上就像 stackoverflow 上所做的那
  • 具有拉伸对齐功能的 Flexbox 容器中垂直居中的 div

    我需要将一个 div 放在 Flex 容器中 并保持该 div 的整个容器的高度 显然 我有align items stretch用于保持高度或align items center用于定心块 Flexbox 模型将 div 居中并保持父容器
  • 在 React 中切换类

    我正在将 React 用于一个有菜单按钮的项目 a href i i a 还有一个 Sidenav 组件 例如
  • 2 个纬度/经度点(坐标)列表之间的地理/地理空间距离

    我有 2 个列表 list1 list2 以及各个地点的纬度 经度 一份清单 list2 的地点名称list1不具有 我也想要 list1 中每个点的近似位置 所以我想指出一点list1 尝试寻找最近的点list2并采取该地点 我对其中的每
  • 将 .class 转换为 .java

    我有一些 class 文件需要转换为 java 所以我这样做了 javap c ClassName class 我一直有同样的错误 ERROR Could not find ClassName class 你们知道可能是什么原因吗 我做了
  • GPUImage iOS 中未显示文本叠加

    我正在尝试在视频上叠加一些文本 但到目前为止还没有取得任何成功 videoCamera GPUImageStillCamera alloc initWithSessionPreset AVCaptureSessionPreset640x48
  • 如何解决一般错误:2006 MySQL 服务器已消失

    我正在执行一项操作 将数百条记录插入 MySQL 数据库 插入 176 条记录后 我收到此错误 PDOException SQLSTATE HY000 一般错误 2006 MySQL 服务器已消失 我有什么办法可以解决这个问题吗 该过程是使
  • 如何在Java中对ArrayList进行排序[重复]

    这个问题在这里已经有答案了 我有一个名为 水果 的课程 我正在创建此类的列表 并将每种水果添加到列表中 我想根据水果名称的顺序对这个列表进行排序 public class Fruit private String fruitName pri
  • 在模型中的belongs_to中使用委托时出现“未初始化常量”错误

    我正在使用三个表的模型实现一个视图 其中一个是连接表 以下是表格 Recipe class Recipe lt ActiveRecord Base validates name presence gt true validates dire
  • 如何正确重复使用卷曲手柄

    我想正确地重用卷曲句柄 这样它就不会给我错误并正常运行 假设我有这段代码 CURL curl curl global init CURL GLOBAL ALL curl curl easy init curl easy setopt cur
  • 标准环境下的 GCP:MySQL 数据库连接被拒绝

    我的目标是让一个可用的 Python 2 7 项目 MySQL MS Word 文件 在 GCP 上工作 我意识到我需要 App Engine 应用程序将在其中运行 缩放等 Cloud SQL working as MySQL db For