

# 组织、列出和处理对象
<a name="organizing-objects"></a>

在 Amazon S3 中，您可以使用前缀来组织存储。前缀是存储桶中对象的逻辑分组。前缀值类似于允许您将相似数据存储在存储桶内同一目录下的目录名称。以编程方式上传对象时，可以使用前缀来组织数据。

在 Amazon S3 控制台中，前缀称为文件夹。您可以通过导航到存储桶，在 S3 控制台中查看所有对象和文件夹。您还可以查看有关每个对象的信息，包括对象属性。

有关在 Amazon S3 中列出和组织数据的更多信息，请参阅以下主题。

**Topics**
+ [使用前缀组织对象](using-prefixes.md)
+ [以编程方式列出对象键](ListingKeysUsingAPIs.md)
+ [使用文件夹在 Amazon S3 控制台中整理对象](using-folders.md)
+ [在 Amazon S3 控制台中查看对象属性](view-object-properties.md)
+ [使用标签对对象进行分类](object-tagging.md)

# 使用前缀组织对象
<a name="using-prefixes"></a>

您可以使用前缀来组织存储在 Amazon S3 存储桶中的数据。前缀是对象键名称开头的一串字符串。前缀可以是任意长度，取决于对象键名称的最大长度（1024 个字节）。您可以把前缀视为一种以类似于目录的方式组织数据的方式。但是，前缀不是目录。

按前缀搜索会将结果限制为仅以指定前缀开头的这些键。分隔符导致列表操作将共享公共前缀的所有键汇总到单个汇总列表结果中。

前缀和分隔符参数的目的是帮助您按层次结构组织，然后浏览您的键。要执行此操作，首先为您的存储桶选取一个分隔符，例如，斜杠（/），它不会出现在任何预期的键名中。您可以使用另一个字符作为分隔符。斜杠 (/) 字符没有什么独特之处，它是一个非常常见的前缀分隔符。接下来，通过串联所有包含层次结构的级别，并使用分隔符分隔每个级别来构建您的键名。

例如，如果您正在存储关于城市的信息，您可以按大陆、按国家/区域，然后按省份或州来自然地组织他们。因为这些名称通常不包含标点符号，您可以使用斜杠 (/) 作为分隔符。下面的示例使用斜杠 (/) 分隔符。
+ Europe/France/Nouvelle-Aquitaine/Bordeaux
+ North America/Canada/Quebec/Montreal
+ North America/USA/Washington/Bellevue
+ North America/USA/Washington/Seattle

如果您采用此方式来存储世界上每个城市的数据，那么管理平面键命名空间会很困难。通过使用带列表操作的 `Prefix` 和 `Delimiter`，您可以使用已创建的层次结构来列出您的数据。例如，要列出美国的所有州，请设置 `Delimiter='/'` 和 `Prefix='North America/USA/'`。要列出您拥有数据的所有加拿大省份，请设置 `Delimiter='/'` 和 `Prefix='North America/Canada/'`。

有关分隔符、前缀和嵌套文件夹的更多信息，请参阅[前缀和嵌套文件夹之间的区别](https://repost.aws/knowledge-center/s3-prefix-nested-folders-difference)。

## 使用前缀和分隔符列出对象
<a name="prefixes-list-example"></a>

如果您使用分隔符发布列表请求，您可以仅浏览一个级别的层次结构、跳过或总结嵌套在更深级别的键（可能是数百万）。例如，假设您拥有具有以下键的存储桶（*amzn-s3-demo-bucket*）：

`sample.jpg` 

`photos/2006/January/sample.jpg` 

`photos/2006/February/sample2.jpg` 

`photos/2006/February/sample3.jpg` 

`photos/2006/February/sample4.jpg` 

示例存储桶仅拥有根级 `sample.jpg` 对象。要仅列出存储桶中的根级对象，您需要向存储桶发送带正斜杠（`/`）分隔符的 GET 请求。作为响应，Amazon S3 将返回 `sample.jpg` 对象密钥，因为它不包含 `/` 分隔符。所有其他键都包含分隔符。Amazon S3 将组合这些密钥，并在指定的分隔符首次出现时，返回带前缀值 `photos/` 的单个 `CommonPrefixes` 元素（它是这些密钥开头的子字符串）。

**Example**  

```
 1. <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
 2.   <Name>amzn-s3-demo-bucket</Name>
 3.   <Prefix></Prefix>
 4.   <Marker></Marker>
 5.   <MaxKeys>1000</MaxKeys>
 6.   <Delimiter>/</Delimiter>
 7.   <IsTruncated>false</IsTruncated>
 8.   <Contents>
 9.     <Key>sample.jpg</Key>
10.     <LastModified>2011-07-24T19:39:30.000Z</LastModified>
11.     <ETag>&quot;d1a7fb5eab1c16cb4f7cf341cf188c3d&quot;</ETag>
12.     <Size>6</Size>
13.     <Owner>
14.       <ID>75cc57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
15.     </Owner>
16.     <StorageClass>STANDARD</StorageClass>
17.   </Contents>
18.   <CommonPrefixes>
19.     <Prefix>photos/</Prefix>
20.   </CommonPrefixes>
21. </ListBucketResult>
```

有关以编程方式列出对象键的更多信息，请参阅 。[以编程方式列出对象键](ListingKeysUsingAPIs.md)

# 以编程方式列出对象键
<a name="ListingKeysUsingAPIs"></a>

在 Amazon S3 中，键可以按前缀列出。您可以为相关键的名称选择通用前缀，然后使用分隔层次结构的特殊字符标记这些键。然后，您可以使用列表操作按层次选择和浏览键。这类似于在文件系统的目录中存储文件的方式。

Amazon S3 公开了列表操作，允许您列出包含在存储桶中的键。将按存储桶和前缀选择用于列表的键。例如，假设一个存储桶的名称为“`dictionary`”，它为每个英语词汇包含了一个键值。您可能会创建一个调用来列出该存储桶中以字母“q”开头的存储桶。列表结果始终以 UTF-8 二进制顺序返回。

 SOAP 和 REST 列表操作将返回一个 XML 文档，其中包含匹配键值的名称和有关由每个键值识别的对象的信息。

**注意**  
 Amazon S3 的 SOAP API 不适用于新客户，并将于 2025 年 8 月 31 日接近使用寿命终止（EOL）。我们建议您使用 REST API 或 AWS 软件开发工具包。

出于列表目的，可以根据通用前缀收拢那些共享一个前缀并且以特定分隔符终结的键组。这允许应用程序按层次结构组织和浏览键值，与您在文件系统的目录中组织文件的方式相同。

例如，要扩展字典存储桶以包含除英语单词外的更多内容，您可以使用语言和分隔符为每个单词添加前缀（例如，“`French/logical`”），从而构成键值。使用此命名方案和层级列表特征，您可以检索仅包含法语词汇的列表。您也可以浏览可用语言的顶级列表，而无需循环浏览所有按字典顺序排列的干预键。有关列表的此方面的更多信息，请参阅 [使用前缀组织对象](using-prefixes.md)。

**REST API**  
如果您的应用程序需要它，则可以直接发送 REST 请求。您可以发送 GET 请求来返回存储桶中的某些或所有对象，或者您也可以使用选择条件来返回存储桶中对象的子集。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [GET Bucket (List Objects) 版本 2](https://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html)。

**列表执行效率**  
存储桶中的密钥总数不会对列表性能产生重大影响。它也不因是否存在 `prefix`、`marker`、`maxkeys` 或 `delimiter` 参数而受到影响。

**循环访问多页结果**  
由于存储桶可以包含几乎无限数量的键，列表查询的完整结果可能会非常大。为了管理大型结果集，Amazon S3 API 支持分页，以将它们分割为多个响应。每个列出键响应将返回一个拥有多达 1000 个键的页面，同时使用指示器来指示响应是否存在截断。您可以发送一系列的列出键请求，直到您收到了所有的键。AWSSDK 包装库提供相同的分页。

## 示例
<a name="ListingKeysUsingAPIs_examples"></a>

在列出存储桶中的所有对象时，请注意，您必须拥有 `s3:ListBucket` 权限。

------
#### [ CLI ]

**list-objects**  
以下示例使用 `list-objects` 命令显示指定存储桶中所有对象的名称：  

```
aws s3api list-objects --bucket text-content --query 'Contents[].{Key: Key, Size: Size}'
```
该示例使用 `--query` 参数筛选 `list-objects` 的输出，使其范围缩小到每个对象的键值和大小  
有关对象的更多信息，请参阅 [使用 Amazon S3 中的对象](uploading-downloading-objects.md)。  
+  有关 API 详细信息，请参阅《AWS CLI 命令参考》**中的 [ListObjects](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/list-objects.html)。

**ls**  
下面的示例通过使用 `ls` 命令列出了存储桶中的所有对象和前缀。  
要使用此示例命令，请将 **amzn-s3-demo-bucket** 替换为您存储桶的名称。  

```
$ aws s3 ls s3://amzn-s3-demo-bucket
```
+  有关高级命令 `ls` 的更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[列出存储桶和对象](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-listing-buckets)。

------
#### [ PowerShell ]

**Tools for PowerShell V4**  
**示例 1：此命令检索有关存储桶“test-files”中所有项目的信息。**  

```
Get-S3Object -BucketName amzn-s3-demo-bucket
```
**示例 2：此命令从存储桶“test-files”中检索有关项目“sample.txt”的信息。**  

```
Get-S3Object -BucketName amzn-s3-demo-bucket -Key sample.txt
```
**示例 3：此命令从存储桶“test-files”中检索有关前缀为“sample”的所有项目的信息。**  

```
Get-S3Object -BucketName amzn-s3-demo-bucket -KeyPrefix sample
```
+  有关 API 详细信息，请参阅《AWS Tools for PowerShell Cmdlet Reference (V4)》**中的 [ListObjects](https://docs.aws.amazon.com/powershell/v4/reference)。

**适用于 PowerShell V5 的工具**  
**示例 1：此命令检索有关存储桶“test-files”中所有项目的信息。**  

```
Get-S3Object -BucketName amzn-s3-demo-bucket
```
**示例 2：此命令从存储桶“test-files”中检索有关项目“sample.txt”的信息。**  

```
Get-S3Object -BucketName amzn-s3-demo-bucket -Key sample.txt
```
**示例 3：此命令从存储桶“test-files”中检索有关前缀为“sample”的所有项目的信息。**  

```
Get-S3Object -BucketName amzn-s3-demo-bucket -KeyPrefix sample
```
+  有关 API 详细信息，请参阅《AWS Tools for PowerShell Cmdlet Reference (V5)》**中的 [ListObjects](https://docs.aws.amazon.com/powershell/v5/reference)。

------

# 使用文件夹在 Amazon S3 控制台中整理对象
<a name="using-folders"></a>

在 Amazon S3 通用存储桶中，对象是主要资源，并且对象存储在存储桶中。Amazon S3 通用存储桶具有扁平结构，而不是类似于您在文件系统中看到的层次结构。不过，为了实现组织简易性，Amazon S3 控制台支持将*文件夹*概念作为对象分组手段。控制台通过为分组对象使用共享名称*前缀*来实现此目的。换句话说，分组对象的名称以一个公用字符串开头。这个公用字符串或共享前缀是文件夹名称。对象名称也称为*键名称*。

例如，您可以通过控制台在通用存储桶中创建名为 `photos` 的文件夹，并在其中存储名为 `myphoto.jpg` 的对象。随后，将使用键名 `photos/myphoto.jpg` 存储对象，其中 `photos/` 为前缀。

以下是另外两个示例：
+ 如果通用存储桶中有三个对象：`logs/date1.txt`、`logs/date2.txt` 和 `logs/date3.txt`，则控制台会显示名为 `logs` 的文件夹。如果您在控制台中打开该文件夹，将看到三个对象：`date1.txt`、`date2.txt` 和 `date3.txt`。
+ 如果您有名为 `photos/2017/example.jpg` 的对象，则控制台会显示名为 `photos` 的文件夹，其中包含文件夹 `2017`。文件夹 `2017` 包含对象 `example.jpg`。

文件夹中可以有文件夹，但存储桶中不能有存储桶。可以直接将对象上传和复制到一个文件夹中。可以创建和删除文件夹以及将文件夹设为公用，但不能对文件夹进行重命名。可以将对象从一个文件夹复制至另一个文件夹。

**重要**  
当您在 Amazon S3 控制台中创建文件夹时，S3 将创建一个 0 字节对象。此对象键设置为您提供的文件夹名称加上尾随的正斜杠 (`/`) 字符。例如，在 Amazon S3 控制台中，如果您在存储桶中创建一个名为 `photos` 的文件夹，Amazon S3 控制台将使用键 `photos/` 创建一个 0 字节的对象。控制台创建这个对象是为了支持文件夹的概念。  
此外，任何使用尾部正斜杠字符 (`/`) 命名的预先存在的对象都将显示为 Amazon S3 控制台中的文件夹。例如，具有键名称 `examplekeyname/` 的对象在 Amazon S3 控制台中显示为文件夹，而不显示为对象。否则，其行为与任何其它对象一样，可以通过 AWS Command Line Interface（AWS CLI）、AWS SDK 或 REST API 进行查看和操作。此外，您无法使用 Amazon S3 控制台上传键名称中有尾部正斜杠字符 (`/`) 字符的对象。但是，通过使用 AWS Command Line Interface（AWS CLI）、AWS SDK 或 REST API，可以上传名称中有尾部正斜杠字符 (`/`) 的对象。  
此外，Amazon S3 控制台不像对待其它对象那样显示文件夹对象的内容和元数据。当使用控制台复制名称中有尾部正斜杠字符 (`/`) 的对象时，将在目标位置创建一个新文件夹，但不会复制对象的数据和元数据。此外，对象键名称中的正斜杠 (`/`) 可能需要特殊处理。有关更多信息，请参阅 [为 Amazon S3 对象命名](object-keys.md)。

要在目录存储桶中创建文件夹，请上传文件夹。有关更多信息，请参阅 [将对象上传到目录存储桶](directory-buckets-objects-upload.md)。

**Topics**
+ [创建文件夹](#create-folder)
+ [将文件夹设为公用](#public-folders)
+ [计算文件夹大小](#calculate-folder)
+ [删除文件夹](#delete-folders)

## 创建文件夹
<a name="create-folder"></a>

本部分介绍如何使用 Amazon S3 控制台创建文件夹。

**重要**  
如果存储桶策略阻止在没有标签、元数据或访问控制列表（ACL）被授权者的情况下将对象上传到此存储桶，则您无法使用以下过程创建文件夹。而应改为上传空文件夹，并在上传配置中指定以下设置。

**如何创建文件夹**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要在其中创建文件夹的存储桶的名称。

1. 在**对象**选项卡上，选择**创建文件夹**。

1. 输入文件夹的名称（例如，**favorite-pics**）。
**注意**  
文件夹名称受某些限制和准则的约束，并且被视为对象的对象键名称的一部分，该名称限制为 1024 字节。有关更多信息，请参阅 [为 Amazon S3 对象命名](object-keys.md)。

1. （可选）如果存储桶策略要求使用特定的加密密钥对于对象进行加密，则在**服务器端加密**下，您必须在创建文件夹时选择**指定加密密钥**并指定相同的加密密钥。否则，文件夹创建将失败。

1. 请选择 **Create folder**（创建文件夹）。

## 将文件夹设为公用
<a name="public-folders"></a>

我们建议禁止所有对 Amazon S3 文件夹和存储桶的公有访问，除非您特别需要公有文件夹或存储桶。当您将文件夹设为公有时，Internet 上的任何人都可以查看该文件夹中分组的所有对象。

在 Amazon S3 控制台中，您可以将文件夹设为公有。您还可以通过创建存储桶策略来将文件夹设为公有，该策略通过前缀限制数据访问权限。有关更多信息，请参阅 [Amazon S3 的身份和访问管理](security-iam.md)。

**警告**  
在 Amazon S3 控制台中将文件夹设为公有后，就不能再将其设为私有。而是必须对公有文件夹中的每个单独的对象设置权限，以使对象不具备公有访问。有关更多信息，请参阅 [配置 ACL](managing-acls.md)。

**Topics**
+ [创建文件夹](#create-folder)
+ [将文件夹设为公用](#public-folders)
+ [计算文件夹大小](#calculate-folder)
+ [删除文件夹](#delete-folders)

## 计算文件夹大小
<a name="calculate-folder"></a>

本节介绍如何使用 Amazon S3 控制台计算文件夹的大小。

**计算文件夹的大小**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在**通用存储桶**列表中，选择在其中存储文件夹的存储桶的名称。

1. 在**对象**列表中，选中文件夹名称旁边的复选框。

1. 选择 **Actions**（操作），然后选择 **Calculate total size**（计算总大小）。

**注意**  
在您导航离开该页面后，文件夹信息（包括总大小）不再可用。如果您想再次看到总大小，则必须再次计算该值。

**重要**  
当您对存储桶中的指定对象或文件夹使用 **Calculate total size**（计算总大小）操作时，Amazon S3 会计算对象总数和总存储大小。但是，在对象总数或总大小中并不计算未完成或正在进行的分段上传以及以前或非当前的版本。此操作仅针对存储在存储桶中的每个对象的当前或最新版本计算对象总数和总大小。  
例如，如果存储桶中有某个对象的两个版本，则 Amazon S3 中的存储计算器仅将它们计为一个对象。因此，在 Amazon S3 控制台中计算的对象总数可能不同于 S3 Storage Lens 存储统计管理工具中显示的**对象计数**指标以及 Amazon CloudWatch 指标 `NumberOfObjects` 报告的数量。同样，总存储大小也可能不同于 S3 Storage Lens 存储统计管理工具中显示的 **Total Storage**（总存储）指标和 CloudWatch 中显示的 `BucketSizeBytes` 指标。

## 删除文件夹
<a name="delete-folders"></a>

本节介绍如何使用 Amazon S3 控制台从 S3 存储桶中删除文件夹。

有关 Amazon S3 特征和定价的信息，请参阅 [Amazon S3](https://aws.amazon.com/s3/)。



**要从 S3 存储桶中删除文件夹**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在**通用存储桶**列表中，选择要从中删除文件夹的存储桶的名称。

1. 在**对象**列表中，选中您要删除的文件夹和对象旁的复选框。

1. 选择**删除**。

1. 在**删除对象**页面上，验证您选择删除的文件夹和对象的名称是否列在**指定的对象**下。

1. 在 **Delete objects (删除对象)** 框中，输入 **delete**，然后选择 **Delete objects (删除对象)**。

**警告**  
此操作将删除所有指定的对象。删除文件夹时，请等待删除操作完成，然后再将新对象添加到文件夹。否则，新对象也可能会被删除。

# 在 Amazon S3 控制台中查看对象属性
<a name="view-object-properties"></a>

您可以使用 Amazon S3 控制台查看对象的属性，包括存储类、加密设置、标签和元数据。

**查看对象的属性**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**或**目录存储桶**。

1. 在存储桶列表中，选择包含对象的存储桶的名称。

1. 在 **Objects**（对象）列表中，请选择要查看其属性的对象的名称。

   对象的 **Object overview**（对象概述）将打开。您可以向下滚动以查看对象属性。

1. 在**对象概述**页面上，您可以查看或配置对象的以下属性。
**注意**  
如果您更改**存储类**、**加密**或**元数据**属性，则将创建一个新对象来替换旧对象。如果启用 S3 版本控制，则会创建对象的新版本，而现有对象将变为旧版本。更改属性的角色也会成为新对象或（对象版本）的拥有者。
如果您要更改具有用户定义标签的对象的**存储类别**、**加密**或**元数据**属性，您必须拥有 `s3:GetObjectTagging` 权限。如果您要对没有用户定义标签但大小超过 16 MB 的对象更改这些属性，您还必须拥有 `s3:GetObjectTagging` 权限。  
如果目标存储桶策略拒绝 `s3:GetObjectTagging` 操作，则将更新对象的这些属性，但将从对象中移除用户定义的标签，并且您将收到错误。

   1. **Storage class (存储类)** – Amazon S3 中的每个对象都有与之关联的存储类。您选择使用的存储类取决于您访问对象的频率。通用存储桶中 S3 对象的默认存储类是 STANDARD。目录存储桶中 S3 对象的默认存储类是 S3 Express One Zone。您可以选择在上传对象使用的存储类。有关存储类的更多信息，请参阅 [了解和管理 Amazon S3 存储类](storage-class-intro.md)。

      要在将对象上传到通用存储桶后更改存储类，请选择**存储类**。请选择您希望的存储类，然后选择 **Save**（保存）。
**注意**  
目录存储桶中对象的存储类无法更改。

   1. **服务器端加密设置** – 您可以使用服务器端加密来加密 S3 对象。有关更多信息，请参阅 [使用 AWS KMS (SSE-KMS) 指定服务器端加密](specifying-kms-encryption.md) 或 [指定具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）](specifying-s3-encryption.md)。

   1. **元数据** – Amazon S3 中的每个对象都有一组表示其元数据的名称/值对。有关将元数据添加到 S3 对象的信息，请参阅[在 Amazon S3 控制台中编辑对象元数据](add-object-metadata.md)。

   1. **标签**：您可以通过向通用存储桶中的 S3 对象添加标签来对存储进行分类。有关更多信息，请参阅 [使用标签对对象进行分类](object-tagging.md)。

   1. **对象锁定依法保留和保留**：您可以防止通用存储桶中的对象被删除。有关更多信息，请参阅 [使用对象锁定以锁定对象](object-lock.md)。

# 使用标签对对象进行分类
<a name="object-tagging"></a>

使用对象标签对存储进行分类。每个标签都是一个键-值对。

您可以将标签添加到新对象（当您上传新对象时），也可以将标签添加到现有对象。
+ 您最多可以将 10 个标签与对象关联。与对象关联的标签必须具有唯一的标签键。
+ 标签键的长度最大可以为 128 个 Unicode 字符，标签值的长度最大可以为 256 个 Unicode 字符。Amazon S3 对象标签在内部以 UTF-16 表示。请注意，采用 UTF-16 时，字符占用 1 或 2 个字符位置。
+ 键和值区分大小写。
+ 有关标签限制的更多信息，请参阅《AWS 账单与成本管理用户指南》**中的 [User-defined tag restrictions](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/custom-tags.html#allocation-tag-restrictions)。有关基本标签限制，请参阅《Amazon EC2 用户指南》**中的[标签限制](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-restrictions)。

**示例**  
请考虑以下标签示例：

**Example PHI 信息**  
假设某个对象包含受保护医疗信息 (PHI) 数据。您可以使用以下键/值对标记该对象。  

```
PHI=True
```
或  

```
Classification=PHI
```

**Example 项目文件**  
假设您将项目文件存储在 S3 桶中。您可以使用一个名为 `Project` 的键和一个值标记这些对象，如下所示。  

```
Project=Blue
```

**Example 多个标签**  
您可以将多个标签添加到一个对象，如下所示。  

```
Project=x
Classification=confidential
```

**键名前缀和标签**  
您还可以使用对象键名前缀来分类存储。但是，基于前缀的分类是一维的。请考虑以下对象键名：

```
photos/photo1.jpg
project/projectx/document.pdf
project/projecty/document2.pdf
```

这些键名具有前缀 `photos/`、`project/projectx/` 和 `project/projecty/`。这些前缀支持一维分类。即，一个前缀下的一切都属于一个类别。例如，前缀 `project/projectx` 可确定与项目 x 相关的所有文档。

利用标签，您现在获得了另一个维度。如果您希望 photo1 属于项目 x 类别，则可以相应地标记该对象。

**其他优势**  
除了数据分类之外，标签还提供了下列好处：
+ 对象标签支持权限的精细访问控制。例如，您可以向用户授予仅读取带有特定标签的对象的权限。
+ 对象标签支持精细的对象生命周期管理，在其中，除了在生命周期规则中指定键名前缀之外，还可以指定基于标签的筛选条件。
+ 使用 Amazon S3 分析时，您可以配置筛选条件，以便按对象标签、键名前缀或前缀和标签的组合对对象进行分组以进行分析。
+ 您还可以自定义 Amazon CloudWatch 指标以按特定标签筛选条件显示信息。以下各节提供了详细信息。

**重要**  
使用标签来标记包含机密数据（如 personally identifiable information (PII) 或受保护医疗信息 (PHI)）的对象是可以接受的。但标签本身不应包含任何机密信息。

**通过单个请求将对象标签集添加到多个 Amazon S3 对象**  
要使用单个请求向多个 Amazon S3 对象添加对象标签集，您可以使用 S3 分批操作。您为 S3 批量操作提供要操作的对象列表。S3 批量操作调用相应的 API 操作来执行指定的操作。单个批量操作任务可对包含 EB 级数据的数十亿个对象执行指定操作。

S3 批量操作特征包括跟踪进度、发送通知并存储所有操作的详细完成报告，从而提供完全托管、可审核的无服务器体验。您可以通过 Amazon S3 控制台、AWS CLI、AWS SDK 或 REST API 使用 S3 批量操作。有关更多信息，请参阅 [S3 批量操作基础知识](batch-ops.md#batch-ops-basics)。

有关对象标签的更多信息，请参阅 [管理对象标签](tagging-managing.md)。

## 与对象标签相关的 API 操作
<a name="tagging-apis"></a>

Amazon S3 支持特定于对象标签的以下 API 操作：

**对象 API 操作**
+  [PUT 对象标签](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTtagging.html) – 替换对象上的标签。您可以在请求正文中指定标签。使用此 API 的对象标签管理有两个不同的情形。
  + 对象没有标签 - 利用此 API，您可以将一组标签添加到某个对象 (该对象没有以前的标签)。
  + 对象有一组现有标签 - 要修改现有标签，您必须先检索现有标签集，在客户端侧修改它，然后使用此 API 替换它。
**注意**  
 如果您发送带有空标签集的此请求，Amazon S3 将删除对象上的现有标签集。如果您使用此方法，则将需为套餐 1 请求 (PUT) 付费。有关更多信息，请参阅 [Amazon S3 定价](https://d0.awsstatic.com/whitepapers/aws_pricing_overview.pdf)。  
[DELETE 对象标签](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETEtagging.html)请求优先进行，因为它可获得相同的结果而不会产生费用。
+  [GET 对象标签](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETtagging.html) – 返回与某个对象关联的标签集。Amazon S3 将在响应正文中返回对象标签。
+ [DELETE 对象标签](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETEtagging.html) – 删除与某个对象关联的标签集。

**支持标签的其他 API 操作**
+  [PUT 对象](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)和[启动分段上传](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html) – 您可以在创建对象时指定标签。您将使用 `x-amz-tagging` 请求标头指定标签。
+  [GET 对象](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html) – Amazon S3 不会返回标签集，而会在 `x-amz-tag-count` 标头中返回对象标签计数（仅当请求者有权读取标签时），因为标头响应大小限制为 8000 个字节。如果要查看标签，您应该再发出一个 [GET 对象标签](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETtagging.html) API 操作请求。
+ [POST 对象](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) – 您可以在 POST 请求中指定标签。

  只要请求中的标签不超过 8 K 个字节的 HTTP 请求标头大小限制，您就可以使用 `PUT Object `API 创建带标签的对象。如果您指定的标签超过了标头大小限制，您可以使用将标签包含在正文中的此 POST 方法。

   [PUT 对象 – 复制](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html) – 您可以在请求中指定 `x-amz-tagging-directive` 以指示 Amazon S3 复制（默认行为）标签或将标签替换为请求中提供的一组新标签。

请注意以下几点：
+ S3 对象标签非常一致。有关更多信息，请参阅 [Amazon S3 数据一致性模型](Welcome.md#ConsistencyModel)。

## 其他配置
<a name="tagging-other-configs"></a>

本节介绍对象标签如何与其他配置关联。

### 对象标签和生命周期管理
<a name="tagging-and-lifecycle"></a>

在桶生命周期配置中，您可以指定筛选条件以选择该规则适用的一部分对象。您可以基于键名前缀、对象标签或两者指定筛选条件。

假设您将照片（原始格式和已完成格式）存储在 Amazon S3 桶中。您可以按下面所示标记这些对象。

```
phototype=raw
or
phototype=finished
```

您可能考虑在创建原始照片后的某个时候将其归档到 Amazon Glacier。您可以在生命周期规则中配置一个筛选条件，用于确定一部分包含特定标签 (`photos/`) 且带有键名称前缀 (`phototype=raw`) 的对象。

有关更多信息，请参阅 [管理对象的生命周期](object-lifecycle-mgmt.md)。

### 对象标签和复制
<a name="tagging-and-replication"></a>

如果您在桶上配置了复制，Amazon S3 将复制标签，前提是您向 Amazon S3 授予了读取标签的权限。有关更多信息，请参阅 [设置实时复制概述](replication-how-setup.md)。

### 对象标记事件通知
<a name="tagging-and-event-notifications"></a>

您可以设置 Amazon S3 事件通知以在添加对象标签或从对象中删除时接收通知。`s3:ObjectTagging:Put` 事件类型会在对象上放置标签或现有标签更新时通知您。当从对象中移除标签时，`s3:ObjectTagging:Delete` 事件类型会通知您。有关更多信息，请参阅 [Enabling event notifications](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-enable-disable-notification-intro.html)（启用事件通知）。

有关对象标签的更多信息，请参阅以下主题：

**Topics**
+ [与对象标签相关的 API 操作](#tagging-apis)
+ [其他配置](#tagging-other-configs)
+ [标签和访问控制策略](tagging-and-policies.md)
+ [管理对象标签](tagging-managing.md)

# 标签和访问控制策略
<a name="tagging-and-policies"></a>

您还可以使用权限策略（桶和用户策略）管理对象标签相关权限。有关策略操作，请参阅以下主题：
+  [对象操作](security_iam_service-with-iam.md#using-with-s3-actions-related-to-objects) 
+  [存储桶操作](security_iam_service-with-iam.md#using-with-s3-actions-related-to-buckets)

对象标签支持用于管理权限的精细访问控制。您可以基于对象标签授予条件权限。Amazon S3 支持以下条件键，这些键可用于授予基于对象标签的条件权限：
+ `s3:ExistingObjectTag/<tag-key>` - 使用此条件键可验证现有对象标签是否有特定标签键和值。
**注意**  
当授予 `PUT Object` 和 `DELETE Object` 操作的权限时，此条件键不受支持。也就是说，您无法创建这样一个策略：允许或拒绝用户基于对象的现有标签删除或覆盖该对象。
+ `s3:RequestObjectTagKeys` - 使用此条件键可限制要在对象上允许的标签键。当使用 PutObjectTagging 和 PutObject 以及 POST 对象请求将标签添加到对象时，这很有用。
+ `s3:RequestObjectTag/<tag-key>` - 使用此条件键可限制要在对象上允许的标签键和值。当使用 PutObjectTagging 和 PutObject 以及 POST 桶请求将标签添加到对象时，这很有用。

有关特定于 Amazon S3 服务的条件键的完整列表，请参阅 [使用条件键的存储桶策略示例](amazon-s3-policy-keys.md)。以下权限策略说明了对象标签如何支持精细访问权限管理。

**Example 1：允许用户仅读取具有特定标签和键值的对象**  
以下权限策略限制用户只能读取具有 `environment: production` 标签键和值的对象。请注意，该策略使用 `s3:ExistingObjectTag` 条件键来指定标签键和值。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
  {
    "Principal": {
      "AWS": [
        "arn:aws:iam::111122223333:role/JohnDoe"
      ]
    },
    "Effect": "Allow",
    "Action": ["s3:GetObject", "s3:GetObjectVersion"],
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
    "Condition": {
      "StringEquals": 
        {"s3:ExistingObjectTag/environment": "production"}
    }
  }
  ]
}
```

**Example 2：限制用户可以添加哪些对象标签键**  
以下权限策略将向用户授予执行 `s3:PutObjectTagging` 操作的权限，这使用户可以将标签添加到现有对象。条件使用 `s3:RequestObjectTagKeys` 条件键指定允许的标签键，例如 `Owner` 或 `CreationDate`。有关更多信息，请参阅《IAM 用户指南》**中的[创建测试多个键值的条件](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_multi-value-conditions.html)。  
该策略确保在请求中指定的每个标签键都是授权的标签键。条件中的 `ForAnyValue` 限定符确保请求中必须至少存在指定的值之一。    
****  

```
{
   "Version":"2012-10-17",		 	 	 
  "Statement": [
    {"Principal":{"AWS":[
            "arn:aws:iam::111122223333:role/JohnDoe"
         ]
       },
 "Effect": "Allow",
      "Action": [
        "s3:PutObjectTagging"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Condition": {"ForAnyValue:StringEquals": {"s3:RequestObjectTagKeys": [
            "Owner",
            "CreationDate"
          ]
        }
      }
    }
  ]
}
```

**Example 3：在允许用户添加对象标签时需要特定的标签键和值**  
以下示例策略将向用户授予执行 `s3:PutObjectTagging` 操作的权限，这使用户可以将标签添加到现有对象。条件要求用户包含值设置为 `X` 的特定标签键（如 `Project`)。    
****  

```
{
   "Version":"2012-10-17",		 	 	 
  "Statement": [
    {"Principal":{"AWS":[
       "arn:aws:iam::111122223333:user/JohnDoe"
         ]
       },
      "Effect": "Allow",
      "Action": [
        "s3:PutObjectTagging"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Condition": {"StringEquals": {"s3:RequestObjectTag/Project": "X"
        }
      }
    }
  ]
}
```



# 管理对象标签
<a name="tagging-managing"></a>

本节介绍如何使用适用于 Java 和 .NET 的 AWS 开发工具包或 Amazon S3 控制台管理对象标签。

对象标签为您提供了对通用存储桶中的存储进行分类的方法。每个标签都是遵循以下规则的键值对：
+ 您最多可以将 10 个标签与对象关联。与对象关联的标签必须具有唯一的标签键。
+ 标签键的长度最大可以为 128 个 Unicode 字符，标签值的长度最大可以为 256 个 Unicode 字符。Amazon S3 对象标签在内部以 UTF-16 表示。请注意，采用 UTF-16 时，字符占用 1 或 2 个字符位置。
+ 键和值区分大小写。

有关对象标签的更多信息，请参阅 [使用标签对对象进行分类](object-tagging.md)。有关标签限制的更多信息，请参阅《*AWS 账单与成本管理 用户指南*》中的[用户定义的标签限制](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html)。

## 使用 S3 控制台
<a name="add-object-tags"></a>

**向对象添加标签**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择包含对象的存储桶的名称。

1. 选中待更改对象的名称左侧的复选框。

1. 在**操作**菜单上选择**编辑标签**。

1. 查看列出的对象，然后选择**添加标签**。

1. 每个对象标签都是一个键值对。输入 **Key (键)** 和 **Value (值)**。要添加另一个标签，请选择 **Add Tag (添加标签)**。

   您最多可以为一个对象输入 10 个标签。

1. 选择**保存更改**。

   Amazon S3 会将标签添加给指定对象。

有关更多信息，另请参阅本指南中的 [在 Amazon S3 控制台中查看对象属性](view-object-properties.md) 和 [上传对象](upload-objects.md)。

## 使用 AWS 开发工具包
<a name="tagging-manage-sdk"></a>

------
#### [ Java ]

要使用适用于 Java 的 AWS SDK 管理对象标签，可以为新对象设置标签，并检索或替换现有对象的标签。有关对象标签的更多信息，请参阅[使用标签对对象进行分类](object-tagging.md)。

使用 S3Client 将对象上传到存储桶并设置标签。有关示例，请参阅《Amazon S3 API Reference》**中的 [Upload an object to a bucket](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_PutObject_section.html)。

------
#### [ .NET ]

以下示例演示如何使用适用于 .NET 的 AWS SDK为新对象设置标签并检索或替换现有对象的标签。有关对象标签的更多信息，请参阅[使用标签对对象进行分类](object-tagging.md)。

有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 AWS SDK 开发人员指南》**中的[适用于 .NET 的 AWS SDK 入门](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    public class ObjectTagsTest
    {
        private const string bucketName = "*** bucket name ***";
        private const string keyName = "*** key name for the new object ***";
        private const string filePath = @"*** file path ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;

        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            PutObjectWithTagsTestAsync().Wait();
        }

        static async Task PutObjectWithTagsTestAsync()
        {
            try
            {
                // 1. Put an object with tags.
                var putRequest = new PutObjectRequest
                {
                    BucketName = bucketName,
                    Key = keyName,
                    FilePath = filePath,
                    TagSet = new List<Tag>{
                        new Tag { Key = "Keyx1", Value = "Value1"},
                        new Tag { Key = "Keyx2", Value = "Value2" }
                    }
                };

                PutObjectResponse response = await client.PutObjectAsync(putRequest);
                // 2. Retrieve the object's tags.
                GetObjectTaggingRequest getTagsRequest = new GetObjectTaggingRequest
                {
                    BucketName = bucketName,
                    Key = keyName
                };

                GetObjectTaggingResponse objectTags = await client.GetObjectTaggingAsync(getTagsRequest);
                for (int i = 0; i < objectTags.Tagging.Count; i++)
                    Console.WriteLine("Key: {0}, Value: {1}", objectTags.Tagging[i].Key, objectTags.Tagging[i].Value);


                // 3. Replace the tagset.

                Tagging newTagSet = new Tagging();
                newTagSet.TagSet = new List<Tag>{
                    new Tag { Key = "Key3", Value = "Value3"},
                    new Tag { Key = "Key4", Value = "Value4" }
                };


                PutObjectTaggingRequest putObjTagsRequest = new PutObjectTaggingRequest()
                {
                    BucketName = bucketName,
                    Key = keyName,
                    Tagging = newTagSet
                };
                PutObjectTaggingResponse response2 = await client.PutObjectTaggingAsync(putObjTagsRequest);

                // 4. Retrieve the object's tags.
                GetObjectTaggingRequest getTagsRequest2 = new GetObjectTaggingRequest();
                getTagsRequest2.BucketName = bucketName;
                getTagsRequest2.Key = keyName;
                GetObjectTaggingResponse objectTags2 = await client.GetObjectTaggingAsync(getTagsRequest2);
                for (int i = 0; i < objectTags2.Tagging.Count; i++)
                    Console.WriteLine("Key: {0}, Value: {1}", objectTags2.Tagging[i].Key, objectTags2.Tagging[i].Value);

            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine(
                        "Error encountered ***. Message:'{0}' when writing an object"
                        , e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine(
                    "Encountered an error. Message:'{0}' when writing an object"
                    , e.Message);
            }
        }
    }
}
```

------