我在尝试使用 Blob.rewrite() 方法将文件从一个 Google Cloud Storage 存储桶复制到 Google Cloud Function 中的另一个存储桶时遇到“NotFound”错误。我收到的错误消息如下:
NotFound: 404 POST https://storage.googleapis.com/storage/v1/b/ca-app-corp-finance-dev-444/o/process%2Ffin_essbase%2Fdata%2Fincoming%2Fessbase%2Fkey.ppk/rewriteTo/b/gcf-v2-uploads-632430838198-us-east1/o/key.ppk?prettyPrint=false: No such object: ca-app-corp-finance-dev-444/process/fin_essbase/data/incoming/essbase/key.ppk
这是我的设置和问题的详细描述:
我设置了一个 Google Cloud 函数,只要有新文件上传到源存储桶 (gcf-v2-uploads-632430838198-us-east1),该函数就会触发。 目的是将上传的文件复制到特定路径 process/fin_essbase/data/incoming/essbase/ 下的目标存储桶 (ca-app-corp-finance-dev-444)。 为了实现这一点,我在函数中使用了 Blob.rewrite() 方法。 以下是我在 Cloud Function 中的 Python 代码的摘录:
from google.cloud import storage
def transfer_file(data, context):
source_bucket_name = "gcf-v2-uploads-632430838198-us-east1"
destination_bucket_name = "ca-app-corp-finance-dev-444"
target_path = "process/fin_essbase/data/incoming/essbase/"
filename = "key.ppk"
storage_client = storage.Client()
source_bucket = storage_client.bucket(source_bucket_name)
destination_bucket = storage_client.bucket(destination_bucket_name)
source_blob = source_bucket.blob(filename)
destination_blob = destination_bucket.blob(target_path + filename)
# Check if the destination blob already exists
if destination_blob.exists():
print(f"Destination blob {destination_blob.name} already exists.")
else:
try:
# Perform a rewrite operation to copy the content
token = source_blob.rewrite(destination_blob)
# Wait for the rewrite to complete
token.result()
# Delete the source blob
source_blob.delete()
print(f"File {filename} transferred successfully.")
except Exception as e:
print(f"An error occurred: {e}")
我已验证源存储桶中源对象是否存在,并确保存储桶名称和文件路径准确。与云功能关联的服务帐户具有从源存储桶读取和写入目标存储桶的必要权限。
尽管如此,我还是遇到了“NotFound”错误。是否存在任何潜在的错误配置或其他因素导致此问题?我希望获得有关如何排查和解决此问题的见解或指导。
在 Google Cloud Function 中尝试使用
NotFound
方法在存储桶之间复制文件时,您可能会看到 Blob.rewrite()
错误,以下可能的原因如下:
您要复制的文件可能尚未位于目标存储桶中。除非缺少,否则
Blob.rewrite()
方法不会创建它。如果您确定该文件应该在那里,请在使用 Blob.rewrite() 之前尝试自己制作它。
云函数使用的服务帐号可能不允许将文件添加到目标存储桶。要检查这一点,请转到 Cloud Console,找到链接到您的 Cloud Function 的服务帐号,然后查看它是否有权在目标存储桶中查看和创建对象。
云函数连接到目标存储桶的方式可能存在问题。您可以通过在 Cloud Shell 中运行命令来查看这一点:
gcloud compute instances describe INSTANCE_NAME | grep network
这可以帮助您查看云功能是否与存储桶位于同一网络上。如果没有,它可能无法到达桶。 gcloud 计算实例描述
如果您确保目标文件存在,服务帐户具有正确的权限,并且不存在网络问题,则
Blob.rewrite()
方法可能存在错误。如果是这种情况,您可以通过报告问题来告知 Google Cloud 支持。
以下是一些可能有用的额外链接: