ZabbixによるAWS監視のコツ
クラスメソッド株式会社
横⽥田  慎介
classmethod.jp 1
H-‐‑‒2  #cmdevioH
2015/03/29
⽬目次
•  Zabbix概要
•  Zabbix利利⽤用例例
•  CloudWatchとの連携
•  CloudWatch以外の監視項⽬目
•  ホストの⾃自動登録
•  Zabbixサーバの監視
classmethod.jp 2
Zabbix概要
classmethod.jp 3
ホスト
•  監視対象のデバイス
– 例例:demo-‐‑‒web01
•  ホスト名とホストを特定するための情報
を指定する
– ホスト名はZabbix内で⼀一意
– 共⽤用Zabbixの場合は「web01」等は避ける
•  1つ以上のホストグループに属する
classmethod.jp 4
ホストグループ
•  ホストをまとめるもの
–  例例:DEMO_̲WEB
•  ホストは1つ以上のホストグループに所属
–  いくつでも良良い
•  ホストグループ単位で扱われることが多い
–  ダッシュボードでのステータス⼀一覧
–  最新の監視データ
–  Zabbixユーザへのアクセス制限
classmethod.jp 5
ホストグループ
classmethod.jp 6
HostHostHost
Host
Host
classmethod.jp 7
ダッシュボード画⾯面
アイテム
•  監視項⽬目
–  例例:Available  memory
–  どのような情報を(アイテムキー)
–  どの間隔で(更更新間隔)取得し、
–  取得したデータをどのくらいの期間保存するか
(ヒストリ保存期間)指定する
•  ホストやテンプレートに属する
–  例例えばウェブ監視等のデバイスに紐紐付かない監視
項⽬目の場合も、アイテムを所属させるためのダ
ミーのホストが必要
classmethod.jp 8
アイテム
classmethod.jp 9
Host
Host
Item
CPU
Item
Mem
Item
CPU
Item
URL
Group
アイテム
•  任意のスクリプト結果を監視値として利利⽤用できる
–  AWS  APIから得た値
•  Zabbixで定義済みのものがあればそれを使う
–  例例:vm.memory.size[available]
•  無ければ他の⽅方法を検討する
–  SNMP
–  JMX
–  外部チェック(任意のスクリプトを実⾏行行)
•  似たものは「アプリケーション」という単位でま
とめることができる
classmethod.jp 10
トリガー
•  アイテムが収集したデータを「評価」し、
システム状態を表⽰示する論論理理条件式
– 例例:
{web01:vm.memory.size[available].last(0
)}  <  20M
•  状態として「OK」と「障害」を持つ
– 障害の深刻度度を設定できる
– 「情報」から「致命的な障害」まで
classmethod.jp 11
トリガー
classmethod.jp 12
Host
Host
Item
CPU
Item
Mem
Item
CPU
Trig
<20%
Trig
>60%
Trig
>90%
Group
トリガー
•  任意の時点のデータを利利⽤用できる
– 例例:30⽇日後にディスク枯渇
– {db01:vfs.fs.size[/,pfree].delta(1d)}  *  30  
>  {db01:vfs.fs.size[/,pfree].last(0)}
classmethod.jp 13
トリガー
•  異異なるアイテムのデータを利利⽤用できる
– 例例:冗⻑⾧長化されたNTPサーバが停⽌止
– {ntp01:proc.num[ntpd].last(0)}  
+  {ntp02:proc.num[ntpd].last(0)}  =  0
classmethod.jp 14
トリガー
classmethod.jp 15
Host
Host
Item
CPU
Item
Mem
Item
CPU
Trig
<20%
Trig
>60%
Trig
>90%
>80%
Group
トリガー
•  状態変更更時にはイベントが発⽣生する
– イベントの結果、実⾏行行されるアクションを定
義できる
•  ダッシュボードには障害の数と⼀一覧が表
⽰示される
classmethod.jp 16
アクション
•  イベントの結果として何らかの処理理を⾏行行
う
– 例例:Report  problems  to  Zabbix  admins
•  メッセージの送信
•  コマンドの実⾏行行
classmethod.jp 17
テンプレート
•  アイテムやトリガーの設定をテンプレー
ト化することで、同様の監視設定を複数
のホストで使い回しできる
•  テンプレートは、ホストや他のテンプ
レートにリンクできる
– ホストグループにはリンクできない
classmethod.jp 18
テンプレート無し
classmethod.jp 19
Host
Host
Item
CPU
Item
Mem
Trig
<20%
Trig
>90%
Group
Item
CPU
Item
Mem
Trig
<20%
Trig
>90%
テンプレート化
classmethod.jp 20
Host
Host
Item
CPU
Item
Mem
Trig
<20%
Trig
>90%
TemplateGroup
テンプレート
•  リンクは多対多
– EC2上のウェブサーバの場合、下記をリンク
•  EC2テンプレート
•  Linuxテンプレート
•  Webサーバテンプレート
classmethod.jp 21
テンプレート
classmethod.jp 22
Host
Group
Host
I T
Template
I T
Template
I T
Template
Zabbix利利⽤用例例
classmethod.jp 23
前提
•  複数の案件を監視
•  ユーザはお客様と弊社運⽤用チーム
classmethod.jp 24
classmethod.jp 25
DEMO01_ALL
DEMO01_ELB DEMO01_EC2 DEMO01_RDS
ホストグループ設計
ホストグループ⽅方針
•  案件名がプレフィックス
–  ホストグループ名の重複防⽌止
•  全ホストは案件⽤用ホストグループに所属
–  (案件名)_̲ALL
•  その他、1つ以上のホストグループに所属
–  たくさん所属させてもOK
•  AWSサービス:(案件名)_̲EC2
•  機能:(案件名)_̲WEB
•  開発会社:(案件名)_̲(会社名)
•  メンテナンス期間:(案件名)_̲MEINTENANCE01
classmethod.jp 26
テンプレート設計
classmethod.jp 27
EC2
RDS
ALL
I T
EC2
DB
I T
RDS
  Base
