【AWS】指定のタグが登録されてるEC2インスタンスの任意のリソース情報を取得する

# 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 使用方法
手順１：設定ファイルをエディタで開く

```bash
$ vim ~./input/target_resources.conf
```
手順２：各セクションの説明に従い設定ファイルを修正する
(例：TagName,InstanceID,PublicIP,PrivateIPを取得する)

```ini
##### 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,"
```
手順３：メインスクリプトを実行する

```bash
# メインスクリプトを実行
$ ~./get_ec2_resources.sh
```

## 3.3 動作確認
出力先ファイルを確認する

```bash
# 出力先ファイルを確認する
$ 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

```shell
#######################################################################################
#
# <スクリプト名>
# 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のリソース情報を取得する要件が発生した際は是非本スクリプトをご使用いただければと思います。