对象标记和对象元数据之间的差异



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

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

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

元数据和标记本质上都是"元数据",但在如何使用它们来修改服务的行为以及如何访问它们的值方面存在重要差异。

S3中的一个对象,包括它的元数据,严格来说是不可变的。控制台使您能够"编辑"元数据,但这并不是对正在发生的事情的精确描述。当编辑对象的元数据时,实际上是在用其自身的副本覆盖对象,并修改其元数据。如果对bucket进行了版本控制,那么现在就有了具有两个不同日期和已修改元数据的对象的两个副本。

标记是一个"子资源"——从某种意义上说,是对象的"旁侧"——它们是单独管理的,可以在不修改对象本身的情况下进行修改。

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

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

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

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

每个对象的所有元数据键和值的总和限制为2KB。请注意,限制是以字节表示的,因此多字节字符在达到限制时每个字符消耗超过一个字节。元数据键的数量没有限制,只有用户元数据的2KB总限制。对象元数据键和值中只完全支持US-ASCII字符,元数据必须由作为HTTP标头有效的字符组成,因为对象元数据就是这样发送的。

标签的限制是不同的。每个对象最多可以有10个标签,每个标签键被限制为128个字符(而非字节),每个标签值被限制为256个<字符>[而非字节],尽管如上所述,当标签与PUT请求一起使用时,限制较低。与元数据不同,标签支持UTF-8。

元数据键和值被计算为对对象存储的计费大小有贡献的计费字节。标签用不同的论坛单独计费。

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

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

存储桶/用户/角色上的IAM策略可以出于访问控制目的测试标记值,但不能测试元数据值

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

Bucket生命周期策略可以测试标签值,但不能测试元数据值

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


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

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

最新更新