I T
Web
I T
Linux
テンプレート設計
•  ホストにリンクするテンプレートは1つ
– 例例:Template_̲(案件名)_̲Web
•  その1つに必要な全テンプレートをリンク
– Template_̲(案件名)_̲Web
•  Template_̲(案件名)_̲Base
•  Template_̲AWS_̲EC2
•  Template  OS  Linux
classmethod.jp 28
テンプレート設計
classmethod.jp 29
EC2
RDS
ALL
I T
EC2
DB
I T
RDS
  Base
I T
Web
I T
Linux
テンプレート設計
•  案件⽤用のテンプレートを作成
– Template_̲(案件名)_̲Base
•  案件固有のマクロを管理理するため
•  案件/役割/ホスト固有の設定はマクロで
– トリガーでのマクロ利利⽤用
{web:vm.memory.size[available].last(0)}  
<  {$TRIGGER_̲THRESHOLD_̲XXX}
classmethod.jp 30
テンプレート設計
classmethod.jp 31
EC2
ALL
I T
EC2
  Base
I T
Web
I T
Linux
CPU  >  90%CPU  >  60%
{$ROLE_̲ARN}
閾値上書き
案件共通の値
CloudWatchとの連携
classmethod.jp 32
CloudWatchとは
•  AWS  クラウドリソースの監視サービス
–  EC2:CPU使⽤用率率率
–  RDS:ディスク残量量
•  監視範囲はAWSの責任範囲と近似
–  EC2のOS以上のリソース、例例えばメモリ、ディ
スク使⽤用量量は監視範囲外
–  RDSはマネージドサービスなのでメモリ、ディ
スクも監視対象
•  データの保存期間は2週間
classmethod.jp 33
CloudWatchグラフ
classmethod.jp 34
ZabbixとCloudWatchの連携
•  連携の⽬目的
– CloudWatchの監視対象とZabbixの監視対象
を統合管理理
– リソース状況の可視性向上
– 2週間より前のCloudWatchデータを保存
•  連携の⽅方法
– Zabbixアイテムの外部チェックを利利⽤用
classmethod.jp 35
アイテム設定(外部チェック)
classmethod.jp 36
cw[-‐‑‒-‐‑‒metric,CPUUtilizaion,  ....]
スクリプト名[引数]
任意のスクリプトを実⾏行行可能
外部スクリプト(抜粋)
[ec2-‐‑‒user@zabbix-‐‑‒demo  ~∼]$  cat  /usr/lib/zabbix/externalscripts/cw
#!/usr/bin/ruby
params  =  ARGV.getopts(  '',  'region:',  'namespace:',  'metric:',  'dim_̲names:',  'dim_̲values:',  'stat:',  'period:')
AWS.config(:cloud_̲watch_̲endpoint  =>  "monitoring.#{params['region']}.amazonaws.com")
dimensions  =  Hash[params['dim_̲names'].split(',').zip(params['dim_̲values'].split(','))]
metric  =  AWS::CloudWatch::Metric.new(
      params['namespace'],
      params['metric'],
      :dimensions  =>  dimensions.map{|name,  value|  {name:  name,  value:  value}}
)
stats  =  metric.statistics(
    :start_̲time  =>  Time.now  -‐‑‒  600,
    :end_̲time  =>  Time.now,
    :period  =>  params['period'],
    :statistics  =>  [params['stat']]
)
last_̲stats  =  stats.sort_̲by{|stat|  stat[:timestamp]}.last
puts  last_̲stats[params['stat'].downcase.to_̲sym]
classmethod.jp 37
外部スクリプト引数と返り値
[ec2-‐‑‒user@zabbix-‐‑‒demo  ~∼]$  ./cw
  -‐‑‒-‐‑‒namespace  AWS/EC2
  -‐‑‒-‐‑‒metric  CPUUtilization
  -‐‑‒-‐‑‒dim_̲names  InstanceId
  -‐‑‒-‐‑‒dim_̲values  i-‐‑‒5117d3a
  -‐‑‒-‐‑‒stat  Average
  -‐‑‒-‐‑‒period  300
  -‐‑‒-‐‑‒region  ap-‐‑‒northeast-‐‑‒1
