起動しているインスタンスタイプ毎の合計数と、インスタンスタイプ毎の合計起動時間を教えてください

2023.04.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていること

弊社では様々なインスタンスタイプを起動しています。インスタンスタイプ毎の合計起動数と、インスタンスタイプ毎の合計起動時間を調査したいです。
現時点で起動している EC2 インスタンスの利用状況を調査して、インスタンス購入オプション を決定するための一資料として参考にしようと思っています。何か方法はございますか教えてください。

どう対応すればいいの?

インスタンスタイプごとのインスタンス数を確認する直接的な方法は提供しておりません。
参考情報"describe-instances" コマンドの "--filter" オプションや "--query" オプションを用いて、特定のインスタンスタイプに該当するインスタンスの情報や、取得した情報からインスタンス ID のみを抽出することが可能です。 以下を参考に適宜変更されて AWS CLI で取得いただければと思います。

やってみた

--region ap-northeast-1 ← 調査対象のリージョンを指定してください。

取得する内容

  • インスタンスタイプ毎の合計起動台数
  • インスタンスタイプ毎の合計起動時間
  • (リージョンは指定)

※起動しているインスタンスのみ取得

now=$(date +%s)

aws ec2 describe-instances \
--region ap-northeast-1 \
--filters "Name=instance-state-name,Values=running" \
--query 'Reservations[].Instances[].[Placement.AvailabilityZone, Placement.Region, InstanceType, LaunchTime]' \
--output text | while read zone region instance_type launch_time; do
    launch_timestamp=$(date -d "$launch_time" +%s)
    uptime=$(( (now - launch_timestamp) / 60 ))
    echo "$region $instance_type $uptime"
done | awk '{count[$1" "$2]+=1; sum[$1" "$2]+=$3} END {for (i in count) printf "%-20s%-15s%-15s%-15s\n", i,count[i],sum[i]/60,"hours"}'

※実行結果

None t2.small       1              27885.2        hours
None t3.small       3              34767.8        hours
None t3.large       1              11279.9        hours
None t2.micro       2              28927          hours

※起動と停止しているインスタンスを共に取得

now=$(date +%s)

aws ec2 describe-instances \
--region ap-northeast-1 \
--query 'Reservations[].Instances[].[Placement.AvailabilityZone, Placement.Region, InstanceType, LaunchTime]' \
--output text | while read zone region instance_type launch_time; do
    launch_timestamp=$(date -d "$launch_time" +%s)
    uptime=$(( (now - launch_timestamp) / 60 ))
    echo "$region $instance_type $uptime"
done | awk '{count[$1" "$2]+=1; sum[$1" "$2]+=$3} END {for (i in count) printf "%-20s%-15s%-15s%-15s\n", i,count[i],sum[i]/60,"hours"}'

※実行結果

None t2.small       1              27881.5        hours
None t3.small       4              38092.3        hours
None t3.large       1              11276.3        hours
None t2.micro       2              28919.8        hours

以上より、None t3.small で停止している EC2 インスタンスが含まれていることも確認できました。

単体での取得

--region ap-northeast-1 ← 調査対象のリージョンを指定してください。

取得する内容

  • インスタンス ID
  • インスタンスタイプ
  • 起動時間
  • 起動しているアベイラビリティゾーン
  • (リージョンは指定)
※実行結果の例
i-1234567890 (t2.micro) was started 8712 hours ago in None (ap-northeast-1c)

※起動しているインスタンスのみ取得

#!/bin/bash
now=$(date +%s)

aws ec2 describe-instances \
--region ap-northeast-1 \
--filters "Name=instance-state-name,Values=running" \
--query "Reservations[].Instances[].[InstanceId, InstanceType, LaunchTime, Placement.AvailabilityZone, Placement.RegionName]" \
--output text | while read inst_id inst_type launch_time availability_zone region_name; do
    echo "$inst_id ($inst_type) was started $(( (now - $(date -d $launch_time +%s)) / 3600 )) hours ago in $region_name ($availability_zone)"
done

※停止してるインスタンスのみ取得

#!/bin/bash
now=$(date +%s)

aws ec2 describe-instances \
--region ap-northeast-1 \
--filters "Name=instance-state-name,Values=stopped" \
--query "Reservations[].Instances[].[InstanceId, InstanceType, LaunchTime, Placement.AvailabilityZone, Placement.RegionName]" \
--output text | while read inst_id inst_type launch_time availability_zone region_name; do
    echo "$inst_id ($inst_type) was launched $(( (now - $(date -d $launch_time +%s)) / 3600 )) hours ago in $region_name ($availability_zone)"
done

※起動と停止しているインスタンスを共に取得

#!/bin/bash
now=$(date +%s)

aws ec2 describe-instances \
--region ap-northeast-1 \
--query "Reservations[].Instances[].[InstanceId, InstanceType, LaunchTime, Placement.AvailabilityZone, Placement.RegionName, State.Name]" \
--output text | while read inst_id inst_type launch_time availability_zone region_name state; do
    if [ "$state" == "stopped" ]; then
        echo "$inst_id ($inst_type) is stopped in $region_name ($availability_zone)"
    else
        echo "$inst_id ($inst_type) was started $(( (now - $(date -d $launch_time +%s)) / 3600 )) hours ago in $region_name ($availability_zone)"
    fi
done

※実行結果例

i-1234567890 (t2.micro) was started 8712 hours ago in None (ap-northeast-1c)
i-2345678901 (t2.small) was started 27884 hours ago in None (ap-northeast-1c)
i-3456789012 (t2.micro) was started 20213 hours ago in None (ap-northeast-1c)
i-4567890123 (t3.small) was started 13797 hours ago in None (ap-northeast-1c)
i-5678901234 (t3.small) was started 10918 hours ago in None (ap-northeast-1c)
i-6789012345 (t3.large) was started 11279 hours ago in None (ap-northeast-1a)
i-7890123456 (t3.small) was started 10050 hours ago in None (ap-northeast-1a)
i-abcdefghij (t3.small) is stopped in None (ap-northeast-1a)

参考資料