

# タグを使用したオブジェクトの分類
<a name="object-tagging"></a>

オブジェクトのタグ付けを使用してストレージを分類します。各タグはキーと値のペアです。

新しいオブジェクトのアップロード時のタグ付け、または既存のオブジェクトのタグ付けを行うことができます 
+ 1 つのオブジェクトに最大 10 個のタグを関連付けることができます。オブジェクトに関連付けるタグには一意のタグキーが必要です。
+ タグキーには最大 128 個の Unicode 文字、タグ値には最大 256 個の Unicode 文字を使用できます。Amazon S3 オブジェクトタグは、内部的に UTF-16 で表現されています。UTF-16 では、文字は 1 文字または 2 文字の位置を消費することに注意してください。
+ キーと値は大文字と小文字が区別されます。
+ タグの制限の詳細については、「**AWS Billing and Cost Management ユーザーガイド」の「[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 複数のタグ**  
次に示すように複数のタグを 1 つのオブジェクトに付けることができます。  

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

**キー名のプレフィックスとタグ**  
オブジェクトキー名のプレフィックスにより、ストレージを分類することもできます。ただし、プレフィックスベースの分類は 1 次元的です。次のオブジェクトキー名について説明します。

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

これらのキー名には、プレフィックスとして `photos/`、`project/projectx/`、および `project/projecty/` が付いています。このプレフィックスによって 1 つのディメンションでの分類が行われます。つまり、1 つのプレフィックスのオブジェクトすべてが 1 つのカテゴリになります。たとえば、プレフィックス `project/projectx` はプロジェクト x に関連するすべてのドキュメントを識別します。

タグ付けによってもう 1 つのディメンションを設定できます。プロジェクト x カテゴリ内に photo1 が必要な場合、そのようにオブジェクトにタグ付けできます。

**追加の利点**  
データの分類だけでなく、タグ付けには以下に示すような利点もあります。
+ オブジェクトのタグを使用するとアクセス許可をきめ細かく制御できます。例えば、特定のタグが付けられた読み取り専用オブジェクトへのアクセス許可をユーザーに付与できます。
+ オブジェクトのタグを使用すると、ライフサイクルルールでキー名プレフィックスに加えてタグに基づくフィルタを指定でき、オブジェクトライフサイクルをきめ細かく管理できます。
+ Amazon S3 分析を使用する場合は、フィルターを設定することで、分析対象のオブジェクトをオブジェクトタグまたはキー名のプレフィックスに基づいてグループ化するか、プレフィックスとタグの両方に基づいてグループ化することができます。
+ また、Amazon CloudWatch メトリクスをカスタマイズして、特定のタグフィルターごとに情報を表示することもできます。詳細については次のセクションで説明します。

**重要**  
機密データ (個人を特定できる情報 (PII) または保護すべき医療情報 (PHI) を含むオブジェクトのラベルとしてタグを使用できます。しかし、タグそのものに機密情報を含めることはできません。

**1 つのリクエストで複数の Amazon S3 オブジェクトにオブジェクトタグセットを追加する**  
1 つのリクエストでオブジェクトタグセットを複数の Amazon S3 オブジェクトに追加するには、S3 バッチオペレーションを使用できます。S3 バッチオペレーションには、オペレーション対象のオブジェクトのリストを指定します。S3 バッチオペレーションは、各 API オペレーションを呼び出して、指定されたオペレーションを実行します。1 つのバッチオペレーションジョブで、エクサバイトのデータを含む数十億ものオブジェクトに対して、指定されたオペレーションを実行できます。

S3 バッチオペレーション機能は、進捗状況の追跡、通知の送信、すべてのアクションの詳細な完了レポートの保存を行い、フルマネージドの監査可能なサーバーレスエクスペリエンスを提供します。S3 バッチオペレーションは、Amazon S3 コンソール、AWS CLI、AWS SDK、または REST API を通じて使用できます。詳細については、「[S3 バッチ操作の基本](batch-ops.md#batch-ops-basics)」を参照してください。

オブジェクトタグの詳細については、[オブジェクトタグの管理](tagging-managing.md)を参照してください。

## オブジェクトのタグ付けに関連する API オペレーション
<a name="tagging-apis"></a>

Amazon S3 では、特にオブジェクトのタグ付けについて次の API オペレーションがサポートされています。

**オブジェクトの API オペレーション**
+  [PUT Object tagging](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTtagging.html) – オブジェクトのタグを置換します。リクエストボディにタグを指定します。この API を使用したオブジェクトタグ管理の 2 つのシナリオは次のとおりです。
  + オブジェクトにタグがない – この API を使用して一連のタグをオブジェクトに付けることができます (オブジェクトには事前にタグが付いていない)。
  + オブジェクトに既存のタグセットがある – 既存のタグセットを変更するには、最初に既存のタグセットを取得してクライアント側で変更してから、この API を使用してタグセットを置換する必要があります。
**注記**  
 タグセットを空にしてこのリクエストを送信すると、Amazon S3 によってオブジェクトの既存のタグセットが削除されます。この方法を使用すると、範囲 1 リクエスト (PUT) に対して料金が発生します。詳細については、[Amazon S3 の料金](https://d0.awsstatic.com/whitepapers/aws_pricing_overview.pdf) を参照してください。  
料金が発生することなく同じ結果が得られるため、[DELETE Object tagging](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETEtagging.html) リクエストが推奨されます。
+  [GET Object tagging](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETtagging.html) – オブジェクトに関連付けられているタグセットを返します。Amazon S3 によってレスポンス本文でオブジェクトタグが返されます。
+ [DELETE Object tagging](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETEtagging.html) – オブジェクトに関連付けられているタグセットを削除します。

**タグ付けをサポートする他の API オペレーション**
+  [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) および [Initiate Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html) – オブジェクトを作成するときにタグを指定できます。`x-amz-tagging` リクエストヘッダーを使用してタグを指定します。
+  [GET Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html) – Amazon S3 はタグセットを返さずに、`x-amz-tag-count` ヘッダーでオブジェクトのタグ数を返します (リクエスタにタグの読み取りアクセス許可がある場合のみ)。これは、ヘッダーのレスポンスサイズが 8 KB に制限されるためです。タグを表示するには、[GET Object tagging](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETtagging.html) API オペレーションで別のリクエストを作成します。
+ [POST Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) – POST リクエストでタグを指定できます。

  リクエスト内のタグが 8 KB の 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 バケットに写真 (RAW 形式および完成形式) を保存するとします。このようなオブジェクトには次のようにタグ付けできます。

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

写真の作成後、しばらくしてから RAW 写真を 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` イベントタイプは、タグがオブジェクトから削除されたときに通知します。詳細については、[イベント通知を有効](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 Object リクエストを使用してオブジェクトにタグを付けるときです。
+ `s3:RequestObjectTag/<tag-key>` – この条件キーを使用して、オブジェクトに指定できるタグキーと値を制限します。これが役立つのは、PutObjectTagging、PutObject、および POST Bucket リクエストを使用してオブジェクトにタグを付けるときです。

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` 修飾子によって、指定したキーの少なくとも 1 つがリクエストに存在することが保証されます。    
****  

```
{
   "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>

このセクションでは、AWS SDK for Java および .NET、または Amazon S3 コンソールを使用してオブジェクトタグを管理する方法について説明します。

オブジェクトのタグ付けにより、汎用バケット内のストレージを分類できます。各タグは、以下のルールに準拠したキーと値のペアです。
+ 1 つのオブジェクトに最大 10 個のタグを関連付けることができます。オブジェクトに関連付けるタグには一意のタグキーが必要です。
+ タグキーには最大 128 個の Unicode 文字、タグ値には最大 256 個の Unicode 文字を使用できます。Amazon S3 オブジェクトタグは、内部的に UTF-16 で表現されています。UTF-16 では、文字は 1 文字または 2 文字の位置を消費することに注意してください。
+ キーと値は大文字と小文字が区別されます。

オブジェクトタグの詳細については、[タグを使用したオブジェクトの分類](object-tagging.md)を参照してください。タグの制限の詳細については、*AWS Billing and Cost Management ユーザーガイド*の[ユーザー定義タグの制限](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. [**Actions**] メニューで、[**Edit tags**] を選択します。

1. リストされたオブジェクトを確認し、[**タグの追加**] を選択します。

1. 各オブジェクトタグはキーと値のペアです。**キー**と**値**を入力します。別のタグを追加するには、[**タグの追加**] を選択します。

   オブジェクトには最大 10 個のタグを入力できます。

1. [**Save changes**] (変更を保存) をクリックします。

   Amazon S3 が指定されたオブジェクトにタグを追加します。

詳細については、このガイドの「[Amazon S3 コンソールでのオブジェクトのプロパティの表示](view-object-properties.md)」および「[オブジェクトのアップロード](upload-objects.md)」も参照してください。

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

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

AWS SDK for Java を使用してオブジェクトタグを管理するには、新しいオブジェクトのタグを設定し、既存のオブジェクトのタグを取得または置き換えます。オブジェクトのタグ付けの詳細については、「[タグを使用したオブジェクトの分類](object-tagging.md)」を参照してください。

S3Client を使用してオブジェクトをバケットにアップロードし、タグを設定します。例については、「*Amazon S3 API リファレンス*」の「[Upload an object to a bucket](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_PutObject_section.html)」を参照してください。

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

次の例では、AWS SDK for .NET タグを使用して新しいオブジェクトのタグを設定し、既存のオブジェクトのタグを取得または置き換える方法を示します。オブジェクトのタグ付けの詳細については、「[タグを使用したオブジェクトの分類](object-tagging.md)」を参照してください。

コード例を設定および実行する方法の詳細については、「*AWS SDK for .NET デベロッパーガイド*」の「[AWS SDK for .NET の開始方法](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);
            }
        }
    }
}
```

------