0.3
classmethod.jp 38
マネジメントコンソールのCloudWatch画⾯面で
指定する項⽬目と同じものが引数となる
返り値(0.3)が監視結果として記録される
CloudWatchとZabbix⽐比較
classmethod.jp 39
テンプレート化
classmethod.jp 40
ユーザーマクロの利利⽤用
classmethod.jp 41
ユーザーマクロの利利⽤用
classmethod.jp 42
ユーザーマクロの連携
classmethod.jp 43
I T
EC2
  Region
I T
Web
{$THRESHOLD}
{$REGION}
{$NAMESPACE}
{$DIM_̲NAME}
{$THRESHOLD}
{$DIM_̲VALUE}
{$NAMESPACE}:  AWS/EC2
{$RGION}:  ap-‐‑‒northeast-‐‑‒1
{$DIM_̲NAME}:  InstanceId
{$DIM_̲VALUE}:  i-‐‑‒xxxxxxx
{$THRESHOLD}:  90
ホストスクリーン
classmethod.jp 44
複数のグラフを並べて表⽰示
ホストスクリーン
classmethod.jp 45
EC2のディスクメトリクス
•  EC2
– DiskRead(Write)Ops
– DiskRead(Write)Bytes
•  エフェメラルディスク⽤用メトリクス
– EC2のローカルストレージ
– 再起動でデータが消える
– 利利⽤用しないことも多い
classmethod.jp 46
EC2:  Disk*
classmethod.jp 47
EBS:  Volume*
classmethod.jp 48
EBSメトリクス
classmethod.jp 49
•  EC2にアタッチされたEBSを監視
•  ZabbixのLLDでアイテムの⾃自動登録
– EC2  APIを利利⽤用しEBSの情報を取得
ローレベルディスカバリ
classmethod.jp 50
discover_̲ebs[-‐‑‒-‐‑‒hostname,{HOST.HOST},  ....]
ホスト名の末尾はインスタンスID
例例:demo01_̲ec2_̲web_̲i-‐‑‒5117d3a4
外部スクリプト(抜粋)
[ec2-‐‑‒user@zabbix-‐‑‒demo  ~∼]$  cat  /usr/lib/zabbix/externalscripts/discover_̲ebs
#!/usr/bin/ruby
params  =  ARGV.getopts(  '',  'region:',  'hostname:')
instance_̲id  =  params['hostname'][/i-‐‑‒[0-‐‑‒9a-‐‑‒f]{8}$/]
AWS.config(:ec2_̲endpoint  =>  "ec2.#{params['region']}.amazonaws.com")
ec2  =  AWS::EC2.new
instance  =  ec2.instances[instance_̲id]
discovery  =  {'data'  =>  []}
instance.block_̲devices.each  do  |device|
    next  if  device[:ebs].nil?
    discovery['data']  <<  {
                                            '{#VOLUME_̲ID}'  =>  device[:ebs][:volume_̲id],
                                            '{#DEVICE_̲NAME}'  =>  device[:device_̲name],
                                        }
