【问题标题】:Google Cloud Function - Cloud storage object overwritten eventGoogle Cloud Function - 云存储对象覆盖事件
【发布时间】:2018-07-24 19:16:18
【问题描述】:

我有一个设置为由云存储桶触发的云功能。

有没有办法判断一个事件是由新上传的对象触发还是被覆盖的对象触发?

我尝试控制台注销事件对象,但似乎没有任何迹象表明该对象是否已被覆盖。

我注意到 Cloud Pub/Sub Notifications 中存在一个“overwroteGeneration”属性,此处的触发事件基于该属性,但此处不可用。

【问题讨论】:

    标签: google-cloud-storage google-cloud-functions


    【解决方案1】:

    正如@Doug Stevenson 所说,似乎没有简单的方法可以实现这一点。此外,我一直在玩metageneration,根据this example in the documentation(在“你上传了一个新版本的图像 "),当一个对象被覆盖时(即使versioning is enabled),它会得到自己新的generationmetageneration编号,原因为什么,正如您在对另一个答案的评论中评论的那样,metageneration = 1 在这种情况下。

    我看到的唯一解决方法可能无法满足您的特定要求,即使用两个云函数(我们称它们为 funcAfuncB),一个(funcA) 使用google.storage.object.finalize 标识对象创建,另一个 (funcB) 使用google.storage.object.archivegoogle.storage.object.delete 检测对象覆盖(取决于您是否使用版本控制,分别)。在这种情况下,funcA 将被触发两次,因为对于对象覆盖它也会被触发,但是根据您的用例,您可以识别 create时间的接近度> 和 删除 事件并检测到这些事件检测到单个事件:

    funcA 日志:

    funcB 日志:

    我知道这并不能完全解决您发布的问题,但我认为没有任何方法可以使用单个云函数来识别对象已被创建或覆盖,看起来您需要一个每个过程的云函数。

    【讨论】:

      【解决方案2】:

      为了确定文件上传的性质(新文件上传而不是现有文件上传),需要使用事件并传递给函数来判断。

      您需要使用Object Finalize 事件类型。正如您从那里的文档中看到的那样:

      创建新对象(或现有对象)时发送此事件 被覆盖,并创建该对象的新一代)在 桶。

      从该文档中不太清楚的是,metageneration 与事件的 resourceState 属性相结合是指标。

      documentation here 应该清楚如何使用元生成和 resourceState 来确定对存储桶的更改是新文件还是替换文件:

      resourceState 属性应与“元代”配对 属性,如果你想知道一个对象是否刚刚创建。这 每当发生更改时,元生成属性就会递增 对象的元数据。对于新对象,元生成值为 1。

      【讨论】:

      • 我确实得到了一个对象完成事件类型。但是,对于新文件和现有文件上传,元生成都是 1(并且 resourceStates 不适用于 object.finalize,仅适用于 object.change):(
      猜你喜欢
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 2018-02-12
      相关资源
      最近更新 更多