複数の CloudWatch Alarm に対して一括でタグを付与する方法

2024.02.29

アノテーション 顧客推進チーム(構築担当)のいたくらです。
複数の CloudWatch Alarm に対して一括でタグを付与したくなったことありませんか?私はあります。
ということで、シェルスクリプトを作成したので共有します。

2024/04/09 追記
2024/04/05 より、Amazon CloudWatch が AWS CloudFormation によるアラームのタグ付けをサポートするようになりました!
・公式情報:Amazon CloudWatch now supports tagging alarms with AWS CloudFormation
・関連 Issue:https://github.com/aws-cloudformation/cloudformation-coverage-roadmap/issues/64

背景

検証で CloudFormation テンプレートを使用して CloudWatch Alarm をまとめて作成したんですが、タグを付与するのを忘れていました。
CloudFormation テンプレートを修正して、変更セットを作って更新すればいいか~と思い、いざ CloudFormation のユーザガイドを確認すると、Type: "AWS::CloudWatch::Alarm" にタグのパラメータがありませんでした。
参考:AWS::CloudWatch::Alarm - AWS CloudFormation

ええ…マネコンで付与しないといけないの…?と思い調べていくと、Amazon CloudWatch リソースにタグを付ける - Amazon CloudWatch にたどり着きました。
なるほど、tag-resource AWS CLI コマンドと TagResource API しか提供されていませんでした。

ということで、今回は tag-resource AWS CLI コマンドを使用したシェルスクリプトを作成しました。

結論

こちらがアカウント上にあるアラームすべてに対して、一括でタグを付与するシェルスクリプトです。

add_tag.sh

#!/bin/bash

#CloudWatch アラームの名前と ARN を取得する
alarm_info=$(aws cloudwatch describe-alarms --query 'MetricAlarms[*].[AlarmName,AlarmArn]' --output text)

#取得した情報を行ごとにループ処理する
while read -r alarm_name alarm_arn; do
    echo "Adding tag to alarm: $alarm_name"

#タグをアラームに付与する
    aws cloudwatch tag-resource \
    --resource-arn "$alarm_arn" \
    --tags Key=Name,Value="$alarm_name"

done <<< "$alarm_info"

<説明>
Name タグの値としてアラーム名を設定したいので、まずアラーム名と tag-resource の引数に必要な ARN を取得しています。
取得した情報を基にタグをアラームに付与しています。
今回は Name = アラーム名 というタグを付与する場合ですが、少し変更すれば Env = prod / stg といったタグもまとめて付与できます。

<実行結果例>

$ sh add_tag.sh 
Adding tag to alarm: xxxxxx-CPUUtilization-80-percent-over
Adding tag to alarm: xxxxxx-CPUUtilization-90-percent-over
Adding tag to alarm: xxxxxx-DiskUsage-80-percent-over
Adding tag to alarm: xxxxxx-DiskUsage-90-percent-over
Adding tag to alarm: xxxxxx-MemoryUsed-80-percent-over
Adding tag to alarm: xxxxxx-MemoryUsed-90-percent-over
Adding tag to alarm: xxxxxx-CPUUtilization-80-percent-over
Adding tag to alarm: xxxxxx-CPUUtilization-90-percent-over
Adding tag to alarm: xxxxxx-DiskUsage-80-percent-over
Adding tag to alarm: xxxxxx-DiskUsage-90-percent-over
Adding tag to alarm: xxxxxx-MemoryUsed-80-percent-over
Adding tag to alarm: xxxxxx-MemoryUsed-90-percent-over

応用

ある文字列(例: CPU)を含むアラームに対してのみ、タグを付与するシェルスクリプトです。

add_tag_2.sh

#!/bin/bash

#CloudWatch アラームの名前と ARN を取得する
alarm_info=$(aws cloudwatch describe-alarms --query 'MetricAlarms[*].[AlarmName,AlarmArn]' --output text)

#取得した情報を行ごとにループ処理する
while read -r alarm_name alarm_arn; do
    # アラーム名に "CPU" が含まれる場合にのみ処理を行う
    if echo "$alarm_name" | grep -q "CPU"; then
        echo "Adding tag to alarm: $alarm_name"

#タグをアラームに付与する
        aws cloudwatch tag-resource \
        --resource-arn "$alarm_arn" \
        --tags Key=Name,Value="$alarm_name"
    fi
done <<< "$alarm_info"

<実行結果例>

$ sh add_tag_2.sh 
Adding tag to alarm: xxxxxx-CPUUtilization-80-percent-over
Adding tag to alarm: xxxxxx-CPUUtilization-90-percent-over
Adding tag to alarm: xxxxxx-CPUUtilization-80-percent-over
Adding tag to alarm: xxxxxx-CPUUtilization-90-percent-over

番外編

アカウント上にあるアラームに付与されているタグを一括で削除するシェルスクリプトです。

delete_tag.sh

#!/bin/bash

#CloudWatch アラームの ARN を取得する
alarm_arns=$(aws cloudwatch describe-alarms --query 'MetricAlarms[*].[AlarmName,AlarmArn]' --output text)

#取得した ARN を行ごとにループ処理する
while read -r alarm_name alarm_arn; do
    echo "Removing Name tag from alarm: $alarm_arn"

#タグをアラームから削除する
    aws cloudwatch untag-resource \
    --resource-arn "$alarm_arn" \
    --tag-keys Name

done <<< "$alarm_arns"

<実行結果例>

$ sh delete_tag.sh 
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-CPUUtilization-80-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-CPUUtilization-90-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-DiskUsage-80-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-DiskUsage-90-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-MemoryUsed-80-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-MemoryUsed-90-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-CPUUtilization-80-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-CPUUtilization-90-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-DiskUsage-80-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-DiskUsage-90-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-MemoryUsed-80-percent-over
Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-MemoryUsed-90-percent-over

あとがき

CloudFormation テンプレートでタグを付与できない場合もあるんだなと勉強になりました。
この記事がどなたかのお役に立てれば幸いです。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。