对象标签和对象元数据之间的区别?

585*_*nor 48 amazon-s3

我正在寻找一种方法,在上传过程中将小块数据(来自我的服务器)包含在对象中(例如用户ID,文件ID等).在查看S3文档之后,我不确定将此数据作为对象标记或对象元数据包含在内是否更合适.

标签的目的是分类吗?每个对象数据的元数据?

有什么区别?您认为哪种情况更适合这种情况?

Mic*_*bot 106

元数据和标签本质上都是"元数据",但在如何(或不能)用于修改服务行为以及如何访问(或不能)访问其值方面存在重要差异.

S3中的对象(包括其元数据)严格来说是不可变的.控制台使您能够"编辑"元数据,但这并不能准确描述正在发生的事情.编辑对象的元数据时,实际上是使用自身的副本覆盖对象,并修改其元数据.如果存储桶已进行版本控制,则您现在拥有两个具有两个不同日期和已修改元数据的对象副本.

标签是一个"子资源" - 在某种意义上,"在一边"是一个对象 - 它们是单独管理的,可以在不修改对象本身的情况下进行修改.

PUT创建对象时,元数据作为HTTP标头包含在请求中. 通过发送第二个请求来存储标签.完全支持下面的计数和大小限制的标记,需要向?taggingAPI端点上的子资源发送第二个请求,但PUT(对象)REST调用对标记的支持也有限,允许最多2K的url编码,查询要在单个x-amz-taggingHTTP PUT请求标头中提交的参数样式标记键和值.例如,x-amz-tagging: hipaa_restrict=false&pci_restrict=true&owner=Accounting%20and%20Payroll.关于2K是否包括标头名称的字节长度本身,或者该2K是否与x-amz-meta-*用户元数据标签相同2K,文档不清楚.据推测,它是两个不同的2K限制,但2K标记限制可能包括键和值的url编码形式,以及标题的长度.

您可以通过策略单独控制IAM用户是否可以读取或写入对象+元数据或标记.对象和元数据在权限中一起处理(如果您可以执行一个,您可以始终处理另一个),但标记是单独的权限.

当您GET是对象时,实际元数据将在HTTP响应标头中返回.这意味着如果用户知道如何检查HTTP标头,则下载对象的用户可以看到元数据.

相反,标题不会在标题中返回以响应GET请求; 相反,只x-amz-tagging-count:返回标题,如果它不为零,则报告对象上的标记数.但请注意,虽然标签更适合存储专有数据,但它们不适合存储未加密的敏感数据.

每个对象的所有元数据键和值的总和限制为2KB.请注意,限制以字节为单位表示,因此多字节字符每个字符占用的字符数超过一个字节.元数据键的数量没有限制 - 只有2KB的用户元数据总限制.

标签限制是不同的.每个对象最多可以有10个标签,每个标签键限制为128个字符(不是字节),每个标签值限制为256个字符(不是字节),尽管限制较低,如上所述,当标签骑行时随着PUT请求.

元数据键和值被计为可计费字节,这些字节有助于对象存储的计费大小.标签分别与不同的论坛进行结算.

标签和元数据都不能用于"扫描"对象.无法向S3服务请求具有特定标签或特定元数据的对象列表.

标签可用于修改服务的行为,至少有两种重要的方式,元数据不能(事实上,这里可能是我目前没有想到的其他方式):

存储桶/用户/角色的IAM策略可以测试标记值以进行访问控制,但无法测试元数据值.

IAM策略条件键允许基于标签对对象进行访问控制.没有基于元数据的类似访问控制功能.

存储桶生命周期策略可以测试标记值,但不能测试元数据值.

生命周期策略可用于修改对象的存储类(到标准/不频繁访问或冰川)或在可配置的时间间隔后清除对象或版本.在引入对象标记之前,这些规则应用于整个存储桶或某个前缀,例如images/.现在,标签允许基于对象标签应用生命周期策略,因此(例如)瞬态数据可以与永久数据混合,同时以不同方式应用生命周期策略,而无需将对象存储在不同的密钥层次结构中以进行前缀匹配.


在问题中描述的情况下,我倾向于将这些值存储在元数据中,除非它们在HTTP响应头中可见这一事实是您认为安全问题.

如果将S3与CloudFront结合使用,则可以使用Lambda @ Edge Origin Response触发器从运行中的响应中编辑或删除对象元数据,以使浏览器看不到它们.Origin Response触发器是一个用Node.js编写的Lambda函数,它可以在响应存储在CloudFront缓存之前以编程方式修改响应,这意味着它只需要在缓存未命中时运行.通过EC2中的代理服务器(例如HAProxy或Nginx)将请求路由到存储桶也可以实现类似的功能,但是如果直接访问存储桶则不能.S3服务将始终返回HTTP响应标头中的元数据,但它仅在下载对象时返回标签计数(如果对象具有标签)而不返回标签本身.

  • 很彻底 谢谢! (2认同)
  • 虽然您在比较和概述标签和元数据之间的差异方面做得很好,但我最终不同意您关于存储 OP 特定数据的位置的结论。用户 ID 应该放在标签中,因为标签更加灵活并且具有更大的实用性。我可以创建一个 S3 策略,根据对象标签中的用户 ID 来限制对文件的访问,但如果用户 ID 位于元数据中,我就无法执行此操作。这有效地允许我通过用户 ID 进行“搜索”。 (2认同)