如何计算 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 shell 脚本不适用于已终止的实例。对于已终止的实例,请以空格分隔的格式将实例 ID 添加到脚本中,如以下示例所示:

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

解决方法

以下 Bash shell 脚本确定了 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 可用区域
  • 指定 NetworkInNetworkOut 以计算流量方向。
  • 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

这篇文章对您有帮助吗?


您是否需要账单或技术支持?