EC2 インスタンスの総ネットワーク使用量を計算し、日付範囲内で最も帯域幅が使用されたインスタンスを判断するにはどうすればよいですか?

最終更新日: 2021 年 1 月 5 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスがあります。一定期間の総ネットワーク使用量を計算し、ネットワーク使用量が最も多かったインスタンスを特定したいと考えています。どうすればよいですか?

簡単な説明

Amazon CloudWatch NetworkInNetworkOut メトリクスを使用して、ネットワーク使用量が高い原因となっているインスタンスを特定できます。これらのメトリクスからデータポイントを集約して、インスタンスのネットワーク使用量を計算できます。

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

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

注: 次の解決方法は、Amazon EC2 ダッシュボードに表示される 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 をお使いの EC2 インスタンスが配置されている AWS リージョンに置き換えます。詳細については、「Amazon EC2 の利用可能なリージョン」を参照してください。
  • NetworkIn または NetworkOut のいずれかを指定して、トラフィックフローの方向を計算します。
  • 2020-06-01T 00:00:00.000Z および 2020-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

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?