Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 있습니다. 일정 기간 동안의 총 네트워크 사용량을 계산하여 네트워크 사용량이 가장 많은 인스턴스를 확인하려고 합니다.
간략한 설명
Amazon CloudWatch NetworkIn 및 NetworkOut 지표를 사용하여 네트워크 사용량이 높은 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 인스턴스의 네트워크 사용량을 확인합니다.
- 다음 내용을 복사하여 스크립트를 생성합니다.
#!/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."
- 스크립트를 임의의 이름으로 저장합니다. 예: network_usage.sh.
network_usage.sh
- 다음 명령을 실행하여 스크립트를 실행할 수 있는 권한을 켭니다.
$ sudo chmod a+x network_usage.sh
- 다음 구문을 사용하여 스크립트를 실행합니다.
$ 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.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
관련 정보
사용 중인 인스턴스에 사용 가능한 CloudWatch 지표 목록
GNU Bash(GNU 웹 사이트에서 제공)