【AWS】タグの付与と棚卸

# はじめに
AWSにおけるタグ管理において、タグの標準化や付与を実施する際にいくつか方法があるため、検討を行いました。

# タグ付与のベストプラクティス
[AWSリソースのタグ付けのベストプラクティス](https://docs.aws.amazon.com/ja_jp/whitepapers/latest/tagging-best-practices/tagging-best-practices.html)

タグ付けを実施する際、①～④のサイクルを回すことが重要です。
①ニーズとユースケースの定義
②タグスキーマの定義と公開
③タグの付与
④有効性の評価と改善

コスト管理やセキュリティに関しては今後の運用をある程度見据えて、AWS利用開始前にポリシーを整理しておくと良いのではないかと思います。

# タグ付与を強制する方法
予防的統制として①SCP、②IAM Policy、③CloudFormation hook、発見的統制として④resource-autotagger、⑤SecurityHub+Lambda、⑥AWS Config+Lambdaの大きく6つがあります。組織の状況やタグを通して何を実現したいか、という目的に合った方法を選択することになると思います。CloudFormationなどIaCを利用している場合はドリフトが発生してしまうため予防的統制、手動で構築している場合はIAM Policyまたは既にマネージドルールとして整備されている⑥AWS Config + Lambdaなどが選択しやすいと考えています。

| |[①SCP](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps_examples_tagging.html)|[②IAM Policy](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_tags.html)|[③CloudFormation hook](https://aws.amazon.com/jp/blogs/mt/proactively-keep-resources-secure-and-compliant-with-aws-cloudformation-hooks/)|[④resource-autotagger](https://aws.amazon.com/jp/blogs/news/tag-your-aws-resources-consistently-with-aws-resource-explorer-and-aws-cloudtrail/)|[⑤SecurityHub+Lambda](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/standards-tagging.html)|[⑥AWS Config+Lambda](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/required-tags.html)|
|---|---|---|---|---|---|---|
|概要|AWSリソース作成時特定のタグが付与されていない場合、リソース作成をブロック。|AWSリソース作成時特定のタグが付与されていない場合、リソース作成をブロック。|CloudFormationデプロイ時特定のタグが付与されていない場合、リソース作成をブロック。|新しく作成されたリソースに必要なタグを適用 。|「AWSリソースタグ付け標準」の機能を利用して、**特定**のタグが付与されているかどうかをチェック。特定のタグが指定されていない場合は、少なくとも1つ以上のタグが付与されているかをチェック。Labmdaを呼び出し、タグを付与する。|AWS Configのマネージドルール「required-tags」を利用してタグの有無をチェック。Lambdaを呼び出し、タグを付与する。|
|対応リソース|aws:RequestTag/tag-keyに対応しているリソース|aws:RequestTag/tag-keyに対応しているリソース|CloudFormation Resource Tags プロパティ対象リソース|AWS Resource GroupとTagging API対象リソース|AppConfig,EC2,Redshiftなど一部のサービス|EC2,RDSなど一部のリソース　<br>※カスタムマネージドルールを作成することで対応リソースを増やすことは可能|
|ユースケース|IaC/手動でリソースを作成している場合|IaC/手動ででリソースを作成している場合|IaC/手動ででリソースを作成している場合|手動でリソースを作成している場合|手動でリソースを作成している場合|手動でリソースを作成している場合|
|AWS Organizations必須かどうか|必須|必須ではない|必須ではない|必須ではない|必須ではない|必須ではない|
|注意事項|CloudFormationによるリソース作成時、短時間でもタグ付けされてないリソースが存在する瞬間があるとリソースが作成できないケースがあるため、ポリシーの設定に注意|-|-|-|チェックできるタグは1つまで|requrired tagsによって1度に確認できるタグは6つまで<br>※ルール自体を増やすことによって確認するタグを増やすことは可能|

# タグの棚卸・更新
タグの棚卸を実施する際、Tag EditorやAWS CLIを利用しての棚卸&追加・更新が考えられます。
手動でリソースを構築している場合は特に問題ないのですが、CloudFormationを利用している場合はドリフトが発生します。スタックの切り離しが可能なリソースは、インスタンスの再作成を避けるためCloudFormationからスタックを切り離し、タグを付与・更新、インポートする必要があります。インポートできるリソースについても種類が限られているため、変更を実施する場合は影響をしっかり確認する必要があります。

- [CLIで実施する方法](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli_resource-groups-tagging-api_code_examples.html)
- [GUIで実施する方法](https://docs.aws.amazon.com/ja_jp/tag-editor/latest/userguide/tagging-resources-view.html)


# 細かいTIPS

## ①AWS Configの制約
AWS Configは1つのルールでチェックできるタグが6つまでの制約があります。そのため、6つ以上のタグを強制する必要がある場合、複数のルールを作成する必要があります。
強制するタグの数が多い場合はタグのカテゴリ（セキュリティ、ビジネスタグetc)ごとにルールを作成すると責任分割も可能であり良いのかなと思います。


## ②[タグポリシー](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_tag-policies.html)
タグポリシーは組織のアカウントないのリソース間でタグを標準化する際に利用可能です。タグの付与を強制するのではなく、タグ付けのルール標準化に利用することができます。SCPやIAM Policyと並行して利用すると効果的だと思います。

## ③CloudFormation GuardとCloudFormation hooks
タグとは逸れますが、予防的統制として調査するなかでAWS CloudFomation GuardとCloudFormation hooksの2つに出会いました。

|---|[CloudFormation Guard(cfn-guard)](https://github.com/aws-cloudformation/cloudformation-guard)|[CloudFormation hooks](https://docs.aws.amazon.com/ja_jp/cloudformation-cli/latest/hooks-userguide/what-is-cloudformation-hooks.html)|
|---|---|---|
|チェックタイミング|デプロイ前|スタック操作の前後|

オープンソースのCLIツールとして提供されていたCloudFormation GuardはCloudFomration hookやAWS Configへ1機能として取り込まれたようです。
CloudFormation hooksを利用することで、Guardルールを事前に適用できるため、より簡単にルールの強制ができるようになりました。


# まとめ
コスト管理や運用自動化を検討していくうえで、タグの奥深さに気づきました。組織のアカウント払い出し状況や運用状況、要件によって選択肢は最適なアーキテクチャが異なりますが、皆様の検討の一助となれば幸いです。
タグを強制するだけでなく、今後タグを付与することによって何を実現したいのかやどのように運用していくかの整理が一番重要であるという学びを得ました。

# 参考URL
[AWSリソースのタグ付けベストプラクティス](https://docs.aws.amazon.com/ja_jp/whitepapers/latest/tagging-best-practices/building-your-tagging-strategy.html)