【问题标题】:Using a wildcard on S3 Event Notification prefix在 S3 事件通知前缀上使用通配符
【发布时间】:2020-10-08 21:10:02
【问题描述】:

我有一个 Lambda 函数,它为上传到我的存储桶的每个图像创建一个缩略图,然后将缩略图放在另一个存储桶中。当我上传用户图片(个人资料图片)时,我使用用户 IDname 作为密钥的一部分:

System-images/users/250/john_doe.jpg

有没有办法在prefix 路径中使用通配符?这是我到目前为止所拥有的,但它不起作用

【问题讨论】:

标签: amazon-s3


【解决方案1】:

不,你不能——这是一个文字前缀

在您的示例中,您可以使用这些前缀中的任何一个,具体取决于存储桶中的其他内容(如果有些东西共享您不想匹配的公共前缀):

System-images/
System-images/users/

【讨论】:

  • 你说得对,我最终改用后缀并为jpgpngjpeg 创建了许多事件通知。 lambda 函数只会针对这些文件类型触发。
【解决方案2】:

Lambda 的前缀/后缀过滤器中的通配符不受支持,并且永远不会支持,因为星号 (*) 是可用于 S3 对象键名称的有效字符。但是,您可以通过在 Lambda 函数中添加过滤器以某种方式解决此问题。例如:

首先,获取源密钥:

var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

然后,检查它是否在users 文件夹内:

if (srcKey.indexOf('/users/') === -1) {
    callback('Not inside users folder!');
    return;
}

【讨论】:

  • 我的通配符用例是因为我们的文件夹结构是1/<country>/users/name/<filename>.json。国家会随着时间的推移而扩大,所以我不可能列出所有国家,它是不可扩展的。目前,我正在使用您的解决方案,但这会导致太多不必要的触发器,如用户和名称文件夹中的 lambda,还有其他我不关心的 .json 文件。想到一个 SNS,但可能有点矫枉过正。
  • @ChickenWing24 如果这对您来说仍然是个问题,那么针对该特定文件夹结构的一种可能的解决方法是使用后缀通知并使用将触发事件的临时 .json。显然,这并不理想,但它可能是您感兴趣的。将您的文件写入 1//users/name/.tmp-s3-suffix-uuid1.json 然后您的 s3 通知将需要过滤后缀“.tmp-s3-suffix-uuid1.json”,您的函数需要在处理后将文件移动到 .json。
  • 这是一个有趣的解决方案。谢谢@AidanHoolachan。我不再从事该项目,但会将其传递给我的同事。
  • 如果我最终为数百万个我可以用正则表达式本身忽略的文件调用这个 lambda(即使只是检查对象键),这个解决方案仍然会受到伤害。我相信 S3 触发器应该支持使用通配符的其他方式,即使不是这种格式,因为它们有限制。
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2021-11-21
  • 2017-12-13
  • 2015-03-13
  • 2012-10-15
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多