

# オブジェクトの整理、リスト化、使用
<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 バケットに保存するデータを整理できます。プレフィックスは、オブジェクトキー名の先頭にある文字列です。プレフィックスには、オブジェクトキー名の最大長 (1,024 バイト) を条件として、任意の長さを指定できます。プレフィックスは、ディレクトリと同様の方法でデータを整理する方法と考えることができます。ただし、プレフィックスはディレクトリではありません。

プレフィックスで検索すると、指定されたプレフィックスで始まるキーだけに結果が限定されます。区切り記号を使用すると、リストオペレーションによって、共通のプレフィックスを共有するすべてのキーが単一の要約リスト結果にまとめられます。

プレフィックスと区切り記号のパラメータの目的は、キーを階層的に構成および参照できるようにすることです。そのためには、まずバケットで使用する区切り記号を選択します。スラッシュ (/) など、キーの名前には使われないような記号を使用します。別の文字を区切り文字として使用できます。スラッシュ (/) 文字に特徴はありませんが、非常に一般的なプレフィックスの区切り文字です。次に、階層に含まれるすべてのレベルを連結し、各レベルを区切り記号で区切ることで、キーの名前を構成します。

例えば、都市に関する情報を格納するとしたら、大陸、国、州または県の順に情報を整理するのが自然でしょう。通常、これらの名前には句読点が含まれないため、区切り記号としてスラッシュ (/) を使用できます。以下の例ではスラッシュ (/) 区切り記号を使用しています。
+ Europe/France/Nouvelle−Aquitaine/Bordeaux
+ North America/Canada/Quebec/Montreal
+ 北米/米国/ワシントン州/ベルビュー
+ 北米/米国/ワシントン州/シアトル

世界中の全都市のデータをこの方法で格納した場合、階層のないフラットなキーネームスペースは管理しにくくなります。リストオペレーションで `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>

区切り記号付きのリストリクエストを発行すると、1 レベルの階層だけを参照でき、それより深いレベルで入れ子にされている (場合によっては数百万もの) キーはスキップおよび集約されます。例えば、次のキーを持つバケット (*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 リクエストをスラッシュ (`/`) の区切り文字と共に送信します。Simple Storage Service (Amazon S3) からのレスポンスでは `sample.jpg` オブジェクトキーが返されます。このキーには `/` の区切り文字が含まれないためです。その他すべてのキーには区切り文字が含まれます。Amazon S3 によってこれらのキーがグループ化され、特定のプレフィックス値を持つ 1 つの `CommonPrefixes` 要素が返されます。この場合のプレフィックス値は `photos/` であり、これはキーの先頭から、指定した区切り文字の最初の出現までのサブ文字列です。

**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 ドキュメントが返されます。

**注記**  
 SOAP API for Amazon S3 は新規顧客には利用できず、2025 年 8 月 31 日にサポート終了 (EOL) となります。REST API か AWS SDK を使用することをお勧めします。

特殊な区切り記号で終わるプレフィックスを共有するキーのグループは、リストの目的で、その共通のプレフィックスによってロールアップできます。このような機能によりアプリケーションでは、キーを階層的に構成および参照できるようになります。ファイルシステムにおいてファイルをディレクトリに分けて整理するのに似ています。

例えば、英語以外の単語も含まれるように dictionary バケットを拡張するには、各単語にその言語と区切り記号のプレフィックスを付けることでキーを形成できます (「`French/logical`」など)。この命名スキームと階層リスト機能を使用すれば、フランス語の単語のリストだけを取得することもできます。また、対応している言語の最上位レベルのリストを参照することで、それより下の階層間に介在するすべてのキーを反復処理する必要もなくなります。リスト化における階層の役割については、[プレフィックスを使用してオブジェクトを整理する](using-prefixes.md) を参照してください。

**REST API**  
アプリケーションで必要な場合は、REST リクエストを直接送信できます。GET リクエストを送信して、バケット内の一部またはすべてのオブジェクトを返すことができます。または選択条件を使用して、バケット内のオブジェクトのサブセットを返すことができます。詳細については、*Amazon Simple Storage Service API リファレンス*の [GET バケット (オブジェクトのリスト化) バージョン 2](https://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html) を参照してください。

**リスト実装の効率性**  
リスト化のパフォーマンスは、バケット内のキーの総数によって大きく影響されることはありません。`prefix`、`marker`、`maxkeys` または `delimiter` 引数の有無によって影響されることもありません。

**複数ページの結果に対する反復処理**  
バケットに入れることのできるキーの数は実質的に無制限であるため、リストのクエリによっては結果が膨大な量になる可能性があります。大規模な結果セットを管理するため、Amazon S3 API ではページ分割をサポートして結果セットを複数のレスポンスに分割します。キーリストのレスポンスごとに最大 1,000 個のキーを含むページと、レスポンスが切り捨てられているかどうかを示すインジケータが返されます。すべてのキーを受信するまで、一連のキーリストリクエストを送信します。AWSこのページ分割は、SDK ラッパーライブラリでも行うことができます。

## 例
<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)」を参照してください。

**Tools for 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/` がプレフィックスになります。