end
puts  discovery.to_̲json
classmethod.jp 51
外部スクリプト返り値
[zabbix-‐‑‒demo  ~∼]$  ./discover_̲ebs
    -‐‑‒-‐‑‒hostname  demo01_̲ec2_̲web_̲i-‐‑‒5117d3a4  |  jq  .
{
    "data":  [
        {
            "{#VOLUME_̲ID}":  "vol-‐‑‒8dcacd93",
            "{#DEVICE_̲NAME}":  "/dev/xvda"
        }
    ]
}
classmethod.jp 52
{#VOLUME_̲ID}
{#DEVICE_̲NAME}
はアイテムのプロトタイプ内で利利⽤用できる
アイテムのプロトタイプ
classmethod.jp 53
cw[...,  -‐‑‒-‐‑‒dim_̲values{#VOLUME_̲ID},  ....]
•  LLDの返り値があった場合、プロトタイプ
を元にアイテムが⾃自動登録される
テンプレート化しEC2にリンク
classmethod.jp 54
I T
EC2
  Region
I T
Web
I T
EBS
LLDで追加されたアイテム
classmethod.jp 55
LLDで追加されたアイテム
classmethod.jp 56
CloudWach以外の監視項⽬目
classmethod.jp 57
監視しておいたほうが良良い項⽬目
•  AWS  limits
•  ELBインスタンス数
•  SES送信制限
classmethod.jp 58
AWS  limits
•  上限緩和にはAWSサポート申請が必要
– EC2の起動上限
•  デフォルト:5
– EIPの取得上限
•  デフォルト:5
•  AWS  APIで現在の上限値を取得可能なも
のがある
classmethod.jp 59
AWS  limits
[ec2-‐‑‒user@ec2  ~∼]$  aws  ec2  describe-‐‑‒account-‐‑‒attributes
ACCOUNTATTRIBUTES max-‐‑‒instances
ATTRIBUTEVALUES   20
ACCOUNTATTRIBUTES vpc-‐‑‒max-‐‑‒elastic-‐‑‒ips
ATTRIBUTEVALUES 20
classmethod.jp 60
現在のEC2インスタンス数やEIP取得数と⽐比較して、
上限に近くなったら発⽕火するトリガーを設定
ELBインスタンス数
•  ELBは負荷状況によりスケールアウト
–  暖気申請により事前にスケールアウトも可能
•  スケールアウト後のELBインスタンス数は
ネットワークインターフェース(ENI)の数で
確認できる
classmethod.jp 61
ELBインスタンス数
ec2  =  AWS::EC2.new()
if  params['f_̲key'].nil?
    eni  =  ec2.network_̲interfaces
else
    eni  =  ec2.network_̲interfaces.filter(params['f_̲key'],  
params['f_̲value'])
end
case  params['mode']
    when  'count'  then
        puts  eni.count
end
classmethod.jp 62
SES送信制限
•  SESには24時間で送られるメール数に制
限がある
•  制限値と現在の送信数はAPIから取得可能
classmethod.jp 63
SES送信制限
[ec2-‐‑‒user@ec2  ~∼]$  aws  ses  get-‐‑‒send-‐‑‒quota
{
        "Max24HourSend":  50000.0,
        "SentLast24Hours":  4.0,
        "MaxSendRate":  14.0
}
classmethod.jp 64
ホストの⾃自動登録
classmethod.jp 65
ホストの⾃自動登録
classmethod.jp 66
•  頻繁なホストの交換
– AutoScailng
– Immutable  Infrastructure
•  ホスト数の増加
•  ⼿手間が増える
•  ホスト設定漏漏れの可能性
ホストの⾃自動登録⽅方法
classmethod.jp 67
•  ネットワークディスカバリ
–  負荷が⾼高いため利利⽤用しない
•  アクティブエージェントの⾃自動登録
–  今回の対象
•  Zabbix  APIとAWS  APIの連携
–  今回は対象外
ネットワークディスカバリ
classmethod.jp 68
•  Zabbixサーバが指定したIP範囲をスキャン
•  応答があったホストを新規登録
アクティブエージェント⾃自動登録
classmethod.jp 69
•  ZabbixエージェントがZabbixサーバに
チェック要求
•  エージェントから送られたホスト名がまだ登
録されていない場合、ホスト登録
EC2インスタンスの⾃自動登録
classmethod.jp 70
•  アクティブエージェント⾃自動登録を利利⽤用
–  ネットワークディスカバリの場合、IP範囲が広く
⾼高負荷になりがち
EC2インスタンスの⾃自動登録
classmethod.jp 71
•  ZabbixサーバはZabbixエージェントからの
通信を10051番ポートで待ち受け
•  Zabbixに登録されるホスト名に注意
–  ⾃自動登録時ホスト名はZabbixエージェントの設定値
–  ホスト名はZabbix内で⼀一意である必要がある
Zabbixエージェントの設定
[ec2-‐‑‒user@ec2  ~∼]$  cat  /etc/zabbix/zabbix_̲agentd.conf
#  This  is  a  config  file  for  the  Zabbix  agent  daemon  (Unix)
#  To  get  more  information  about  Zabbix,  visit  http://www.zabbix.com
#  (中略略)
Server=10.255.0.158
ServerActive=10.255.0.158
#  (中略略)
#  Hostname=
HostnameItem=system.hostname
classmethod.jp 72
Zabbixのホスト名にOSのhostnameを利利⽤用する
OSホスト名の設定
classmethod.jp 73
•  (案件名)_̲ec2_̲(種別)_̲(インスタンスID)
– 例例:demo01_̲ec2_̲web_̲i-‐‑‒5117d3a4
•  起動スクリプトによりZabbixエージェン
ト起動前にホスト名が設定されるように
する
起動スクリプト例例
[ec2-‐‑‒user@ec2  ~∼]$  cat  /etc/init.d/set-‐‑‒hostname
#!/bin/bash
#
#  chkconfig:  2345  60  40
#
HOST_̲PREFIX="demo01_̲ec2_̲web"
INSTANCE_̲ID=`̀/usr/bin/curl  169.254.169.254/latest/meta-‐‑‒data/
instance-‐‑‒id  2>/dev/null`̀
HOST_̲NAME="${HOST_̲PREFIX}_̲${INSTANCE_̲ID}"
/bin/hostname  ${HOST_̲NAME}
[ec2-‐‑‒user@ec2  ~∼]$  sudo  chkconfig  set-‐‑‒hostname  on
classmethod.jp 74
アクションの設定
1.  ホスト名に案件名が含まれるEC2インスタン
スをホスト登録
2.  ホスト名からインスタンスの役割を判断し適
切切なグループとテンプレートを割り当てる
classmethod.jp 75
Zabbixサーバの監視
classmethod.jp 76
Zabbixサーバ⾃自体の監視
•  Zabbixサーバ停⽌止の場合、アラート⾶飛ばない
–  Zabbixとは別の仕組みで監視が必要
•  Route53のヘルスチェック機能による監視
–  10051番ポート
•  他の監視サービスからの監視
–  NewRelic
–  Mackerel
–  ...
classmethod.jp 77
Route53のヘルスチェック機能
classmethod.jp 78
Route53のヘルスチェック機能
classmethod.jp 79
•  世界中のAWSヘルスチェックサーバからポート監視
•  10051ポートへの接続失敗時にSNSでメール通知
•  アクセス元は下記コマンドで確認可能
–  たまに変更更があるのでメンテナンスが必要
[ec2-‐‑‒user@zabbix-‐‑‒demo  ~∼]$  aws  route53  get-‐‑‒checker-‐‑‒ip-‐‑‒ranges
{
        "CheckerIpRanges":  [
                "54.183.255.128/26",
                "54.228.16.0/26",
                "54.232.40.64/26",
                "54.241.32.64/26",
                ………
Route53のヘルスチェック機能
classmethod.jp 80
#cmdevio2015
ご清聴ありがとうございました。
このスライドは後⽇日公開いたします。
H-‐‑‒2

ZabbixによるAWS監視のコツ