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

时间:2017-02-09 00:51:40

标签: amazon-s3

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

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

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

1 个答案:

答案 0 :(得分:83)

元数据和标签基本上都是"元数据"但是他们如何(或不能)用来修改服务的行为以及他们的价值如何(或不能)被访问的方式存在重大差异。

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

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

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

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

当您x-amz-meta-*一个对象时,实际的元数据将在HTTP响应头中返回。这意味着如果用户知道如何检查HTTP标头,则下载对象的用户可以看到元数据。

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

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

limits on tags are different。每个对象最多可以有10个标签,每个标签键限制为128个字符(不是字节),每个标签值限制为256个字符(不是字节),虽然限制较低,但如上所述,当标签与x-amz-tagging-count:请求一起运行时。

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

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

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

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

IAM策略condition keys允许对对象based on tags进行访问控制。没有基于元数据的类似访问控制功能。

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

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

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

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