リソースへのタグ付けを一網打尽にする(タグエディタ編/AWS CLI編)

諸君 私はタグ付けが好きだ
諸君 私はタグ付けが好きだ
諸君 私はタグ付けが大好きだ

▲ 言うほど好きかは分からない

夏休みの最後に宿題を駆け込んでやっているようなタイミングでブログを書いているなと感じております。
こんにちは、AWS事業本部のShirotaです。
今回は、終始こんな感じで「AWS上のリソースに一気にタグを付けていく」話をさせて頂こうと思います。
このノリを把握した上で読みたい方は、「よろしいならば戦争だ」で検索して頂く事を推奨致します。

このAWS上で行われるありとあらゆる便利なタグ付けが大好きだ

AWSリソースの管理を行う為にタグを利用していますか?
タグを付けておくとコストを分析したいリソースや操作したいリソースの特定などがやり易くなります。
リソース作成時にタグの付与は勿論出来ますし、リソース作成後の任意のタイミングでタグの付与が出来ます。
リソース作成後のタグ付けの際、各リソースに対して手作業でタグを付与していくのは大変です。特にリソースの数が多くなればなるほど大変になります。

タグエディタで大量のリソースに一気にタグ付けした時など心がおどる

そういった時には、「タグエディタ」が便利です。タグエディタを使えば、複数のリソースに一括でタグを付与することができます。
例えば、WorkSpacesで作成されたセキュリティグループが分かり易くなるようにタグエディタを用いてNameタグを付けてみます。

タグエディタの画面では、以下のようにリソースを絞り込むことが可能になっています。

▲ こんな条件で絞り込みをかけてみます

この時点で完全に絞り込めていなかった場合は更にフィルタを掛けても良いし、表示されたリソースから該当するリソースだけを選択していく事も出来ます。

▲ 今回は絞り込めたので全選択

選択したリソースに追加したいタグを入力します。

▲ Nameタグを追加してみます

実行前にレビューのポップアップが出ます。
追加したいタグとリソース数を確認して、実行しましょう。

▲ リソースを選択した時に数を確認しておく事をオススメします

今回追加したタグが付与されたかを確認してみます。
4つのリソースに一気にタグ付けする事が出来ました。

▲ リソースが50個、100個になってもどんとこい

ちなみに、絞り込んだリソースが表示される領域には、「Choose up to 500 resources for which you want to edit tags.」と記載がある為、タグエディタで同時にタグが付与できるリソースの上限は 500個まで だという事が分かります。

タグエディタに対応していないリソースだと気付くのは屈辱の極みだ

便利なタグエディタですが、 現在タグエディタに対応していないリソースもあります
例えば、CloudWatch Logsのロググループ。
AWSのユーザーガイド では、以下のようにロググループにタグ付けするユースケースを紹介しています。

タグを使用すると、ロググループを分類できます。たとえば、目的、所有者、環境などに基づいて分類できます。タグごとにキーと値を定義するため、特定のニーズを満たすためのカテゴリのカスタムセットを作成できます。たとえば、所有者と、関連するアプリケーションに基づいてロググループを追跡するのに役立つタグのセットを定義できます。次にいくつかのタグの例を示します。

・プロジェクト: プロジェクト名
・所有者: 名前
・目的: 負荷テスト
・アプリケーション: アプリケーション名
・環境: 本稼働

タグを使用して、AWS コストを分類して追跡できます。AWS リソース (ロググループなど) にタグを適用すると、AWS のコスト配分レポートに、タグ別に集計された使用状況とコストが表示されます。自社のカテゴリ (たとえばコストセンター、アプリケーション名、所有者) を表すタグを適用すると、複数のサービスにわたってコストを分類することができます。

しかし、CloudWatch Logsのロググループは2019年8月31日現在、タグエディタに対応していません。
上記で紹介したAWSのユーザーページには「AWS CLI または CloudWatch Logs API を使用して」タグ付けをするよう記載があります。
例えば、AWS CLIで「/hogehoge/log-group」というロググループにNameタグ「piyo」をタグ付けしようとした際には以下のようなコマンドを実行する事になります。

  
aws logs tag-log-group --log-group-name /hogehoge/log-group --tags Name=piyo  

この時、--log-group-nameではユニークなロググループを指定する必要がある為、このままAWS CLIを利用すると一つ一つロググループに対してコマンドを実行する事になってしまいます。
面倒ですよね。
10回くらいでもやるのは面倒ですよね

よろしい ならばシェルスクリプトだ

という訳で、今回は「AWS CLIを用いて、特定の文字列が入ったロググループ全てに特定のタグを付与する」シェルスクリプトを作ってみました。

タグ付けまでのフローを簡単にまとめてみます。

  • 自環境にあるロググループの一覧を取得
  • ロググループ一覧から、特定の文字列が入ったロググループをピックアップ
  • ピックアップされたロググループに、付与したいタグがあるかどうかの判定
  • 無かった場合にはタグを付与する

今回、事前にロググループの一覧は以下のAWS CLIで取得してファイルに出力しておきました。

  
aws logs describe-log-groups --query "logGroups[].[logGroupName]" --output text > ./log-group-list.txt  

実際に作ったシェルスクリプトはこちらです。

  
#!/bin/bash

sed -n '/'$1'/p' < ./log-group-list.txt | while read loggroup
do
  echo "Tag check"
  aws logs list-tags-log-group --log-group-name $loggroup
  tag=`aws logs list-tags-log-group --log-group-name $loggroup --query "tags.BilligGroup"`
  if [ $tag = null ]; then
    aws logs tag-log-group --log-group-name $loggroup --tags BillingGroup=$1
    echo "Add $1 Tag"
    aws logs list-tags-log-group --log-group-name $loggroup
  else
    echo "Skipping..."
  fi
done  

例えば、「hoge-dev環境で使っているロググループ(hoge-devの文字列がどこかしらに入っている)に、「BillingGroup:hoge-dev」というタグを付与してコスト分類が出来るようにしたい」時に、このシェルスクリプトを使ってみます。

  
$ ./tageditor.sh hoge-dev
Tag check
{
    "tags": {
        "BillingGroup": "hoge-dev"
    }
}
Skipping...
Tag check
{
    "tags": {}
}
Add hoge-dev Tag
{
    "tags": {
        "BillingGroup": "hoge-dev"
    }
}  

既に「BillingGroup:hoge-dev」が付与されていたロググループはスキップされ、タグがまだ付与されていなかったロググループではタグ付けが実行されました。
これなら、一回スクリプトを実行するだけで特定した複数のロググループにタグ付けを実行してくれます。
タグエディタで実装されていなかったとしても、AWS CLIをシェルスクリプトで使う事により一気にタグ付けをする事が可能になりました。

あるものを組み合わせてタグ付けを効率良くやる

「よろしい ならばシェルスクリプトだ」が言いたかった……のもありますが、複数のロググループにコストタグを付ける必要があり、シェルスクリプトを考えたのでブログにまとめてみました。
ここにインクリメントを追加してロググループの数をカウントしてみたり、引数を増やしてより自由なタグ付けを可能にしたりとまだまだ色々便利な使い道があると思うので、良かったら色々といじりながら使ってみて下さい。
大量のタグ付けに困っている誰かのお役に立てれば幸いです。

Q. HELLSING好き?
A. HELLSINGもドリフターズも好き