EC2 インスタンスのネットワーク使用量の合計を計算し、特定の日付範囲内でどのインスタンスが最も多くの帯域幅を使用したかを判断する方法を教えてください。

所要時間2分
0

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを持っています。一定期間のネットワーク使用量の合計を計算して、どのインスタンスが最もネットワーク使用量が多かったかを判断したいと考えています。

簡単な説明

Amazon CloudWatch のNetworkInNetworkOut のメトリクスを使用して、どの Amazon EC2 インスタンスがネットワーク使用率を高めているかを判断します。これらのメトリクスからデータポイントを集約して、EC2 インスタンスのネットワーク使用量を計算できます。

注: CloudWatch NetworkOut メトリクスは、AWS Cost Explorer レポートで使用される DataTransfer-Out-Bytes メトリクスとは異なるメトリクスです。CloudWatch NetworkOut メトリクスは、インスタンスからのアウトバウンドネットワークトラフィックの送信先に関係なく、そのトラフィックの量を表します。

CloudWatch メトリクスを使用するための前提条件:

注: 次の解決方法は、Amazon EC2 ダッシュボードに表示されるインスタンスに対してのみ有効です。次の Bash シェルスクリプトは、終了したインスタンスでは機能しません。終了したインスタンスの場合は、インスタンス ID をスペースで区切ってスクリプトに追加します。

スペースで区切ったフォーマットの例:

ADD_INSTANCES="i-xxxx i-yyyy i-zzzz"

解決方法

次の Bash シェルスクリプトは、AWS リージョン内のすべての EC2 インスタンスのネットワーク使用量を特定します。

1.    次の内容をコピーしてスクリプトを作成します。

#!/bin/bash
if [ $# -ne 4 ]; then
echo "Usage: $0 <REGION> <NetworkIn|NetworkOut> <START_TIMESTAMP> <END_TIMESTAMP>"
echo -e "\tNote: Do not change the order of parameters."
echo -e "\n\tExample: $0 ap-south-1 NetworkOut 2020-06-01T00:00:00.000Z 2020-06-30T23:59:59.000Z"
exit 1
fi
REGION="$1"
METRIC="$2"
START_TIME="$3"
END_TIME="$4"
ADD_INSTANCES=""
INSTANCES="${ADD_INSTANCES} $(aws ec2 describe-instances --region ${REGION} --query Reservations[*].Instances[*].InstanceId --output text)" || { echo "Failed to run aws ec2 describe-instances commandline, exiting..."; exit 1; }
[ "${INSTANCES}x" == "x" ] && { echo "There are no instances found from the given region ${REGION}, exiting..."; exit 1; }
for _instance_id in ${INSTANCES}; do
unset _value
_value="$(aws cloudwatch get-metric-statistics --metric-name ${METRIC} --start-time ${START_TIME} --end-time ${END_TIME} --period 86400 --namespace AWS/EC2 --statistics Sum --dimensions Name=InstanceId,Value=${_instance_id} --region ${REGION} --output text)"
[ "${_value}x" == "x" ] && { echo "Something went wrong while calculating the network usage of ${_instance_id}"; continue; }
echo "${_instance_id}: $(echo "${_value}" | awk '{ sum += $2 } END {printf ("%f\n", sum/1024/1024/1024)}';) GiB";
done
echo -e "\nNote: If you think the values are inaccurate, please verify the input and modify if needed."

2.    スクリプトを任意の名前で保存します。例えば、network_usage.shとして保存します。

network_usage.sh

3.    次のコマンドを実行して、スクリプトの実行権限を有効にします。

$ sudo chmod a+x network_usage.sh

4.    次の構文を使用してスクリプトを実行します。

$ bash network_usage.sh ap-south-1 NetworkOut 2020-06-01T00:00:00.000Z 2020-06-30T23:59:59.000Z
  • ap-south-1 をインスタンスが配置されているリージョンに置き換えます。詳細については、「Amazon EC2 の利用可能なリージョン」を参照してください。
  • NetworkIn またはNetworkOut のいずれかを指定して、トラフィックフローの方向を計算します。
  • 2020-06-01T00:00:00.000Z2020-06-30T23:59:59.000Z を、ネットワーク使用量を計算する範囲の開始タイムスタンプと終了タイムスタンプに置き換えます。

次に、前述のコマンドの出力例を示します。

i-025a820f5ee9f1490: 0.000099 GiB
i-0b56df07325d9c0fa: 0.008475 GiB
i-09ad0a93b60a233b1: 0.000000 GiB
i-0ba35b570c7003ffe: 0.000000 GiB
i-012cc851406584b5c: 0.000000 GiB
i-0ef3921993739d772: 219.884000 GiB
i-01f193931c4101cf3: 0.000000 GiB
i-05ca8ccc8aa7caf76: 0.009235 GiB
i-06b165356b5769581: 0.000000 GiB
i-06c4d1e1cb4e9139d: 0.012911 GiB
i-070b6508dd4ab5040: 0.000000 GiB
i-0f29e3ba7f156dfee: 0.000000 GiB

関連情報

インスタンスの利用可能な CloudWatch メトリクスのリスト表示

GNU バッシュ (GNU ウェブサイトから)

AWS公式
AWS公式更新しました 1年前