AWS リソースのタグ付けについて整理してみた

# 背景・目的
リソースについて、統制を取る機会が増えてきたので、あらためてAWSのタグについて整理したいと思います。

# まとめ
下記の特徴があります。

|特徴 | 内容|
|:--|:--|
|概要| AWSリソースを整理するためのメタデータとして機能するキーと値のペアで設計されている。|
|タグの仕様|キーと値は、大文字・小文字が区別される|
|インタフェイス|・サービスAPI<BR>・タグエディタコンソール<BR>・Resource Groupタグ付けAPI|
|ベストプラクティス|・PII、機密情報などはタグに追加しない<BR>・タグは、大文字小文字を区別する形式とする。すべてのリソースに対して一貫してつける<BR>・複数の目的に対応した、リソースアクセスコントロール管理、コスト追跡、オートメーション、整理などのタグガイドラインを考慮する。<BR>・自動化されたツールを使用する。タグエディタとResouce Groups Tagging APIを使用することでプログラムでタグの制御が可能になる。<BR>・タグは多く使う。<BR>・将来の変更の影響を考慮する。アクセス制御タグを変更した場合、そのタグを参照してリソースへのアクセスを制御するポリシーも更新する必要がある。<BR>・Organizationを使用して、タグポリシーを作成及びデプロイすることで、組織が採用するタグ付け標準を自動的に適用できる。|
|タグの命名規約と要件|・各リソースは、最大50個まで<BR>・リソースごとに一意<BR>・使用できる文字はAWSサービスごとに異なる<BR>・大文字・小文字は区別される。ベストプラクティスはタグを大文字するための戦略を決定する|
|タググループ|目的に応じたタググループを設計し管理する。<BR>例）<BR>・Technical tags<BR>・Tags for automation<BR>・Business tags<BR>・Security tags|
|タグのガバナンス|リアクティブガバナンスとプロアクティブガバナンスがある。確認する。実装するの違い。|

