如何删除在我的云函数中创建的 blob?

How do I delete a blob that was created in my cloud function?

我正在 运行 Great Expectations 验证我存储在 GCS 存储桶中的 .csv 文件。当验证运行时,它会生成一组验证结果和数据文档,它们存储在不同的 GCS 存储桶中。如果验证成功,我想在验证数据的函数中删除这些文件,以保持我的存储桶精简并更易于在其中导航。我一直致力于确定生成的 blob 名称的必要部分,它们是 Great Expectations 中 ValidationResultIdentifier 的属性。但是,当我使用我的 delete_blob 函数时,我收到一个错误,指出该 blob 不存在。看起来该函数正在插入不属于我的命名的额外字符。

这是我的 delete_blob 函数

def delete_blob(bucket_name: str, blob_name: str) -> None:
    """Deletes a blob from a bucket

    Args:
        bucket_name (str): the bucket where the blob is located
        blob_name (str): the blob to be deleted
    """
    storage_client = storage.Client()

    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)
    blob.delete()

以及我正在生成的 json 名称:

    json_name = f'''
    {VALID_RESULTS}/{runName}/{adjTime}/{batch_id[0]}.json'''

实际上我得到了一个 blob 名称

validations/team/2022/1200/randomid.json

当我将存储桶名称和此 blob 名称放入删除 blob 函数时,出现以下错误:

NotFound: 404 DELETE https://storage.googleapis.com/storage/v1/b/bucket/o/%0A%20%20%20%20validations%2Fteam%2F20220421-152311-raw-team-2022-04-21%2015%3A23%3A08.028947-data.csv%2F20220421T152311.141115Z%2Fbdbad345f0b11685beabf7f8a4e12a47.json?prettyPrint=false: No such object: bucket/

我已将 bucket.name 记录到控制台并确认存储桶名称与我尝试访问以删除 blob 的名称匹配。我对 blob 名称本身也做了同样的事情。

我已经验证了用于数据验证的服务帐户具有对 GCS 的完全访问权限,事实上我删除了我正在使用另一个云函数中的 delete_blob 函数处理的 .csv 文件没有问题。我也知道存储桶确实存在,因为该函数会在该存储桶中创建文件。我试图找出错误 URL 的 /o/%0A%20%20%20%20 部分来自哪里,但似乎无法破解那个错误。

问题出在您的 blob 名称上。如果取 %0A%20%20%20%20 部分,则表示 new line followed by 4 space character

所以,正是这样:

    json_name = f'''
    {VALID_RESULTS}/{runName}/{adjTime}/{batch_id[0]}.json'''

像这样更改 json_name 应该可以解决问题

    json_name = f'{VALID_RESULTS}/{runName}/{adjTime}/{batch_id[0]}.json'