

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用標籤為物件分類
<a name="object-tagging"></a>

使用物件標記，可讓您分類儲存。每個標籤都是金鑰值對。

您可以在上傳新的物件時，為這些物件新增標籤，也可以對現有的物件新增標籤。
+ 一個物件最多可以與 10 個標籤相關聯。與物件相關聯的標籤，必須具備唯一的標籤金鑰。
+ 標籤索引鍵的長度上限為 128 個 Unicode 字元，標籤值的長度上限為 256 個 Unicode 字元。Amazon S3 物件標籤在 UTF-16 內部表示。請注意，在 UTF-16 中，字元佔用 1 或 2 個字元位置。
+ 金鑰與值皆會區分大小寫。
+ 如需標籤限制的詳細資訊，請參閱《AWS 帳單與成本管理使用者指南》**中的[使用者定義的標籤限制](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 指標，依特定的標籤篩選條件顯示資訊。下列各節將詳細說明。

**重要**  
標籤可用於標記內涵機密資料 (例如個人識別資訊 (PII) 或受保護的醫療資訊 (PHI))。不過，標籤本身無法包含任何機密資訊。

**使用單一請求新增物件標籤集至多個 Amazon S3 物件**  
若要使用單一請求新增超過一個 Amazon S3 物件的物件標籤，您可以使用 S3 Batch Operations。您可以為 SS3 Batch Operations 提供一份要進行操作的物件清單。S3 批次操作會呼叫相應的 API 操作來執行指定操作。單一批次操作任務可在包含數 EB 資料的數十億個物件上執行指定的操作。

S3 Batch Operations 功能會追蹤進度、傳送通知，並存放所有動作的詳細完成報告，提供完整受管、可稽核、無伺服器的體驗。您可以透過 Amazon S3 主控台、 AWS CLI、 AWS SDKs 或 REST API 使用 S3 批次操作。 Amazon 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 會刪除物件上的現有標籤組。如果您使用此方法，系統會向您收取 Tier 1 Request (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) - 因為標頭回應大小不得超過 8 K 個位元組，所以 Amazon S3 不會傳回標籤組，而會在 `x-amz-tag-count` 標頭中傳回物件標籤計數 (只有當請求者有許可能讀取標籤時)。若希望檢視標籤，您必須另外發出 [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 Object - Copy](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` 事件類型會在物件上的標籤為 PUT 或現有標籤已更新時通知您。`s3:ObjectTagging:Delete` 事件類型會在標籤從物件移除時通知您。如需詳細資訊，請參閱[啟用事件通知](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 SDKs 或 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 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇**一般用途儲存貯體**。

1. 在儲存貯體清單中，選擇包含該物件的儲存貯體名稱。

1. 選取您要變更之物件名稱左側的核取方塊。

1. 在 **Actions (動作)** 選單上，選擇 **Edit tags (編輯標籤)**。

1. 檢閱列出的物件，然後選擇 **Add tags (新增標籤)**。

1. 每個物件標籤都是一個鍵值對。輸入 **Key (索引鍵)** 和 **Value (數值)**。若要新增其他標籤，選擇 **Add Tag (新增標籤)**。

   一個物件最多可以輸入 10 個標籤。

1. 選擇 **Save changes** (儲存變更)。

   Amazon S3 會將標籤新增至指定的物件。

如需詳細資訊，請參閱本指南中的 [在 Amazon S3 主控台中檢視物件屬性](view-object-properties.md) 和 [上傳物件](upload-objects.md)。

## 使用 AWS SDKs
<a name="tagging-manage-sdk"></a>

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

若要使用適用於 Java 的 AWS SDK 管理物件標籤，您可以設定新物件的標籤，並擷取或取代現有物件的標籤。如需更多物件標記的詳細資訊，請參閱「[使用標籤為物件分類](object-tagging.md)」。

使用 S3Client 將物件上傳至儲存貯體並設定索引標籤。如需範例，請參閱《Amazon S3 API 參考》**中的[將物件上傳至儲存貯體](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 的 SDK 入門](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。 *AWS *

```
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);
            }
        }
    }
}
```

------