# 概要
ドキュメント「[AWSリソースのタグ付け](https://docs.aws.amazon.com/ja_jp/tag-editor/latest/userguide/tagging.html)」をもとに整理します。

> タグは、AWS リソースを整理するためのメタデータとして機能するキーと値のペアです。AWSほとんどのリソースでは、リソースの作成時にタグを追加できます。リソースの例には、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、Amazon Simple Storage Service (Amazon S3) バケット、シークレットなどがあります。AWS Secrets Manager

> 個人情報 (PII) などの機密情報や秘匿性の高い情報はタグに格納しないでください。タグを使用して、課金および管理サービスを提供します。タグは、プライベートデータや機密データに使用することを意図していません。

- AWSリソースを整理するためのメタデータとして機能するキーと値のペア
- PIIなどの機微な情報をタグに含めない

> 各タグは 2 つの部分で構成されます。
> - タグキー (例: CostCenter、Environment、または Project)。タグキーでは、大文字と小文字が区別されます。
> - タグ値 (例: 111122223333 または Production)。タグキーと同様に、タグ値は大文字と小文字が区別されます。
> タグを使用し、リソースを目的、所有者、環境などの基準別に分類できます。

- タグの仕様
    - キーと値は、大文字・小文字が区別される

## AWSリソースにタグを追加する方法
> AWSリソースにタグを追加するには 3 つの方法があります。
> - AWS のサービスAPI 操作 — タグ付け API 操作は直接サポートされています。AWS のサービスAWS のサービスそれぞれが提供するタグ付け機能については、AWSドキュメント索引にあるサービスのドキュメントを参照してください。
> - タグエディターコンソール — 一部のサービスでは、AWSタグエディターコンソールによるタグ付けもサポートしています。
> - Resource Groups タグ付け API — ほとんどのサービスは、を使用したタグ付けもサポートしています。AWS Resource Groups Tagging API

- リソースをタグ付けする方法
    - サービスAPI
    - タグエディタコンソール
    - Resource Groupタグ付けAPI

## ベストプラクティス
> AWS リソースのタグ付け戦略を作成するときは、次のベストプラクティスに従ってください。
> - 個人情報 (PII) などの機密情報や秘匿性の高い情報はタグに追加しないようにします。タグは、多くの AWS のサービス (請求など) からアクセスできます。タグは、プライベートデータや機密データに使用することを意図していません。
> - タグには、標準化された、大文字と小文字の区別がある形式を使用し、すべてのリソースタイプに一貫して適用します。
> - リソースアクセスコントロールの管理、コスト追跡、オートメーション、整理など、複数の目的に対応したタグガイドラインを考慮します。
> - 自動化されたツールを使用して、リソースタグを管理できます。タグエディタとResource Groups Tagging API を使用すると、プログラムによるタグの制御が可能になるため、タグとリソースの自動的な管理、検索、フィルタリングが容易になります。
> - タグは、多めに使用します。
> - ビジネス要件の変化に合わせてタグを変更するのは簡単ですが、将来の変更の影響を考慮してください。たとえば、アクセス制御タグを変更した場合、そのタグを参照してリソースへのアクセスを制御するポリシーも更新する必要があります。
> - AWS Organizations を使用してタグポリシーを作成およびデプロイすることで、組織が採用するタグ付け標準を自動的に適用することができます。タグポリシーでは、有効なキー名と各キーに有効な値を定義するタグ付けルールを指定することができます。モニタリングのみを選択して、既存のタグを評価し、クリーンアップすることもできます。選択した標準にタグが準拠したら、タグポリシーで適用を有効にして、非準拠のタグが作成されないようにすることができます。詳細については、AWS Organizations ユーザーガイドのタグポリシーを参照してください。

下記のベストプラクティスがある。
- PII、機密情報などはタグに追加しない
- タグは、大文字小文字を区別する形式とする。すべてのリソースに対して一貫してつける
- 複数の目的に対応した、リソースアクセスコントロール管理、コスト追跡、オートメーション、整理などのタグガイドラインを考慮する。
- 自動化されたツールを使用する。タグエディタとResouce Groups Tagging APIを使用することでプログラムでタグの制御が可能になる。
- タグは多く使う。
- 将来の変更の影響を考慮する。アクセス制御タグを変更した場合、そのタグを参照してリソースへのアクセスを制御するポリシーも更新する必要がある。
- Organizationを使用して、タグポリシーを作成及びデプロイすることで、組織が採用するタグ付け標準を自動的に適用できる。

## カテゴリのタグ付け
> タグを最も効果的に使用している企業は、ビジネス関連のタググループを作成し、リソースを技術、ビジネス、セキュリティといったディメンションで整理しています。自動プロセスを使用してインフラストラクチャを管理する企業は、それに加えてオートメーション関連のタグも使用します。

- タグを効果的に使用している企業は、ビジネス関連のタググループを作成し、整理している。

| タググループ |タグ|備考|
|:--|:--|:--|
| Technical tags|Name|
||Application ID|
||Application Role|
||Cluster|
||Environment|開発、本番など|
||Version|
|Tags for automation|Date/Time|
||Opt in/Opt out|
||Security|
|Business tags|Project|
||Owner|リソースの責任者|
||Cost Center/Business Unit|コストセンター|
||Customer||
|Security tags|Confidentiality|機密性レベル|
||Compliance||

## タグの命名制限と要件
> タグには、次の基本的な命名要件と使用要件が適用されます。
> - 各リソースは、最大 50 個のユーザー作成タグを持つことができます。
> - aws: で始まるシステム作成タグは AWS に使用するために予約されており、この制限にはカウントされません。aws: プレフィックスで始まるタグを編集または削除することはできません。
> - タグキーは、リソースごとにそれぞれ一意である必要があります。また、各タグキーに設定できる値は 1 つのみです。
> - UTF-8 では、タグキーは 1 文字以上で、最大 128 文字の Unicode 文字である必要があります。
> - UTF-8 では、タグ値は 0 文字以上、最大 256 文字の Unicode 文字である必要があります。
> - 使用できる文字は、AWS のサービスごとに異なります。AWS の特定のサービスでリソースのタグ付けに使用できる文字については、そのドキュメントを参照してください。通常、使用できる文字は、UTF-8 対応の文字、数字、スペースと、 _ . : / = + - @ の文字です。
> - タグのキーと値は大文字と小文字が区別されます。ベストプラクティスとして、タグを大文字にするための戦略を決定し、その戦略をすべてのリソースタイプにわたって一貫して実装します。たとえば、Costcenter、costcenter、CostCenter のいずれを使用するかを決定し、すべてのタグに同じ規則を使用します。大文字と小文字の扱いについて、同様のタグに整合性のない規則を使用することは避けてください。

- 各リソースは、最大50個まで
- リソースごとに一意
- 使用できる文字はAWSサービスごとに異なる
- 大文字・小文字は区別される。ベストプラクティスはタグを大文字するための戦略を決定する

## 一般的なタグ付け戦略
> タグ付け戦略を使用すると、AWS リソースの識別と管理に役立ちます。
### リソース整理のタグ
> タグは、AWSで AWS Management Console リソースを整理するための効果的な手段です。タグと共にリソースが表示されるように設定したり、タグで検索やフィルタリングを行ったりできます。 AWS Resource Groups サービスを使用すると、1 つまたは複数のタグ、またはタグの一部に基づいて AWS リソースのグループを作成できます。また、AWS CloudFormation スタック内での出現回数に基づいてグループを作成することもできます。リソースグループとタグエディタを使用すると、複数のサービス、リソース、リージョンで構成されるアプリケーションのデータを 1 か所にまとめて表示できます。

- Resource Groupsサービスを使用し1つ、複数のタグ、タグの一部に基づきAWSリソースのグループを作成できる
- Cfnスタック内での出現回数に基づきグループを作成することも可能

### コスト配分のタグ
> AWS Cost Explorer と請求明細レポートを使用すると、AWS のコストをタグ別に分類できます。通常、コストセンター/ビジネスユニット、お客様、またはプロジェクトといったビジネスタグを使用して、AWS のコストを従来のコスト配分ディメンションに関連付けます。ただし、コスト配分レポートで使用できるタグに制限はありません。特定のアプリケーション、環境、コンプライアンスプログラムなど、技術やセキュリティに関するディメンションを使って、コストの関連付けを行うことができます。次に、コスト配分レポートの例を示します。

- Cost Explorerと請求明細レポートを使用すると、AWSコストをタグ別に分類できる

### オートメーションのタグ
> リソースまたはサービスに固有のタグは、多くの場合、オートメーションアクティビティ中にリソースをフィルタリングする目的で使用します。オートメーションタグは、自動タスクのオプトインまたはオプトアウト、またはアーカイブ、更新、削除の対象となるリソースのバージョンの特定に使用します。たとえば、オートメーションにした start または stop スクリプトを実行して業務時間外に開発環境をオフにすれば、コストが削減できます。このシナリオで Amazon Elastic Compute Cloud (Amazon EC2) インスタンスタグを使うと、このアクションからオプトアウトするインスタンスを簡単に指定できます。古くなった、out-of-date Amazon EBS スナップショットを検索して削除するスクリプトの場合、スナップショットタグで検索条件にディメンションを追加することができます。

- オートメーションタスクのオプトイン、オプトアウト等に使用

### アクセス制御のタグ
> IAM ポリシーでは、タグベースの条件をサポートしています。このため、特定のタグやタグの値に基づいて IAM アクセス許可を制限できます。たとえば、IAM ユーザーまたはロールのアクセス許可に、EC2 API コールをタグに基づいて特定の環境 (開発、テスト、本番など) に制限する条件を含めることができます。同じ戦略を使用して、API 呼び出しを特定の Amazon Virtual Private Cloud (Amazon VPC) ネットワークに制限できます。タグベースのリソースレベルの IAM アクセス許可をサポートしているかどうかは、サービスによって異なります。アクセス制御にタグベースの条件を使用する場合は、タグを変更できるユーザーを定義することで、タグの変更を制限してください。AWS リソースへの API アクセスを制御するためのタグの使用に関する詳細については、IAM ユーザーガイドの「IAM と連携する AWS のサービス」を参照してください。

- タグベースの条件をIAMポリシーでサポート
- 特定のタグに基づき、制御可能


## タグ付けのガバナンス
> 効果的なタグ付け戦略を実装するには、標準化されたタグを使用し、それをプログラミングによって AWS リソース全体に一貫して適用します。AWS 環境におけるタグの管理には、リアクティブなアプローチとプロアクティブなアプローチの両方が使用できます。
> - リアクティブガバナンスの目的は、リソースグループタグ付け API、AWS Config ルール、カスタムスクリプトなどのツールを使用して適切にタグ付けされていないリソースを見つけることです。リソースを手動で検索するには、タグエディタと請求明細レポートを使用します。
> - プロアクティブガバナンスは、AWS CloudFormation、Service Catalog、AWS Organizations のタグポリシー、または IAM のリソースレベルの許可などのツールを使用して、リソース作成時に標準化されたタグが一貫して適用されるようにします。
> たとえば、AWS CloudFormation Resource Tags プロパティを使用して、リソースタイプにタグを適用できます。Service Catalog では、ポートフォリオと製品タグを追加すれば、製品の開始時に自動的にポートフォリオと製品タグの組み合わせが適用されます。より厳格なプロアクティブガバナンスには、自動タスクが含まれます。たとえば、リソースグループタグ付け API を使用して AWS 環境のタグを検索したり、不適切にタグ付けされたリソースを隔離または削除するためのスクリプトを実行したりできます。

- 標準化されたタグを使用する
- ガバナンスは下記のアプローチがある
    - リアクティブガバナンス
        - 適切にタグ付けされていないリソースをツールやサービスを使用して見つけること
    - プロアクティブガバナンス
        - リソース作成時に標準化されたタグが一貫して使用されるように、Cfnなどのようなサービスを使用すること

# 実践
## タグエディタの使用
[タグエディタの使用](https://docs.aws.amazon.com/ja_jp/tag-editor/latest/userguide/tag-editor.html)を元に試します。

1. AWSにサインインし「Resource Groups & Tag Editor」で検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/da11d15d-d24c-e065-0b37-f676755a73ac.png)

1. ナビゲーションペインで「タグエディタ」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b70c6969-ae18-2f77-6d79-50f4cdf41bf1.png" width=200 />

1. タグ付けするリソースを検索で下記を入力し、「リソースを検索」をクリックします。
    - リージョン
    - リソースタイプ
    - 必要に応じて、タグ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ac04c328-d023-3975-a7af-01d8b56bf60d.png)

