zabbix cloudwatch 연계

10603 단어 zabbixCloudWatch

목적



Steal값도 CPU 사용률에 포함하는 CloudWatch를 사용하고 싶다. Cloudwatch에서 얻은 리소스 데이터를 2주 이상 축적하고 드릴다운하고 싶습니다. 등의 요건에 부응한다. (감시만으로 말하면 개인적으로는 zabbix의 CPU idle time으로 좋다고 생각한다)

환경



AWS
zabbix2.2

방법



cloudwatch get-metric-statistics를 사용하여 검색된 값을 Zabbix 외부 검사 기능으로 ZabbixDB로 가져옵니다.

설정



Zabbix 서버는 외부 스크립트의 위치로 정의 된 디렉토리를 검사하고 명령을 실행합니다.
Fluentd로 취득하는 방법도 있지만, td-agent가 스톨했을 때, 로그 수집과 감시의 양기능을 사용할 수 없게 될 가능성이 있으므로, 배송.
$ sudo cat /etc/zabbix/zabbix_server.conf | grep externalscripts
# ExternalScripts=${datadir}/zabbix/externalscripts
ExternalScripts=/usr/lib/zabbix/externalscripts

스크립팅


  • classmethod 님의 기사에서 소개된 스크립트 을 이용시키고 있어 조금 변경을 넣었습니다.
  • --period 300이라는 것은 기간의 길이로 300은 초수(디폴트는 60)
  • 60 초라면 과금이 발생한다 (5 분의 통계까지는 무료)

  • StartTime 및 EndTime에서 통계와 관련된 전체 시간 길이를 결정합니다 (기본값은 지난 1 시간).
  • StartTime을 6분 전, EndTime을 1분 전으로 하여 실제 60초마다 통계를 얻을 수 있다.

  • 공식 사이트 에 있는 네임스페이스·메트릭스·디멘젼을 파라미터로 지정하는 것으로 목적의 값을 취할 수가 있다.
  • 부동 소수점이 아니면 Zabbix가 인식 할 수 없기 때문에 jq로 성형합니다.

  • /usr/lib/zabbix/externalscripts/cloudwatch.sh
    #!/bin/bash
    
    while getopts n:d:m:s: OPT
    do
      case ${OPT} in
        n) NAMESPACE=${OPTARG} ;;
        d) DIMENSIONS=${OPTARG} ;;
        m) METRIC=${OPTARG} ;;
        s) STATISTICS=${OPTARG} ;;
        *) exit 1 ;;
      esac
    done
    
    ### example
    # ./cloudwatch.sh -n AWS/[EC2,RDS] -d Name=[InstanceId,mydbinstance],Value=[instanceID,mydbinstance] -m CPUUtilization -s Maximum
    
    aws cloudwatch get-metric-statistics --region ap-northeast-1 --period 300 \
     --namespace ${NAMESPACE} \
     --dimensions ${DIMENSIONS} \
     --metric-name ${METRIC} \
     --statistics ${STATISTICS} \
     --start-time `date --iso-8601=seconds --date '6 minutes ago'` \
     --end-time `date --iso-8601=seconds --date '1 minutes ago'` | jq -r ".Datapoints[].Maximum"
    

    Zabbix


  • 아이템 키 구문

  • 사이트 에도 설명이 있는 것처럼 외부 체크 기능을 사용하면 Zabbix 서버의 CPU 사용률이 상승하므로, 버스트 기능을 가진 t2 타입이 아니고, CPU를 완전하게 사용할 수 있는 최적화된 C4 타입의 인스턴스 사용해야합니다.

  • script[<parameter1>,<parameter2>,...]
    


  • ZabbixServer의 CPU 사용률 얻기
  • cloudwatch.sh["-n AWS/EC2","-d Name=InstanceId,Value=i-*****","-m CPUUtilization","-s Maximum"]
    
  • 5분마다 피크가 기록됩니다.



  • 보충 1


  • 외부 체크의 갱신 간격을 60초, Refresh unsupported items를 30초로 설정해 API를 두드려 보면, 값을 취한 2분 후에 값을 잡을 수 없게 되어, 값을 잡을 수 없게 되고 나서 3분 후에 또 값이 취해지기 시작한다는 사이클이 로그에 출력되고 있었다. 이것이라고 하면, 그래프화했을 때에 피크와 피크가 연결되지 않고, 그래프선이 끊어져 끊어져 버리기 때문에, 외부 체크의 갱신 간격은 300초, Refresh unsupported items를 180초로 설정한다.

  • /var/log/zabbix/zabbix_server.log
    became supported
    4481:20160208:110734.416
    became not supported
    4481:20160208:110934.468
    became supported
    4482:20160208:111234.564
    became not supported
    4484:20160208:111434.630
    became supported
    4482:20160208:111734.773
    became not supported
    4481:20160208:111934.865
    became supported
    4484:20160208:112234.967
    

    보충 2


  • awscli를 실행하려면 IAM 사용자 또는 IAM 역할로 실행 권한이 있어야합니다. EC2에 실행 허가의 정책이 첨부된 역할이 부여되어 있는 경우는 그대로 실행할 수 있지만, IAM에서 권한이 관리되고 있는 경우는 대응이 필요하게 된다.
  • root만 awscli가 실행할 수 있는 설계의 경우,/root/.aws/credensial로 용도로 나누어 IAM 유저의 Key를 정의하는 경우가 많기 때문에, 스크립트중에서 어느 것을 사용하는지를 보안의 관점 에서 key를 쓰지 않고 --profile로 지정한다.
  • zabbix 사용자가 스크립트를 실행할 때 암호를 묻지 않도록 sudoers에 설명합니다.


  • /root/.aws/credensial
    [default]
    aws_access_key_id = **************
    aws_secret_access_key = ***********************
    [s3]
    aws_access_key_id = **************
    aws_secret_access_key = ***********************
    [clowdwatch]
    aws_access_key_id = **************
    aws_secret_access_key = ***********************
    [rds]
    aws_access_key_id = **************
    aws_secret_access_key = ***********************
    

    /usr/lib/zabbix/externalscripts/cloudwatch.sh
    #!/bin/bash
    
    while getopts n:d:m:s: OPT
    do
      case ${OPT} in
        n) NAMESPACE=${OPTARG} ;;
        d) DIMENSIONS=${OPTARG} ;;
        m) METRIC=${OPTARG} ;;
        s) STATISTICS=${OPTARG} ;;
        *) exit 1 ;;
      esac
    done
    
    ### default EC2 metric
    # CPUCreditBalance,CPUCreditUsage,CPUUtilization,DiskReadBytes,DiskReadOps,DiskWriteBytes,DiskWriteOps,NetworkIn,NetworkOut,StatusCheckFailed,StatusCheckFailed_Instance,StatusCheckFailed_System 
    
    ### example
    # ./cloudwatch.sh -n AWS/[EC2,RDS] -d Name=[InstanceId,mydbinstance],Value=[instanceID,mydbinstance] -m CPUUtilization -s Maximum
    
    sudo aws cloudwatch get-metric-statistics --profile clowdwatch --region ap-northeast-1 --period 300 \
     --namespace ${NAMESPACE} \
     --dimensions ${DIMENSIONS} \
     --metric-name ${METRIC} \
     --statistics ${STATISTICS} \
     --start-time `date --iso-8601=seconds --date '6 minutes ago'` \
     --end-time `date --iso-8601=seconds --date '1 minutes ago'` | jq -r ".Datapoints[].Maximum"
    

    /etc/sudoers.d/zabbix
    zabbix ALL=(ALL) NOPASSWD:/usr/bin/aws cloudwatch
    

    좋은 웹페이지 즐겨찾기