CloudFormation管理下のリソースに一括でタグをつける方法
1. はじめに
西藤です。
AWSのリソースにはタグを付けることができます。タグを付けることで、リソースを環境ごとに分類したり、アクセス制御に活用したり、コスト管理の分析に役立てることができます。ただし、ビジネスを進める上でタグの管理体制が整わないまま、AWSリソースが作成されることは現実的によくあることです。
今回は、そのような状況において、リソースが作成された後でも一括でタグを付与する方法を検証してみたいと思います。
2. 前提確認
この記事では、以下の前提のもと検証します。
- リソースはすべてCloudFormationで管理されている
- CloudFormationで管理されているすべてのリソースに一括でKey:
ManagementCode
, Value:12345
のタグを付けたい(これが一番実現したいこと)
3. 構成済みリソースの状況
上記の前提のもと、すでに以下のようなリソースがCloudFormationで管理されているとします。
- VPC内にEC2インスタンスが2台
Hello, World! from <Instance ID>
を表示するWebサーバーが稼働している
- その前段にALBが1台配置され、エンドユーザーはALBを経由してWebサーバーにアクセスする
4. 作業前の状況
上記の構成で、一括のタグ付け作業を行う前に、各リソースにどのようなタグが付いているか確認してみましょう。
作業前のEC2インスタンスのタグ状況
CloudFormationによってリソースが作成されているため、AWSの予約語であるaws:cloudformation:stack-name
やaws:cloudformation:logical-id
が付いていることがわかります。
そして、それとは別に、Name
というタグを付けていました。これは意図的に付けたものです。
作業前のALBのタグ状況
Application Load Balancerのリソースを確認すると、以下のスクリーンショットのように、AWSの予約タグは何も付いていませんでした。(これはCloudFormationのタグ機能のサポート状況によるものでしょう)
また、ALBには今回、意図的に追加したタグを設けていなかったため、何もタグが付いていませんでした。
そのほかのリソース
上記のようにCloudFormationによって管理されているリソースには、一部例外がありつつも、AWSの予約タグと意図的に追加したタグが付与されている状況です。AWS Resource Groupsを通じて確認すると、以下のような状況です。
Load Balancerにはタグが付いておらず、そのほかのリソースにはAWSの予約タグが付いているため、3つのタグがあります。また、EC2インスタンスにはName
というタグが追加されており、合計4つのタグが付いていることがわかります。
以上の状況がスタート地点になります。ここに表示されている各リソースに対して、一括で共通のタグを付けられれば、今回の目的は達成です。
5. 一括タグ付けの方法
今回、CloudFormation管理下のリソースに一括でタグを付ける方法として、CloudFormationの"Tags"機能を使います。
この機能は、マネジメントコンソールのUI上では「CloudFormationのスタックに付けられるタグ」かのように見えるかもしれませんが、実際にはCloudFormationのスタックに属するリソース全体に一括でタグを付けることができる機能です。コンソール画面には以下のように表示されます。
ここで設定したタグは、「スタックレベル」のタグとして、スタック内の対応しているリソースに適用されます。ステップを追って、一括タグ付けを行ってみましょう。
5.1. 更新を開く
スタック情報の画面から、"Update"(更新)をクリックします。
5.2. 既存のテンプレートを使用する
テンプレート変更は行わないため、"Use current template"(既存のテンプレートを使用)を選択します。差分を発生させないためにも、次の画面で出てくるパラメーターの変更も行いません。
5.3. タグを追加
スタックの詳細設定画面にある"Tags"(タグ)のセクションにて、今回一括適用したいタグ(Key: ManagementCode
, Value: 12345
)を追加します。
5.4. 変更点を確認
次の画面で、CloudFormationのプレビュー画面が表示されます。ChangeSetの内容を確認します。
すると、スタック内のすべてのリソースに対して変更が行われることがわかります。
タグの変更のみですので、これらのリソースで稼働している既存のアプリケーションには影響がないと考えられますが、"View change set"(変更セットを表示)をクリックして、詳細を確認します。
5.5. 変更セットの確認
変更セットの画面を見て、今回の変更によりリソースが一度削除されて再作成されるような"Replace"(置換)が行われるリソースがないことを確認します。
※リソースにおける破壊的変更が行われないかを十分に確認しましょう。※
今回の例では、置換は行われないと表示されています。既存のアプリケーションに影響がないことが確認できたら、"Execute change set"(変更セットを実行)をクリックします。
プロビジョニング時の挙動に関する確認が表示されますので、運用ポリシーに沿って選択し、実行します。
6. 結果確認
では、実行結果を確認します。
CloudFormationのイベントログを見ると、スタックの更新は1分もかからずに完了していることがわかります。
また、それぞれのリソースのタグを確認してみると、以下のようにタグが追加されていることがわかります。
作業後のEC2インスタンスのタグ状況
今回、追加したかったKey: ManagementCode
, Value: 12345
のタグが追加されています。
作業後のALBのタグ状況
こちらも、同様にタグが追加されています。
作業後のそのほかのリソースのタグ状況
EC2インスタンス・ALBはいずれも期待通りタグが追加されていることが確認できました。また、スタック内の多くのリソースに一斉にタグが付与され、統一感を持ったタグ適用が実現しました。各状況を一覧にすると以下のようになります。
リソースタイプ | タグの変更状況 |
---|---|
AWS::ElasticLoadBalancingV2::LoadBalancer | ○追加された |
AWS::ElasticLoadBalancingV2::Listener | ×変化なし |
AWS::ElasticLoadBalancingV2::TargetGroup | ○追加された |
AWS::EC2::Instance | ○追加された |
AWS::EC2::Instance | ○追加された |
AWS::EC2::InternetGateway | ○追加された |
AWS::EC2::Route | ×変化なし |
AWS::EC2::Subnet | ○追加された |
AWS::EC2::Subnet | ○追加された |
AWS::EC2::RouteTable | ○追加された |
AWS::EC2::SecurityGroup | ○追加された |
AWS::EC2::SubnetRouteTableAssociation | ×変化なし |
AWS::EC2::SubnetRouteTableAssociation | ×変化なし |
AWS::EC2::VPC | ○追加された |
AWS::EC2::VPCGatewayAttachment | ×変化なし |
多くのリソースにタグが付与されましたが、一部のリソースにはタグが付与されていないことがわかります。たとえば、RouteTableのRouteやSubnetRouteTableAssociation、Listenerにはタグが付与されていませんでした。RouteTableのRouteやSubnetRouteTableAssociationは、マネジメントコンソールから見てもタグを付けるUIがなかったため、このような結果になるのは想定通りですが、ロードバランサーのListenerにタグが付いていないのは想定外でした。
ドキュメントによると、CloudFormationによるタグ付けはサポートされているリソースに限られています。
自動的に作成されたタグを含むリソースへのスタックレベルのタグの反映は、リソースによって異なる場合があります。例えば、タグはブロックデバイスマッピングから作成された Amazon EBS ボリュームには反映されません。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html
このように、CloudFormationの"Tags"機能も対応していないリソースがあるため、注意が必要です。
7. まとめ
リソースのタグ付けは、リソース管理において重要な要素です。今回はCloudFormationによってリソースが管理されているという前提のもと、CloudFormationのTags機能を使うことで、そのスタック内に一律にタグを付与することができました。
しかし、すべてを網羅することはできませんでした。スタック内に共通でタグを付与できる点は便利でありつつ、ChangeSetの確認を怠らないことが重要です。
今回はCloudFormationを対象としておりましたが、タグの確認・操作においては
- Tag Editor
- Resource Groups
- AWS Config
などのサービスの活用も考えられます。これらはまた別の機会に検証し、ご紹介したいと思います。
以上、CloudFormationでリソースを管理している場合の一括タグ付け方法について、検証してみました。お役に立てれば幸いです。