【簡単】AWS CLIで一括タグ付けしてみた


冬はやっぱしさびーなー…
クラウドソリューション開発部の北島です。
「誰が作成者?」「何のプロジェクトのリソース?」と思ってしまうタグ無しリソースを見つけたことがある人もいるのではと思います。

本記事は、こんなタグ無しの既存リソースに後から大量のタグを付けることになり、死んだ目をしているエンジニアに捧げます!

タグ無しリソースが点在

そもそもタグは検索や分類を行ったり、金銭的コストを管理するために使用されます。

しかしながら、開発環境となると「いったん動くことを検証できたらいい」、「本番環境ほどガチで管理しなくてもいい」という、構築者の甘えによりタグ付けされていないリソースが点在しているように思えます。

実際に開発環境を見直していると、タグが付いていないリソースがいくつも見受けられました。タグの未設定は単なる“見た目の整ってなさ”ではなく、運用の不透明さを増幅させる問題となるため、何とかしたいですね。

人力作業による疲労

私も実際、業務の中で既存の開発環境リソースに対するタグ付け作業を振られました。

構築時のドキュメントを見ながらリソース名を検索し、タグ付けする作業を行いました。結論、だるい!リソース名以外はどのリソースにも共通するタグを10-20件ほどつけていくのですが、時間の無駄感が否めない。虚無感に襲われました。

結局その時は、「効率的なタグ付け方法を模索するよりも人力で作業したほうが早い!」という判断のもと、調査は後にして作業を進めました。

タグ付け救世主の存在

その後、今後のために効率的な方法がないか調べてみることにしました。業務の中でLambdaやGatewayをCLI上でデプロイすることもあり、「タグ付けもCLI上で楽にできないかな?」と模索していたところ、Resource Groups Tagging APIをCLI上で活用できることがわかりました。
このAPIの素晴らしい点は、「サービスを問わず、同じコマンド(tag-resources)で一括タグ付けができる」 という点です。通常、Lambdaなら lambda tag-resource、S3なら s3api put-bucket-tagging とコマンドがバラバラなのですが、これを使えば共通化できます。

今回は、対象リソースのARNに該当サービス名が含まれている前提で進めます。

実際にやってみた

事前準備

大前提として、AWS CLIがインストールされているかを確認しましょう。

インストールや設定がなされていない場合は公式の手順に沿ってセットアップしてください。

Resource Groups Tagging APIを使用するために、自身が利用するIAMポリシーの設定も行いましょう。

対象リソースのリストアップ

今回はリソース名にサービス名(test-a)が含まれているリソースに、以下のタグを一括でつける操作を行います。

    • User=hiromu.kitajima
    • ProjectCode=Tech
    • Environment=Development

ここで注意点があります。taggingapi の「取得」コマンドは、タグが一つも付いていないリソースは検索にヒットしないという仕様があります。そのため、今回は各サービスの専用コマンドを使って、名前に test-a を含むリソースのARNを確実に抽出します。

まずはこれから何を書き換えるのかを明確にします。今回はS3とLambdaの中から、名前に”test-a”を含むものを抽出して確認します。

Lambda関数:

S3バケット:

実行結果として、以下のような出力がされればリストアップは成功です。
私の場合、実行時に特定のIAM権限を持つプロファイルを使用しているため、各コマンドに–profileオプションを付与して実行しています。

一括タグ付けの実行

対象が確認できたら、いよいよ一括でタグを付与・更新します。先ほどのリストをパイプで繋ぎ、一気に処理を流し込みます。

  • xargs の使い方や同時実行数の調整は環境や対象数に依存します。必要に応じて並列処理を制御してください。
  • --resource-arn-list は複数 ARN を同時に渡せますが、ここでは xargs で 1 件ずつ処理しています。対象が多数ある場合はバッチ化を検討しましょう!
    LambdaとS3の2件分が表示されれば成功となります。

更新後の確認

最後に、意図した通りにタグが反映されているか確認します。付与したタグ名でフィルタリングして、先ほどのリソースがヒットするか検証しましょう!

テーブルで該当リソースにタグ付けされていることが確認できます!

コンソール画面でも確認すると正常にタグ付けされていますね!

所感

今回は、CLIで一括タグ付けを行いました。 Resource Groups Tagging APIを利用してみた感想として、すぐ実行ができる手軽さが魅力だと思いました。スクリプトにまとめる前の挙動確認や、簡単な調査で使えそうです。

一方で、抽出条件やタグの付け替え等の複雑な処理が増えた場合、コマンドの可読性が落ちると感じました。特に今回は、タグ指定時のスペースの扱いやJSON形式での記述など、AWS CLI特有の「お作法」に苦戦する場面もありました。こうした仕様のクセを含め、今回のような「一括タグ更新」や「リソース削除」などの破壊的または広範囲な作業は、やはりスクリプト化して事前に内容をしっかり確認できるようにすべきだと感じました。

ちなみに、AWSコンソールの「Resource Groups & Tag Editor」でも複数リソースを検索・選択して一括でタグ付けができます。UI操作は直感的で、少量のリソースや単純なタグ付けなら素早く作業できますが、複雑な条件や大量リソース、再現性や自動化を重視する場合はCLI+APIの方が向いていると思いました。そのため、目的や規模、運用スタイルによって両者をうまく使い分けすべきと感じました。

また、リソースごとに異なる「Name」タグを付けるようなケースでは、圧倒的にシェルスクリプトが適切です。 もっとも、シェルスクリプトの作成にも相応の時間がかかります。

結論として、リソース作成の段階で「だるい」と思っても、最初にしっかりとタグ付けをしておくのが、結果として一番楽な道ですね。

 

最後までお読みいただきありがとうございました。
また、エコモットでは一緒にモノづくりをしていく仲間を随時募集しています。
弊社に少しでも興味がある方はぜひ下記の採用ページをご覧ください!