[Hands On] ZABBIX를 이용한 AWS ELB 모니터링

Zabbix로 Elastic Load Balancer(이하 ELB)에 대한 모니터링 데이터를 가져오는 방법에 대한 실습입니다.

실습에 앞서 Zabbix Server, Load Balancer가 필요합니다.

Zabbix Server 설치는 이전 게시글에서 확인 가능합니다.

다음은 CloudWatch에서 ELB에 대한 모니터링이 가능한 Metric 중 일부입니다.

  • HTTPCode_Target_4XX_Count
  • HTTPCode_Target_5XX_Count
  • ProcessedBytes
  • RequestCount
  • UnHealthyHostCount

위에서 언급하지 않은 Metric 정보는 아래의 주소에서 확인 가능합니다.

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html

CloudWatch에서 얻을 수 있는 통계 값은 ‘SampleCount’, ‘Average’, ‘Sum’, ‘Minimum’, ‘Maximum’ 등이 있지만, ELB의 경우 대부분 의미 있는 통계 값은 ‘Sum’입니다.

1-1. IAM 역할 설정

모니터링을 위해 IAM 역할 설정을 합니다.

필요한 정보에 대해서만 모니터링하도록 권한을 최소로 부여하는 것이 바람직하지만, 실습의 편의를 위해 ReadOnlyAccess 권한을 부여합니다.

1-2. Zabbix 설정

  • python 버전 변경 및 boto3 설치
ln -s /usr/bin/python3.8 /usr/bin/python
python -V
apt install python3-pip -y
pip install boto3
  • 경로 설정
cd /usr/lib/zabbix/externalscripts
  • python 파일 작성(elb_stats.py)
#!/usr/bin/python
import datetime
import sys
from optparse import OptionParser
import boto3

parser = OptionParser()
parser.add_option('-l', '--loadbalancer-id', dest='lb_id', help='LoadBalancerName')
parser.add_option('-a', '--access-key', dest='access_key', help='AWS Access Key')
parser.add_option('-k', '--secret-key', dest='secret_key', help='AWS Secret Access Key')
parser.add_option('-m', '--metric', dest='metric', help='ELB cloudwatch metric')
parser.add_option('-r', '--region', dest='region', default="ap-northeast-2", help='AWS region')

(options, args) = parser.parse_args()

if options.lb_id == None:
  parser.error('LoadBalancerName is required!')
if options.metric == None:
  parser.error('ELB cloudwatch metric is required!')

if not options.access_key or not options.secret_key:
  use_roles = True
else:
  use_roles = False

# Metrics definitions
metrics = {'HTTPCode_Target_4XX_Count':{'type':'int', 'value':None},
  'HTTPCode_Target_5XX_Count':{'type':'int', 'value':None},
  'ProcessedBytes':{'type':'float', 'value':None},
  'RequestCount':{'type':'int', 'value':None},
  'UnHealthyHostCount':{'type':'int', 'value':None}
}

# Time range
end = datetime.datetime.utcnow()
start = end - datetime.timedelta(minutes=5)

if use_roles:
  conn = boto3.client('cloudwatch', region_name=options.region)
else:
  conn = boto3.client('cloudwatch', aws_access_key_id=options.access_key, aws_secret_access_key=options.secret_key, region_name=options.region)

if options.metric in metrics.keys():
  k = options.metric
  vh = metrics[options.metric]

  try:
    res = conn.get_metric_statistics(Namespace='AWS/ApplicationELB', MetricName=k, Dimensions=[{'Name': 'LoadBalancer', 'Value': options.lb_id}], StartTime=start, EndTime=end, Period=60, Statistics=['Sum'])
  except Exception as e:
    print("status err Error running elb_stats: %s" % e)
    sys.exit(1)

  datapoints = res.get('Datapoints')

  if len(datapoints) == 0:
    datapoints = [{'Sum': 0,},]
    #print('Could not find datapoints for specified instance. Please review if provided instance (%s) and region (%s) are correct' % (options.lb_id, options.region))
    #sys.exit(1)

  sum = datapoints[-1].get('Sum')

  if k == 'ProcessedBytes':
    sum = sum / 1024
  if vh['type'] == 'float':
    metrics[k]['value'] = '{:.4f}'.format(sum)
  if vh['type'] == 'int':
    metrics[k]['value'] = sum

  print('%s' % (vh['value']))

else:
  print('No such metric')
  sys.exit(1)
  • python 파일 권한 설정
chmod 755 elb_stats.py

1-3. Zabbix Server 설정

  • 호스트 생성
  • 매크로 설정
  • 아이템 작성
  • CloudWatch 그래프 확인
  • Zabbix 그래프 확인
Zabbix로 ELB에 대한 모니터링 데이터를 가져오는 실습을 완료하였습니다.