Google云函数(Python)中的随机连接错误

Google云函数(Python)中的随机连接错误,python,google-cloud-platform,xmlhttprequest,google-cloud-functions,Python,Google Cloud Platform,Xmlhttprequest,Google Cloud Functions,因为在过去的几周里,我的浏览器控制台出现了一些意外的CORS错误,所以我在Google Cloud函数中设置了一个超级简单的Python脚本,其中包含一个函数: def预处理数据请求: 如果request.method==“选项”: 标题={ “访问控制允许来源”:“*”, “访问控制允许方法”:“POST”, “访问控制允许标头”:“内容类型”, “访问控制最大年龄”:“3600” } 返回,204,标题 标题={ “访问控制允许来源”:“*” } 返回,200,标题 它看起来非常类似于谷歌在

因为在过去的几周里,我的浏览器控制台出现了一些意外的CORS错误,所以我在Google Cloud函数中设置了一个超级简单的Python脚本,其中包含一个函数:

def预处理数据请求: 如果request.method==“选项”: 标题={ “访问控制允许来源”:“*”, “访问控制允许方法”:“POST”, “访问控制允许标头”:“内容类型”, “访问控制最大年龄”:“3600” } 返回,204,标题 标题={ “访问控制允许来源”:“*” } 返回,200,标题 它看起来非常类似于谷歌在其网站上提供的功能,但有一个主要区别:我使用的是POST而不是GET

调用函数时,我看到一条成功消息函数执行耗时13毫秒,完成状态代码:约50%的情况下为200,连接错误函数执行耗时11毫秒,所有其他情况下为“连接错误”。每当我在GCF中遇到连接错误时,Chrome的控制台就会记录一个错误:请求的资源上不存在“Access Control Allow Origin”头

我目前正在考虑三个可能的原因:

GCP基础设施。我发现了一些相关的问题,谷歌承认了一些基础设施问题。 Python错误 CORS错误用户sideshowbarker说:非常不可能 问题的原因是什么?如何解决

下面是调用Python脚本的JS代码:

    const xhr = new XMLHttpRequest();
    xhr.open("POST", "[URL]");
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send(stringified_serialized_data);
20年4月2日编辑:

我发现了一种不触发错误的方法:在两个return语句之间添加一些代码。我还没有弄清楚需要什么样的代码,但是d=request.get_json似乎就足够了。新代码如下所示:

def prepData(request):

    if request.method == 'OPTIONS':
        headers = {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'POST',
            'Access-Control-Allow-Headers': 'Content-Type',
            'Access-Control-Max-Age': '3600'
        }
        return ('', 204, headers)

    d = request.get_json() #THIS LINE IS NEW

    headers = {
        'Access-Control-Allow-Origin': '*'
    }
    return ("", 200, headers)
更新

进一步挖掘之后,我们意识到问题实际上是谷歌云功能服务中的一个bug。此错误特别影响使用Python运行时的云函数。这些函数将引发连接错误,如果它们收到的HTTP POST请求的正文大于~10 KB,则返回代码500。但有趣的是,这不会发生在每个具有此类特征的请求中,而是发生在大多数请求中

谷歌支持服务部门被告知了这个问题,他们承认了这个错误。他们创建了应根据解决方案的进度使用附加信息进行更新的解决方案。在撰写本文之日,该问题被标记为新问题

解决方法:正如@Timon所建议的,在函数中调用request.get_json似乎可以解决json体请求的问题。如果请求主体使用不同的格式,则此操作将不起作用

旧答案

我刚刚用您提供的代码建立了一个干净的GC函数,它工作得非常完美。我可以使用你的JS代码通过浏览器发出请求,它们永远不会失败

这给我们留下了两个选择:

您的浏览器或internet连接中存在导致某些请求失败的内容。 您的GCF中存在导致错误的内容。 对于选项1,请选中此项:

失败的请求是否成批出现?还是随机抽样?如果它们成批出现,问题可能是您的internet连接。 您是否使用某种VPN或代理?尝试禁用它。 你试过多种浏览器吗?如果没有,试试看。所描述的行为在所有人身上都是一样的吗? 对于选项2,请选中此选项:

您的函数与您发布的代码完全相同吗?如果没有,并且它有更多的代码,那么问题可能就在那里。 您是否使用一些命令行工具来部署您的功能?是的,请尝试通过GCP网站中的内联编辑器执行此操作。 在高级设置功能的网络设置中,确保选择允许所有流量 更新

进一步挖掘之后,我们意识到问题实际上是谷歌云功能服务中的一个bug。此错误特别影响使用Python运行时的云函数。这些函数将引发连接错误,如果它们收到的HTTP POST请求的正文大于~10 KB,则返回代码500。但有趣的是,这不会发生在每个具有此类特征的请求中,而是发生在大多数请求中

谷歌支持服务部门被告知了这个问题,他们承认了这个错误。他们创建了应根据解决方案的进度使用附加信息进行更新的解决方案。在撰写本文之日,该问题被标记为新问题

解决方法:正如@Timon所建议的,在函数中调用request.get_json似乎可以解决json体请求的问题。如果请求主体使用不同的格式,则此操作将不起作用

旧答案

我刚刚用您提供的代码建立了一个干净的GC函数,它工作得非常完美。我可以使用您的JS代码通过浏览器发出请求 永不失败

这给我们留下了两个选择:

您的浏览器或internet连接中存在导致某些请求失败的内容。 您的GCF中存在导致错误的内容。 对于选项1,请选中此项:

失败的请求是否成批出现?还是随机抽样?如果它们成批出现,问题可能是您的internet连接。 您是否使用某种VPN或代理?尝试禁用它。 你试过多种浏览器吗?如果没有,试试看。所描述的行为在所有人身上都是一样的吗? 对于选项2,请选中此选项:

您的函数与您发布的代码完全相同吗?如果没有,并且它有更多的代码,那么问题可能就在那里。 您是否使用一些命令行工具来部署您的功能?是的,请尝试通过GCP网站中的内联编辑器执行此操作。 在高级设置功能的网络设置中,确保选择允许所有流量
我通过增加分配给云函数的RAM解决了这个问题。发生此问题时,我的内存为512MB。我将它增加到1GB,它开始像一个魔咒一样工作。

我通过增加分配给云功能的RAM来解决这个问题。发生此问题时,我的内存为512MB。我将它增加到1GB,它开始像一个魔咒一样工作。

这看起来不像是一个云函数,它会有一个像def Function\u namerequest这样的签名。你能包括你在这里部署的调用prepData的函数吗?@DustinIngram-Hm,我不太明白你的意思。我目前正在使用内联编辑器。在代码输入字段下面,它表示要执行的函数,我在其中添加了数据。我可以很容易地重命名该函数,也可以重命名请求参数。这就是说,它已经像那样工作了大约一年。明白了,我想json_数据变量名让我很反感。这个变量实际上是一个请求,而不仅仅是JSON数据。明白了,谢谢!这也解释了为什么json_data.method有一个值。我将对此进行研究,并更改参数名称以进行澄清。然而,我认为这与上面描述的主要问题无关。您可以安全地排除CORS是一个可能的原因。问题中显示的CORS配置决不会导致连接错误。所以一般来说,CORS与问题无关。当您收到连接错误时,浏览器记录CORS消息的唯一原因是浏览器在这种情况下得到的响应没有Access Control Allow Origin标头,但这是正常的和预期的。连接错误案例的响应永远不会有Access Control Allow Origin标头。这不像云函数,它会有def Function_namerequest这样的签名。你能包括你在这里部署的调用prepData的函数吗?@DustinIngram-Hm,我不太明白你的意思。我目前正在使用内联编辑器。在代码输入字段下面,它表示要执行的函数,我在其中添加了数据。我可以很容易地重命名该函数,也可以重命名请求参数。这就是说,它已经像那样工作了大约一年。明白了,我想json_数据变量名让我很反感。这个变量实际上是一个请求,而不仅仅是JSON数据。明白了,谢谢!这也解释了为什么json_data.method有一个值。我将对此进行研究,并更改参数名称以进行澄清。然而,我认为这与上面描述的主要问题无关。您可以安全地排除CORS是一个可能的原因。问题中显示的CORS配置决不会导致连接错误。所以一般来说,CORS与问题无关。当您收到连接错误时,浏览器记录CORS消息的唯一原因是浏览器在这种情况下得到的响应没有Access Control Allow Origin标头,但这是正常的和预期的。连接错误案例的响应将永远不会有Access Control Allow Origin标头。非常感谢您帮助我调试代码/设置!在阅读您的答案时,我确实了解了问题的起因:我正在解析函数的字符串化JSON对象。我对它进行了一些研究,通过解析足够大的JSON对象(大于100KB),可以在调用函数时强制出错。几乎每次都会出现错误,但50KB左右就足够了;您应该会看到连接错误警告。我可能遗漏了什么。我是否超过了限制?根据这个页面,我应该很好:哇,看起来你在谷歌云平台上发现了一个bug。m:POST请求的主体大于50KB,有时会失败。如果请求是通过浏览器发出的,这无关紧要。使用邮递员,我得到了相同的错误。这也不是函数中的内存问题。我最终发现问题与他们的Python3.7运行时有关,因为如果改用节点运行时,则不会发生这种情况。我联系了技术支持团队并
他们很快就会给出答案。你有没有收到谷歌的回复?我试着和他们联系,但他们一点帮助都没有。目前正在考虑切换到AWS Lambda。我一直在通过支持服务发送电子邮件,但速度很慢。三天前,他们告诉我这个问题已经转交给了云功能工程团队。同时,您可以尝试使用节点运行时而不是Python,或者按照您的建议切换到AWS Lambda。@Timon我可以确认,使用request.get_json为我解决了这个问题,但仅适用于使用json格式的请求。我用这些信息和从支持服务获得的问题跟踪程序的链接更新了答案。非常感谢您帮助我调试代码/设置!在阅读您的答案时,我确实了解了问题的起因:我正在解析函数的字符串化JSON对象。我对它进行了一些研究,通过解析足够大的JSON对象(大于100KB),可以在调用函数时强制出错。几乎每次都会出现错误,但50KB左右就足够了;您应该会看到连接错误警告。我可能遗漏了什么。我是否超过了限制?根据这个页面,我应该很好:哇,看起来你在谷歌云平台上发现了一个bug。m:POST请求的主体大于50KB,有时会失败。如果请求是通过浏览器发出的,这无关紧要。使用邮递员,我得到了相同的错误。这也不是函数中的内存问题。我最终发现问题与他们的Python3.7运行时有关,因为如果改用节点运行时,则不会发生这种情况。我联系了技术支持团队,他们很快就会提供答案。你有没有收到谷歌的回复?我试着和他们联系,但他们一点帮助都没有。目前正在考虑切换到AWS Lambda。我一直在通过支持服务发送电子邮件,但速度很慢。三天前,他们告诉我这个问题已经转交给了云功能工程团队。同时,您可以尝试使用节点运行时而不是Python,或者按照您的建议切换到AWS Lambda。@Timon我可以确认,使用request.get_json为我解决了这个问题,但仅适用于使用json格式的请求。我用这些信息和从支持服务处获得的问题跟踪者的链接更新了答案。