谷歌云函数抛出 404 错误

Posted

技术标签:

【中文标题】谷歌云函数抛出 404 错误【英文标题】:Google Cloud Function throwing a 404 error 【发布时间】:2020-05-01 08:00:12 【问题描述】:

我创建了一个云函数,该函数设置为由 Google Cloud Storage 存储桶上的 Finalize/Create 事件触发。

我将 10k 图像转储到存储桶中,并且大多数图像成功运行了 Cloud Function,而有些图像引发了以下异常,我只是对导致此错误的原因感到困惑。

错误返回 404,但是当我检查存储桶时,图像在那里。有没有人有修复以下异常的经验?

由于某种原因,Cloud Function 正在检查一个不存在的目录。

它应该检查以下目录:

https://storage.googleapis.com/download/storage/v1/b/hidden-name/images%2F3683740a95fa3600d4d9a220c9e0b472.jpg

但是,它正在检查以下不存在的目录(/o 文件夹不存在):

https://storage.googleapis.com/download/storage/v1/b/hidden-name/o/images%2F3683740a95fa3600d4d9a220c9e0b472.jpg

这是我得到的例外:

Traceback(最近一次调用最后一次):文件 "/env/local/lib/python3.7/site-packages/google/cloud/storage/blob.py", 第 721 行,在 download_to_file 传输、file_obj、download_url 中, 标头、开始、结束、raw_download 文件 "/env/local/lib/python3.7/site-packages/google/cloud/storage/blob.py", 第 645 行,在 _do_download download.consume(transport) 文件中 "/env/local/lib/python3.7/site-packages/google/resumable_media/requests/download.py", 第 153 行,在使用 self._process_response(result) 文件 "/env/local/lib/python3.7/site-packages/google/resumable_media/_download.py", 第 171 行,在 _process_response 响应中,_ACCEPTABLE_STATUS_CODES, self._get_status_code 文件 "/env/local/lib/python3.7/site-packages/google/resumable_media/_helpers.py", 第 96 行,在 require_status_code *status_codes google.resumable_media.common.InvalidResponse: ('请求失败 状态码', 404, '预期之一', , ) 在处理上述 异常,发生了另一个异常:Traceback(最近一次调用 最后):文件 "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", 第 383 行,在 run_background_function _function_handler.invoke_user_function(event_object) 文件“/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py”, 第 217 行,invoke_user_function 返回 call_user_function(request_or_event) 文件 "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", 第 214 行,在 call_user_function event_context.Context(**request_or_event.context)) 文件 “/user_code/main.py”,第 44 行,在 for_each_new_image 中 create_thumb_move_to_thumbs_bucket(bucket_name,blob_name) 文件 “/user_code/main.py”,第 56 行,在 create_thumb_move_to_thumbs_bucket blob_in_bucket.download_to_filename(download_tmp_filepath) 文件 "/env/local/lib/python3.7/site-packages/google/cloud/storage/blob.py", 第 761 行,在 download_to_filename raw_download=raw_download,文件 "/env/local/lib/python3.7/site-packages/google/cloud/storage/blob.py", 第 724 行,在 download_to_file _raise_from_invalid_response(exc) 文件中 "/env/local/lib/python3.7/site-packages/google/cloud/storage/blob.py", 第 2161 行,在 _raise_from_invalid_response raise exceptions.from_http_status(response.status_code,消息, 响应=响应)google.api_core.exceptions.NotFound:404 GET https://storage.googleapis.com/download/storage/v1/b/hidden-name/o/images%2F3683740a95fa3600d4d9a220c9e0b472.jpg?alt=media: ('请求失败,状态码',404,'预期之一', , )

云函数入口方法:

def for_each_new_image(event, context):   
    blob_name = event['name'].lower()
    bucket_name = event['bucket']   
    create_thumb_move_to_thumbs_bucket(bucket_name,blob_name)

引发错误的方法:

def create_thumb_move_to_thumbs_bucket(bucket_name,blob_name):     
    bucket = _storage_client.get_bucket(bucket_name)
    blob_in_bucket = bucket.blob(blob_name)

    blob_name = blob_name.replace("ugc_images/","")    
    thumbnail_filename = blob_name.replace(".","-sm.")

    thumbnail_tmp_filepath = '/tmp/'.format(thumbnail_filename)       
    download_tmp_filepath = '/tmp/'.format(blob_name)    

    blob_in_bucket.download_to_filename(download_tmp_filepath)

引发错误的行:

blob_in_bucket.download_to_filename(download_tmp_filepath)

【问题讨论】:

您是否曾两次上传同一个文件?即使它被覆盖,Object Finalize 也会触发。如果我点击第二个 URL,它会显示 "error": "code": 400, "message": "Only media downloads requests can be sent to /download/*. Re-send request to the same path, but without /download 前缀。", "errors": [ "message": "只有媒体下载请求可以发送到 /download/*。重新发送请求到相同的路径,但没有 /download 前缀。", "域”:“全局”,“原因”:“notDownload” ] @VikramShinde 不,所有独特的图像。我也将 URL 设为虚拟,这意味着它们不是实时的 您能与我们分享您的代码吗? @Chris32 我没有添加所有代码行,而是添加了引发异常的方法/行:“blob_in_bucket.download_to_filename(download_tmp_filepath)” 您能否添加足够的代码以使其可重现。这也将为我们提供更多背景信息以提供帮助 【参考方案1】:

我遇到了同样的错误。 我试图访问存储桶中不存在的文件。

【讨论】:

以上是关于谷歌云函数抛出 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

谷歌云功能 - Sendgrid 443 错误 [重复]

从谷歌云功能排队大量任务

谷歌云函数快速入门

谷歌云函数:返回有效的 JSON

如何将值从谷歌云函数(firebase)传递到前端?

谷歌云抛出错误:无法在 Nodejs 中加载默认凭据