1. 下記の結果が表示されるので、対象のリソースを①「選択」し、②「選択したリソースのタグを管理する」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/294ca29a-4ac3-9daf-3fd0-c81b849c8827.png)

1. タグを管理画面に遷移するので、「タグを追加」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/367642e4-0807-ff87-babb-6a93205d6599.png)

1. タグキーとタグバリューを設定し、「タグの変更を確認して適用する」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8f227961-27ff-bf32-9f8b-69cad15fd949.png)
1. ポップアップが表示されるので、問題なければ「選択した全てに変更を適用する」をクリックします。
1. 再び、リソースを検索します。①「タグ：Name」に設定した内容、②「タグ」には「４」が表示されました。③の識別子をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f5c40222-e318-35fd-024a-688c3c20a92e.png)

1. Glueのエディタに遷移するので「Job details」タブをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/69c8b13f-ae7d-ec38-2fb0-1579e435faf2.png)

1. サービスのTagsに設定されてました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/feda8dbc-7297-fbfe-e10b-6a2aea267e06.png)


# 考察
リソースタグについて、改めて整理してみました。当たりませですがタグ付けする前には戦略が大事。直近で自分が関心を持ったのは下記になります。これらをうまく使うことで統制が効きそうです。

- Security
    - tagsConfidentiality
- Business
    - Project
    - Owner
    - Cost Center

あまり、率先して使ってきませんでしたが今後は活用していこうと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/tag-editor/latest/userguide/tagging.html

https://docs.aws.amazon.com/ja_jp/tag-editor/latest/userguide/tag-editor.html