1. はじめに
特定タグが指定されているEC2インスタンスの任意のリソース情報を取得するシェルスクリプトを作りました。
特定のEC2インスタンスのインスタンスIDだけ取得したい、パブリックIPだけ取得したい等、様々なケースに対応できるよう、取得対象のEC2インスタンスをタグ値で絞り込めるようにして、リソース情報は任意のパラメータを指定できるようにしました。
2. 概要
本記事の概要を以下に記載します。
2.1 概要
特定タグが指定されているEC2インスタンスの任意のリソース情報を取得するシェルスクリプトを作成する。
2.2 機能要件
- EC2インスタンスのリソース情報を取得する
- 対象のEC2インスタンスはタグで絞り込めるようにする
- 取得するリソース情報は指定できるようにする
2.3 実行環境
aws cli(ver2以上)がインストールされているLinux環境
3. リソース取得スクリプト
本スクリプトは以下GitHubにも置いてあります。
https://github.com/chibiharu/ShellScript-Tools/tree/master/AWS-Get-EC2Resources
3.1 リソース説明
本プロジェクトのディレクトリ階層は以下の通りです。
※ root配下にリポジトリをcloneした場合
root/
├ README.md ・・・説明書
├ get_ec2_resources.sh ・・・メインスクリプト
├ input/ ・・・設定ファイルや処理中に作成される一時ファイルを格納する
└ target_resources.conf ・・・設定ファイル
├ output/ ・・・出力先ファイルを格納する
└ EC2Resources_yyyymmddhhssdd.conf ・・・出力先ファイル(例)
3.2 使用方法
手順1:設定ファイルをエディタで開く
$ vim ~./input/target_resources.conf
手順2:各セクションの説明に従い設定ファイルを修正する
(例:TagName,InstanceID,PublicIP,PrivateIPを取得する)
##### Welcome!!! #####
############################
# Section=[Tgas]
# Describe:
# 対象インスタンスへ登録したタグ(Key/Value)を指定する
############################
[Tags]
TAGS Key="GetResourcesTag"
TAGS Value="Target"
############################
# Section=[ResourcesParameters]
# Describe:
# 取得するリソースの種類を指定する
# true = 取得する
# false = 取得しない
############################
[ResourcesParameters]
true tag="Tags[?Key=='Name'] | [0].Value,"
true InstanceId="InstanceId,"
false InstanceType="InstanceType,"
false ImageId="ImageId,"
false KeyName="KeyName,"
false AvailabilityZone="lacement.AvailabilityZone,"
true PrivateIpAddress="PrivateIpAddress,"
true PublicIpAddress="PublicIpAddress,"
false State="State.Name,"
false VpcId="VpcId,"
false SubnetId="SubnetId,"
手順3:メインスクリプトを実行する
# メインスクリプトを実行
$ ~./get_ec2_resources.sh
3.3 動作確認
出力先ファイルを確認する
# 出力先ファイルを確認する
$ cat ~./output/EC2Resources_20220213042348.conf
testserver-1a i-xxxxxxxxxxxxxxxxx 192.168.xx.xx xx.xx.xx.xx(PublicIP)
testserver-1c i-xxxxxxxxxxxxxxxxx 172.16.xx.xx None
3.4 get_ec2_resources.sh
#######################################################################################
#
# <スクリプト名>
# EC2インスタンスリソース情報取得スクリプト
#
# <概要>
# 特定タグで指定されているEC2インスタンスの指定のリソース情報を取得する
#
# <更新履歴>
# 20220212 - 新規作成
#
#######################################################################################
#!/bin/bash
#####################################################################
## 事前設定
#####################################################################
# カレントディレクトリのパスを取得
CURRENT=$(cd $(dirname $0);pwd)
# 現在の時刻を取得
nowtime=$(date "+%Y%m%d%H%M%S")
######################################################################
## パラメータ設定
######################################################################
# 設定ファイル
InputFile="${CURRENT}/input/target_resources.conf"
# 変数読み込み用一時ファイル
TempFile="${CURRENT}/input/Temporary.conf"
# 一時出力先ファイル
OutTempFile="${CURRENT}/input/OutTemp.conf"
# 出力先ファイル
OutputFile="${CURRENT}/output/EC2Resources_${nowtime}.conf"
######################################################################
## パラメータ取得
######################################################################
### 設定ファイルを読み込み ###
while read line || [ -n "${line}" ];
do
## 先頭文字が「null」「#」「[」を除外
if [[ -z ${line} ]]; then
# 無視する
continue
elif [ ${line:0:1} = "[" ] || [ ${line:0:1} = "#" ]; then
# 無視する
continue
fi
## 先頭文字(「true」「false」「TAGS」)によって変数に格納するか判断する
# 「TAGS」の場合
if [ ${line:0:4} = "TAGS" ]; then
param=`echo $line | sed -e "s/TAGS //g"`
echo ${param} >> ${TempFile}
# 「true」の場合
elif [ ${line:0:4} = "true" ]; then
param=`echo $line | sed -e "s/true //g"`
echo ${param} >> ${TempFile}
# 「false」の場合
else
# 無視する
continue
fi
done < ${InputFile}
# 一時ファイルを読み込み最終行の「,」を削除
sed -i -e "$ s/,//g" ${TempFile}
# 一時ファイルから変数を取得
source ${TempFile}
######################################################################
## メイン処理
######################################################################
aws ec2 describe-instances --query "Reservations[].Instances[].[${tag}${InstanceId}${InstanceType}${ImageId}${KeyName}${AvailabilityZone}${PrivateIpAddress}${PublicIpAddress}${State}${VpcId}${SubnetId}]" \
--output text \
--filters "Name=tag:${Key},Values=${Value}" \
>> ${OutTempFile}
# 可視性を考慮して、column -tで開始行を揃える
cat ${OutTempFile} | column -t > ${OutputFile}
######################################################################
## 後処理
######################################################################
# 一時ファイルの削除
rm -rf ${TempFile}
# 一時出力先ファイルを削除
rm -rf ${OutTempFile}
4. まとめ
もはやAWSという存在はインフラ/開発関係なく我々エンジニアにとって身近なものになってきました。
業務でEC2のリソース情報を取得する要件が発生した際は是非本スクリプトをご使用いただければと思います。