首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >云函数在连接到Cloud时“拒绝连接”

问云函数在连接到Cloud时“拒绝连接”
EN

Stack Overflow用户
提问于 2018-11-15 18:37:17
回答 3查看 4.4K关注 0票数 5

我正试图与Google提供的示例一起使用Python和一个MySQL实例将云函数脚本连接到Cloud。

我在项目中创建了一个Cloud实例,然后创建了一个云函数,在这个函数中,我将整个脚本从链接粘贴到内联编辑器中。我将环境变量设置为连接到Cloud所需的变量,但我得到了一个错误。

为了让这件事成功,我有什么明显的遗漏吗?

错误:函数崩溃。详细信息:(2003年,“无法连接到'localhost‘上的MySQL服务器(Errno 111连接被拒绝)”) 回溯(最近一次调用):文件"/env/local/lib/python3.7/site-packages/pymysql/connections.py",行582,位于connect **kwargs)文件"/opt/python3.7/lib/python3.7/socket.py",第727行,在create_connection raise“/opt/python3.7/lib/python3.7/socket.py”中,第716行,在create_connection sock.connect(sa) ConnectionRefusedError中: Errno 111连接在处理上述异常时被拒绝,另一个例外情况发生:回溯(最近一次调用):文件"/user_code/main.py",第49行,在mysql_demo mysql_conn = pymysql.connect(**mysql_config)文件第94行,在连接返回连接(*args,**kwargs)文件"/env/local/lib/python3.7/site-packages/pymysql/connections.py",行327,在"/env/local/lib/python3.7/site-packages/pymysql/connections.py",init self.connect() init self.connect() 629行中,在Connection raise exc pymysql.err.OperationalError:(2003年,“无法连接到'localhost‘上的MySQL服务器”(Errno 111连接被拒绝)“)处理上述异常时,发生了另一个异常:跟踪(最近一次调用):文件"/env/local/lib/python3.7/site-packages/pymysql/connections.py",行570,在connect "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py",(self.unix_socket) ConnectionRefusedError: Errno 111连接在处理上述异常时被拒绝,发生了另一个异常:回溯(最近一次调用):文件sock.connect第297行,在run_http_function结果= _function_handler.invoke_user_function(flask.request)文件"/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py",行199,在"/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py",invoke_user_function返回call_user_function(request_or_event)文件第192行,在call_user_function返回self._user_function(request_or_event)文件"/user_code/main.py",第53行,在连接返回连接(*args,**kwargs)文件"/env/local/lib/python3.7/site-packages/pymysql/init.py",第327行,在pymysql.connect(**mysql_config)文件"/env/local/lib/python3.7/site-packages/pymysql/connections.py",行94中,在init self.connect() File "/env/local/lib/python3.7/site-packages/pymysql/connections.py",第629行中,在connect exc pymysql.err.OperationalError:(2003年,“无法连接到'localhost‘上的MySQL服务器(Errno 111连接被拒绝)”)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-11 14:07:46

非常重要的信息:

在开始之前,您需要使用GCP将角色添加到云功能服务帐户。服务帐户信息可以在云函数的常规选项卡中找到。在你完成这个动作之后,你应该可以走了。如果没有,请尝试向云功能服务帐户添加更多的角色,比如项目编辑器。

对于代码参考,(只有部分要更改)

代码语言:javascript
复制
# TODO(developer): specify SQL connection details  
CONNECTION_NAME = getenv(
'INSTANCE_CONNECTION_NAME',
'proj-chatbot-og:us-central1:your connection name')
# Please don't change the name on the left like MYSQL_USER
DB_USER = getenv('MYSQL_USER', 'your user name')
DB_PASSWORD = getenv('MYSQL_PASSWORD', 'your password')
DB_NAME = getenv('MYSQL_DATABASE', 'your sql database')


mysql_config = {
'user': DB_USER,
'password': DB_PASSWORD,
'db': DB_NAME,
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor,
'autocommit': True
}

完整的文档可以在这里找到https://cloud.google.com/functions/docs/sql

如果你发现解决了你的问题,请投票。

票数 4
EN

Stack Overflow用户

发布于 2018-11-30 20:20:10

我也遇到了同样的问题,在和谷歌来回穿梭之后,这个问题终于为我解决了。

示例显示以下try子句:

代码语言:javascript
复制
if not mysql_conn:
    try:
        mysql_conn = pymysql.connect(**mysql_config)
    except OperationalError:
        # If production settings fail, use local development ones
        mysql_config['unix_socket'] = f'/cloudsql/{CONNECTION_NAME}'
        mysql_conn = pymysql.connect(**mysql_config)

我把它改成:

代码语言:javascript
复制
if not mysql_conn:
    mysql_config['unix_socket'] = f'/cloudsql/{CONNECTION_NAME}'
    mysql_conn = pymysql.connect(**mysql_config)

并使用(data, context)作为函数参数,而不是(request)。

这就是我最终作为一个测试函数得到的结果:

代码语言:javascript
复制
from os import getenv

import pymysql
from pymysql.err import OperationalError

CONNECTION_NAME = getenv(
  'INSTANCE_CONNECTION_NAME',
  'connection_name')
DB_USER = getenv('MYSQL_USER', 'username')
DB_PASSWORD = getenv('MYSQL_PASSWORD', 'password')
DB_NAME = getenv('MYSQL_DATABASE', 'database')

mysql_config = {
  'user': DB_USER,
  'password': DB_PASSWORD,
  'db': DB_NAME,
  'charset': 'utf8mb4',
  'cursorclass': pymysql.cursors.DictCursor,
  'autocommit': True
}

if getenv('NODE_ENV', '') == 'production':
    mysql_config['unix_socket'] = f'/cloudsql/{CONNECTION_NAME}'

# Create SQL connection globally to enable reuse
# PyMySQL does not include support for connection pooling
mysql_conn = None


def __get_cursor():
    """
    Helper function to get a cursor
    PyMySQL does NOT automatically reconnect,
    so we must reconnect explicitly using ping()
    """
    try:
        return mysql_conn.cursor()
    except OperationalError:
        mysql_conn.ping(reconnect=True)
        return mysql_conn.cursor()


def mysql_demo(data, context):
    global mysql_conn

    # Initialize connections lazily, in case SQL access isn't needed for this
    # GCF instance. Doing so minimizes the number of active SQL connections,
    # which helps keep your GCF instances under SQL connection limits.
    if not mysql_conn:
        mysql_conn = pymysql.connect(**mysql_config)

    # Remember to close SQL resources declared while running this function.
    # Keep any declared in global scope (e.g. mysql_conn) for later reuse.
    with __get_cursor() as cursor:
        cursor.execute('SELECT NOW() as now')
        results = cursor.fetchone()
        return str(results['now'])
票数 0
EN

Stack Overflow用户

发布于 2021-09-10 13:48:00

同样的问题,但是

  1. 应用程序引擎标准与PostgreSQL
  2. 与运行在项目A中的应用程序代码相比,在不同的项目B中运行的云SQL。

的底层问题看上去就像一样的。

遵循本教程到点(同样,这是针对Postgres,而不是MySQL),因此使用来自这里的示例代码,该解决方案使事情几乎立即工作(没有注意到配置延迟):

  • 在项目A的IAM & Admin部分查找主要服务帐户的电子邮件地址;它应该具有@appspot.gserviceaccount.com格式
  • 在项目B中,在IAM & Admin下添加一行,将此电子邮件地址作为主体和角色Cloud客户端

本教程讲述的是

如果授权服务帐户属于与Cloud实例不同的项目,则需要为两个项目添加和IAM权限。

我确实将Cloud和Cloud添加到两个项目中,但没有给项目A中的服务帐户任何与Cloud相关的权限--如果这就是本教程所讨论的。

上面的意思是,如果Cloud和应用程序代码都在同一个项目中运行,那么向项目的服务帐户中添加Cloud客户端角色就足够了。(正如@Zou建议的那样,角色Cloud并不是必需的,但也应该工作。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53325928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档