云存储文件下载后如何删除?

How to delete a Cloud Storage file after it has been downloaded?

我有一个从云存储中删除文件的云函数

函数:

const { Storage } = require("@google-cloud/storage");
const storage = new Storage();

let handler = async (file, context) => {
    console.log(`  Event: ${context.eventId}`);
    console.log(`  Event Type: ${context.eventType}`);
    console.log(`  Bucket: ${file.bucket}`);
    console.log(`  File: ${file.name}`);

    let bucket = storage.bucket(file.bucket);
    let bucketFile = bucket.file(file.name);

    bucketFile.delete();
};

我想在下载桶中的任何文件后触发此功能。

我查看了 Cloud Storage 触发器,

google.storage.object.finalize (default)

google.storage.object.delete

google.storage.object.archive

google.storage.object.metadataUpdate

但它们没有按照我希望的方式工作。有人有什么建议吗?

编辑:

如果我需要多解释一下我想做什么;无论是否在我们的系统中注册,都会向用户公开其某些数据的链接 public。由于这些链接可能包含敏感数据,我希望获得一次性下载权。单次下载后需要永久删除数据

如果您激活云存储上的审计日志,您可以捕获 get 事件(注意,云存储上的审计日志会产生大量的日志量并且会产生成本)。

激活审核日志后,您可以过滤该方法名称:

methodName: "storage.objects.get"

当然,您可以在 Cloud Logging 上添加其他过滤器,例如在存储桶 and/or 文件 prefix/suffix 上过滤 resourceName(使用 =~ 作为正则表达式)

当你的过滤器正常并且你只得到你期望的条目时,创建一个到 PubSub 的接收器,然后一个 Push PubSub 订阅来调用你的代码(在 Cloud Functions 或 Cloud 运行 上) .

您将收到 Cloud Logging JSON 条目,获取 JSON 中的 resourceName 以了解下载了哪个文件,然后将其删除。

另一种解决方案是使用对象生命周期,您可以在对象创建 1 天(天是最小单位)后自动删除它

您可以在存储桶详细信息页面中找到生命周期设置:

然后您必须添加一个规则,以便在 1 天后删除对象: