CI2部 技術2課の山﨑です。
AWSリソースを設計する際に一度は目にしたことがある「タグ」の設定ですが、多くのAWSリソースではオプションとしてタグが付与できるようになっています。
今回はAWSリソースのタグ設計について考えてみました。
AWSリソースにおけるタグ
タグとは?
You can assign metadata to your AWS resources in the form of tags. Each tag is a label consisting of a user-defined key and value. Tags can help you manage, identify, organize, search for, and filter resources. You can create tags to categorize resources by purpose, owner, environment, or other criteria.
引用元:Tagging AWS resources - AWS General Reference
AWS公式ドキュメントには、AWSリソースに付与することができるメタデータを「タグ」と呼んでおり、何らかの基準・目的に従ってリソースを分類・識別・検索するために使用するといったことが書かれています。
タグの基本
タグ設計について考える前にタグに関する基礎知識について整理しておきます。
- タグは「タグキー」と「タグ値」の2つの要素から構成される。
- タグキー = Name
- タグ値 = Yamasaki
- 1つの「タグキー」には、1つの「タグ値」のみが付与できる。
- 「タグキー」と「タグ値」に設定する値では、大文字と小文字が区別される。
- UTF-8 では「タグキー」は 1 文字以上で、最大 128 文字の Unicode 文字が利用できる。
- UTF-8 では「タグ値」は 0 文字以上、最大 256 文字の Unicode 文字が利用できる。
- 「タグキー」と「タグ値」に使用できる文字は通常、UTF-8 対応の文字、数字、スペースと、 _ . : / = + - @ の文字であるが、AWSサービスごとに異なる。
- aws: プレフィックスは AWS専用として予約されている。
- 1つのリソースに対して最大50個までタグを付与することができる。
何を設計する必要があるのか?
タグ設計では、AWSリソースを分類・識別・検索するために使用する「タグキー」と「タグ値」の組み合わせについて検討し、設計を行うことになります。
要素 | 設計内容 |
---|---|
タグキー | AWSリソースを分類・識別・検索する「目的」を定める |
タグ値 | タグキーで設計した「目的」に即した「値」を決める |
タグキーの設計 ー「目的」を定める
AWSドキュメントには一般的なタグ付け戦略として、以下4つの観点が示されています。
観点 | 内容 |
---|---|
リソース整理 | AWSリソースを一意に識別したり、グルーピングしたりするためにタグを付与する。 |
コスト管理 | AWS 利用料が発生するAWSリソースにタグを付与することで、AWS利用料を追跡できるようにする。(コスト配分タグ) |
自動化対象リソースの識別 | AWSリソースに対するオペレーションを自動化する際、自動化対象のリソースを識別するためにタグを付与する。 |
アクセス制御 | AWSリソースに対して条件付きのアクセス制御を実施するためにタグを付与する。 |
リソース整理
AWSリソースを一意に識別したり、グルーピングしたりすることを目的にタグを付与します。例えば、以下のようなタグキーが考えられます。
タグキーの例
タグキー | 説明 |
---|---|
Name | AWSリソース名を一意に識別する |
Environment | AWSリソースが構築されている環境(本番/検証/開発/DR等)を整理し、グルーピング可能な状態にする |
Project | AWSリソースがどのようなプロジェクトにおいて構築されたのかを整理し、グルーピング可能な状態にする |
Service | AWSリソースが利用されているアプリケーションやシステムを識別し、グルーピング可能な状態にする |
Vendor | AWSリソースを構築した外部ベンダーを識別し、グルーピング可能な状態にする |
DivisionCode | AWSリソースを所有・管理している部署を識別し、グルーピング可能な状態にする |
Company | AWSリソースを所有・管理している企業を識別し、グルーピング可能な状態にする |
Confidential | 機密性が高いデータを処理・保管しているAWSリソースを識別し、グルーピング可能な状態にする |
リソース整理をしたら何が嬉しいの?
- AWSサービスのコンソール画面の検索ウィンドウでタグを基に検索をかけることができます。
- タグエディタを利用してAWSリソースを検索したり、該当のタグを一括更新することができます。
- タグエディタについては以下の弊社ブログをご覧ください。 blog.serverworks.co.jp
- リソースグループを作成し、タグごとにAWSリソースをグルーピングすることができる。
- 同一タグであれば、リソースタイプが異なっていてもグループリソースとして一覧化してくれる
余談
AWSリソースを検索するためのサービスとしてAWS Resource Explorerというサービスがあります。これはAWSアカウント内のAWSリソースに対して名前、タグ、IDなどのリソースのメタデータを使用して簡単にリソース検索ができるものです。AWS Resource Explorer がサポートしているAWSリソースについては以下のリンクをご覧ください。
Resource types you can search for with Resource Explorer - AWS Resource Explorer
コスト管理
AWS 利用料が発生するAWSリソースにタグを付与することで、AWS利用料を追跡できるようにします。これをコスト配分タグと呼びます。
コスト配分タグについては以下の弊社ブログに詳細な内容が記載されていますので是非ご覧ください。ここではポイントを簡単に整理します。
コスト配分タグは請求先AWSアカウントで有効化する(すでに付与されているタグキーから有効化するものを選択)
AWSリソースにはタグの付与をサポートしていないAWSサービスがあるため事前に確認が必要
- AWSリソースがコスト配分タグをサポートしていない場合があるため事前に確認が必要
- 例:EIPはタグの付与はサポートされているが、コスト配分タグには対応していない。
コスト配分タグ(タグキー)の例
タグキー | 説明 |
---|---|
Environment | AWSリソースが構築されている環境(本番/検証/開発/DR等)ごとにタグを付与して、AWS利用料を追跡できるようにする |
Service | AWSリソースが利用されているアプリケーションやシステムごとにタグを付与して、AWS利用料を追跡できるようにする |
DivisionCode | AWSリソースを所有・管理している部署ごとにタグを付与して、AWS利用料を追跡できるようにする |
Company | AWSリソースを所有・管理している企業ごとにタグを付与して、AWS利用料を追跡できるようにする |
コスト配分タグを付与したら何が嬉しいの?
- コスト配分タグを有効化することにより、AWS利用明細においてコスト配分タグ別に利用料を確認することができる
- AWS利用料を分析する際に利用するAWS Cost Explorerにおいて、コスト配分タグでフィルタリングすることができる
自動化対象リソースの識別
AWSリソースに対するオペレーションを自動化する際、自動化対象のリソースを識別することを目的にタグを付与します。オペレーションの自動化ではAWS Systems ManagerやAWS Backup、サードパーティ製品を活用するケースが多いです。例えば以下のようなタグキーが考えられます。
タグキーの例
タグキー | 説明 |
---|---|
SSM-Patch | SSM Patch Managerでパッチ適用を自動化するAWSリソースを識別し、グルーピング可能な状態にする |
SSM-Params | SSM Parameter Storeで保存している設定ファイルを適用するAWSリソースを識別し、グルーピング可能な状態にする |
Backup | AWS Backupでバックアップを自動化するAWSリソースを識別し、グルーピング可能な状態にする |
Monitor | サードパーティー製品を使って運用をするAWSリソースを識別し、グルーピング可能な状態にする |
CA_daily_ami_copy | 弊社が提供している運用自動化ツール「CloudAutomator 」を利用して日次でAMIを取得するAWSリソースを識別し、グルーピング可能な状態にする ※ここでは「CloudAutomator 」について言及したが、その他のサードパーティ製品を利用する場合も考え方は同様です。 |
自動化対象リソースの識別ができたら何が嬉しいの?
- Systems Manager や AWS Backup で運用オペレーションを自動化する際、自動化対象リソースをタグで指定できるため1つ1つのリソースを指定する手間が省ける
アクセス制御
AWSリソースに対して条件付きのアクセス制御を実施することを目的にタグを付与します。タグを活用したアクセス制御はAWSにおいてはABAC(Attribute-based Access Control)と呼ばれます。以下は、「Environment」というタグキーに対して「prd」というタグ値が付与されているAWSリソースに対して、EC2の削除操作を禁止するというIAM Policyです。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyEC2Termination", "Effect": "Deny", "Action": "ec2:TerminateInstances", "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/Environment": "prd" } } } ] }
タグを活用したアクセス制御については、以下の弊社ブログも合わせてご覧ください。
タグでアクセス制御ができたら何が嬉しいの?
- ユーザーごとにアクセス可能なAWSリソースを制御することができる
- 部署AのユーザーAは、部署Bが管理しているAWSリソースを閲覧できないように制御する
- AWSアカウント内で複数のベンダーがAWSリソースを構築している場合、ベンダーごとに操作可能なAWSリソースをタグで制御することができる
タグ値の設計 ー「目的」に即した「値」を決める
上述したタグキーの設計における4つの目的に即したタグ値の例をいくつか列挙したいと思います。コスト管理、アクセス制御についてはすでに付与しているタグを活用するためタグ値の例は割愛します。また、最終的に設定するタグ値については命名規則やポリシーに従ってご判断ください。
リソース整理
タグ値の例
タグキー | タグ値の例 |
---|---|
Name | ・ec2-sampleapp-prd-web ※<AWSリソースコード>-<システムコード>-<環境名>-<役割> ・s3-sampleapp-prd-cloudtrail-111122223333 ※<AWSリソースコード>-<システムコード>-<環境名>-<役割>-<アカウントID> |
Environment | prd, stg, dev, dr, poc |
Project | sample-project, prj-x |
Service | hr, sales, hr-system, sales-system, hr-service, sales-service |
Vendor | serverworks |
DivisionCode | it-department, business-unit1, retail-group |
Company | Example-Corp, SWX-Inc |
Confidential | Address, PersonalHealthNumber, BankAccountNumber |
自動化対象リソースの識別
タグ値の例
タグキー | 説明 |
---|---|
SSM-Patch | win2019, amazon-linux2, rhel8, ubuntu2204 |
SSM-Params | cwlogs-win2019, cwlogs-rhel8 |
Backup | daily, weekly, ami-daily, ami-weekly |
Monitor | zabbix, datadog, newrelic, splunk, cloudone |
CA_daily_ami_copy | true, false |
タグの統制
タグ設計をしても、いざAWSリソースを構築する際にタグを付け忘れたり、事前に決めたものとは異なる値(prd ではなく Prd)を設定してしまうとタグを上手く活用することができません。そこで、タグ設定に対する統制方法について最後に触れます。
タグの付け忘れを検知する
AWS Config Rules のマネージドルールに「required-tags」というルールがあり、これを設定することによりタグの付け忘れ、具体的には指定のタグが設定されているかどうかをチェックすることができます。EventBridge と SNS、AWS Chatbotと連携することでタグの付け忘れに対して通知設定を実装することも可能です。ただし「required-tags」でサポートされているAWSリソースは以下のサービスとなります
- ACM::Certificate
- AutoScaling::AutoScalingGroup
- CloudFormation::Stack
- CodeBuild::Project
- DynamoDB::Table
- EC2::CustomerGateway
- EC2::Instance
- EC2::InternetGateway
- EC2::NetworkAcl
- EC2::NetworkInterface
- EC2::RouteTable
- EC2::SecurityGroup
- EC2::Subnet
- EC2::Volume
- EC2::VPC
- EC2::VPNConnection
- EC2::VPNGateway
- ElasticLoadBalancing::LoadBalancer
- ElasticLoadBalancingV2::LoadBalancer
- RDS::DBInstance
- RDS::DBSecurityGroup
- RDS::DBSnapshot
- RDS::DBSubnetGroup
- RDS::EventSubscription
- Redshift::Cluster
- Redshift::ClusterParameterGroup
- Redshift::ClusterSecurityGroup
- Redshift::ClusterSnapshot
- Redshift::ClusterSubnetGroup
- S3::Bucket
タグを一括で付与、更新する
タグを付け忘れたり、タグキーに設定したタグ値の値を一括で更新したい(組織変更等)場合はすでにご紹介したタグエディタを活用することができます。
タグエディタについては以下の弊社ブログをご覧ください。 blog.serverworks.co.jp
付与するタグの標準化
AWS Organizations を利用している場合、タグポリシーという機能を利用することができます。これはAWSリソースに付与可能なタグの標準化を各AWSアカウントに強制し、結果として「タグの入力間違い」を防ぐことが可能となる制御ポリシーです。
タグポリシーについては以下の弊社ブログに詳細な内容が記載されていますので是非ご覧ください。ここではポイントを簡単に整理します。
- タグキー大文字化コンプライアンス
- タグキーの大文字小文字を制御する
- タグ値コンプライアンス
- 指定のタグキーに対して、予め定義したタグ値のみが入力できるように制御する
- 強制するリソースタイプ
- 統制の対象とするAWSリソースを指定する
まとめ
長文でしたがご一読いただき有難うございます。今回はAWSリソースを設計する際に一度は目にしたことがある「タグ」の設定について考えてみましたが、「タグ」1つ取ってもなかなか奥深いものだなと思いました。
タグ設計については以下のブログも合わせて是非ご覧ください
山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ
2019/12〜2023/2までクラウドインテグレーション部でお客様のAWS導入支援を行っていました。現在はIE(インターナルエデュケーション)課にて採用周りのお手伝いや新卒/中途オンボーディングの業務をしています。2023 Japan AWS Top Engineers/2023 Japan AWS Ambassadors