ここでは、さらに 2 つの例を示します。
+ 汎用バケットに `logs/date1.txt`、`logs/date2.txt`、`logs/date3.txt` という 3 つのオブジェクトがある場合、コンソールには `logs` という名前のフォルダが表示されます。コンソールでフォルダを開くと、`date1.txt`、`date2.txt`、`date3.txt` という 3 つのオブジェクトが表示されます。
+ `photos/2017/example.jpg` という名前のオブジェクトがある場合、コンソールには、フォルダ `2017` を含む `photos` という名前のフォルダが表示されます。フォルダ `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**) を入力します。
**注記**  
フォルダ名には特定の制限とガイドラインが適用され、オブジェクトのオブジェクトキー名の一部と見なされて、1,024 バイトに制限されます。詳細については、「[Amazon S3 オブジェクトに命名する](object-keys.md)」を参照してください。

1. (オプション) バケットポリシーで特定の暗号化キーでオブジェクトを暗号化する必要がある場合は、**[サーバー側の暗号化]** で、**[暗号化キーを指定する]** を選択し、フォルダの作成時に同じ暗号化キーを指定する必要があります。指定しない場合、フォルダの作成は失敗します。

1. **Create folder** (フォルダの作成) を選択します。

## フォルダの公開
<a name="public-folders"></a>

パブリックフォルダまたはバケットが特別に必要な場合を除き、Amazon S3 フォルダまたはバケットへのすべてのパブリックアクセスをブロックすることをお勧めします。フォルダを公開すると、インターネット上の誰もがフォルダ内でグループ化されたすべてのオブジェクトを表示できます。

Amazon S3 コンソールでは、フォルダをパブリックにすることができます。データへのアクセスをプレフィックスで制限するバケットポリシーを作成して、フォルダを公開することもできます。詳細については、「[Amazon S3 用 Identity and Access Management](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 はオブジェクトの総数と合計ストレージサイズを計算します。ただし、不完全または進行中のマルチパートのアップロード、および以前のバージョンまたは最新ではないバージョンは、オブジェクトの総数または合計サイズには含まれません。このアクションは、バケットに保存されている各オブジェクトの現在のバージョンまたは最新バージョンのオブジェクトの総数と合計サイズのみを計算します。  
例えば、バケット内に 2 つのバージョンのオブジェクトがある場合、Amazon S3 のストレージ計算ツールはそれらを 1 つのオブジェクトとしてしかカウントしません。そのため、Amazon S3 コンソールで計算されるオブジェクトの総数は、S3 ストレージレンズに表示される **[オブジェクト数]** メトリクスや 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**」と入力し、[**オブジェクトの削除**] をクリックします。

**警告**  
このアクションは、指定されたすべてのオブジェクトを削除します。フォルダを削除する場合は、削除アクションが完了するのを待ってから、フォルダに新しいオブジェクトを追加します。そうしなければ、新しいオブジェクトも削除される可能性があります。

# 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. [**オブジェクト**] リストで、プロパティを表示するオブジェクトの名前を選択します。

   オブジェクトの [**オブジェクトの概要**] が開きます。下にスクロールすると、オブジェクトのプロパティを表示できます。

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) を参照してください。

      オブジェクトを汎用バケットにアップロードした後にストレージクラスを変更するには、**[ストレージクラス]** を選択します。目的のストレージクラスを選択し、[**保存**] を選択します。
**注記**  
ディレクトリバケット内のオブジェクトのストレージクラスは変更できません。

   1. **サーバー側の暗号化設定** － サーバー側の暗号化を使用して S3 オブジェクトを暗号化できます。詳細については、[AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定](specifying-kms-encryption.md) または [Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) の指定](specifying-s3-encryption.md) を参照してください。

   1. **Metadata** – Amazon S3 内の各オブジェクトには、それぞれのメタデータを表す一連の名前/値ペアがあります。S3 オブジェクトにメタデータを追加する方法については、 を参照してください。[Amazon S3 コンソールでのオブジェクトメタデータの編集](add-object-metadata.md)

   1. **[タグ]** - 汎用バケット内の S3 オブジェクトにタグを追加して、ストレージを分類します。詳細については、「[タグを使用したオブジェクトの分類](object-tagging.md)」を参照してください。

   1. **[オブジェクトロックリーガルホールドと保持]** - 汎用バケット内のオブジェクトが削除されないようにすることができます。詳細については、「[S3 Object Lock を使用したオブジェクトのロック](object-lock.md)」を参照してください。

# タグを使用したオブジェクトの分類
<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);
            }
        }
    }
}
```

------