複数の EC2 インスタンスごとに同一のタグを付与するスクリプトを作ってみた

記事タイトルとURLをコピーする

こんにちは!エンタープライズクラウド部ソリューションアーキテクト2課の日高です。(ちなみに今期から技術2課改め、ソリューションアーキテクト2課になりました!)

もし私のことを少しでも知りたいと思っていただけるなら、私の後輩が書いてくれた以下のブログを覗いてみてください。

sabawaku.serverworks.co.jp

今回は「複数の EC2 インスタンスごとに同一のタグを付与するスクリプト」を作成したので、そちらについてブログを記載しようと思います。

はじめに

上記イメージ図のように、複数のEC2インスタンスに同一のタグを付与したいという要件がありました。
多くの場合、複数リソースに同一のタグを利用する際、Tag Editorが真っ先に思い浮かびます。

ただし、Tag Editorを使用する場合、以下のように手動でEC2の識別子を選択していく必要があります。

今回の要件では、約1000台のEC2インスタンスに対して、例えば「インスタンス①〜④にはこのタグを、インスタンス⑤〜⑨には別のタグを」といったように、複数のインスタンスのグループごとにタグを付与する必要がありました。

これを手動で行うのは大変な労力が必要であり、作業量が多いためにミスが発生する可能性もあります。
そのため、複数のEC2インスタンスに一括で同一のタグを付与するためのスクリプトを作成しました。

前提と作成したスクリプト解説

前提

  • AWS CLIがインストールされている
  • スイッチロールできる設定が済まされている(AWS CLI の設定 (~/.aws/config ファイル) にて、ロールの情報が設定されている)
  • 実行環境のOSがMacOS

※スイッチロールではなく、デフォルトに設定されているアカウントでスクリプトを実行したい場合は、スクリプトの「PROFILE="プロファイルを指定してください"」と「--profile $PROFILE」を削除して利用してください。

また、筆者の実行環境(OSとシェル)は以下です。

% sw_vers
ProductName:        macOS
ProductVersion:     14.0
BuildVersion:       23A344

% bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23)
Copyright (C) 2007 Free Software Foundation, Inc.

作成したスクリプト

このスクリプトは、指定したAWSプロファイルを使用して、特定のインスタンスIDリスト(※「必要なファイルの準備」で詳細は記載します)から読み取った各EC2インスタンスにタグを付与します。

#!/bin/bash -eu

# 使用するAWSプロファイル名を引数から取得
PROFILE="<プロファイルを指定してください>"

# タグを付与するインスタンスIDのリストを含むファイル
INSTANCE_LIST="<インスタンスIDのリストを含むファイルを指定>"

# 付与するタグ(ここでは例としてProjectというキーにMyProjectという値を設定)
TAG_KEY="Project"
TAG_VALUE="MyProject"

# インスタンスリストを読み込み、各インスタンスにタグを付与
while IFS= read -r instance_id; do
    echo "タグを付与中: $instance_id"
    aws ec2 create-tags --resources "$instance_id" --tags Key="$TAG_KEY",Value="$TAG_VALUE" --profile "$PROFILE"
done < "$INSTANCE_LIST"

echo "完了"

※必要なファイルの準備
スクリプトを実行する前に、タグを付与するインスタンスIDのリストを含むファイルを準備する必要があります。
例えば、instance.txtという名前のファイルを作成し、以下のようにインスタンスIDを記載します。

i-123456789abcd
i-1dalkfhdlafjabcd
i-dafer3093849

このファイルをスクリプトが参照し、記載された各インスタンスIDにタグを付与します。

利用方法

準備

  • 上記のスクリプトを実行するフォルダ配下に作成する。
  • インスタンスIDリストが記載されたファイルを準備する

※この際PROFILESINSTANCE_LISTTAG_KEYTAG_VALUEはご自身が実行したいものに書き換えてください。

実行コマンド

  • 下記コマンドを実行します。
  • bash <保存時のスクリプト名>
    • 私の場合は「ec2-Tags-add.sh」で保存しているのでbash ec2-Tags-add.shが実行コマンドになります。

スクリプトの実行結果

インスタンスにタグを付与する際、スクリプトは標準出力に進行状況を表示し、完了後には完了と出力します。

マネジメントコンソールの画面でも確認しましたが、無事タグが付与されていました。

スクリプトの詳細

下記でスクリプトの解説をします。

1. シェバングとオプション

#!/bin/bash -eu

この行はシェバングと呼ばれるもので、スクリプトを実行する際のシェルをbashとして指定しています。
-euオプションは、スクリプト内でエラーが発生したり未定義の変数が使われた時にスクリプトを終了させるためのものです。

2. プロファイルの定義

PROFILE="<プロファイルを指定してください>"

シェルスクリプト: この行では、AWS CLIコマンドを実行するために使用するAWSプロファイル名を指定します。
このプロファイル名は、スクリプトを実行するユーザーによって独自に設定される必要があります。

3. インスタンスIDリストの指定

INSTANCE_LIST="<インスタンスIDのリストを含むファイルを指定>"

タグを付与したいEC2インスタンスのIDが記載されたファイルのパスを指定します。
このファイルは、スクリプトの実行前に別途準備する必要があります。

4. タグのキーと値の定義

TAG_KEY="Project"
TAG_VALUE="MyProject"

このセクションで、付与するタグのキー(名前)とその値を指定します。
この例ではProjectというキーに対してMyProjectという値を設定しています。

5. タグ付与のループ処理

while IFS= read -r instance_id; do
    echo "タグを付与中: $instance_id"
    aws ec2 create-tags --resources "$instance_id" --tags Key="$TAG_KEY",Value="$TAG_VALUE" --profile "$PROFILE"
done < "$INSTANCE_LIST"

ここでは、指定されたインスタンスIDリストファイルからインスタンスIDを1行ずつ読み込み、読み込んだ各インスタンスに対して指定されたタグを付与するループ処理を行っています。この処理により、リスト内の全インスタンスに対してタグを付与できます。

タグを付与するコマンドはAWS CLIのaws ec2 create-tagsを利用しています。
create-tagsについて詳しくは以下をご覧ください。

docs.aws.amazon.com

6. 完了メッセージ

echo "完了"

シェルスクリプト: スクリプトの最後には、全ての処理が終了したことを示すメッセージが表示されます。

まとめ

スクリプトを使って普段の業務を少しでも効率化していきたいですね。
本ブログが誰かの助けになっていれば幸いです。

日高 僚太(執筆記事の一覧)

EC部ソリューションアーキテクト2課 / AWS認定資格 12冠

2022年IT未経験で新卒入社しました。
最近はダーツとサウナが気になっています!
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp