AWS Auto-Healingを利用したZabbix耐障害構成時のAgent設定について

いつもお世話になっております。
AWSのAuto-Healing(Auto-Scalingで常時1台起動とする設定)を利用した耐障害構成を構築するうえで正しく監視するためにzabbix_agentd.confにどのような設定が必要かお知恵をお貸しください。

構成としては以下となります。
ZabbixVersion:3.0.9
※DBはAWS RDSサービスを利用

[Zabbix Server※Auto-Healing] ---- [AWS ELB(Internal)] ---- [Zabbix Agent※Auto-Scaling]

障害等でZabbix ServerがAuto-Healingにより再起動するとIPアドレスが変わってしまうため、Agentとの間にELBを挟む構成としております。
そのため、Agent.confに設定するServer情報はELBの値としています。
また、AgentがAuto-Scalingにより動的にインスタンス数が変動するため、Agent側の情報(Host)はHostnameItemを利用しています。

【Zabbix_agentd.conf抜粋】
Server = ELBのFQDN
HostnameItem=system.hostname
ServerActive = ELBのFQDN
HostMetadata = 自動登録の判定条件とするメタデータ

上記で構築するとServer側に自動登録はされるのですが、インターフェースがELBのIPとなってしまうため正しく監視できません。
Zabbixエージェントの状態が赤で
「Get value from agent failed: cannot connect to [ELBのIP:10050]: [113] No route to host」
となってしまいます。

設定でServer側にAgentの情報を通知できれば解決しそうなのですが、設定方法がわからないためご存じの方いらっしゃいましたらご教示いただけると助かります。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

現時点では、IPアドレスでの登録になってしまっていたと思います。
APIなどを使用してインターフェースをIPからDNSに切り替えたりし
て対応されている方もいらっしゃるようです。
# useipの値を0に変更

ご参考:
ZBXNEXT-1740
Provide way to specify "connect to dns" for auto registered agents and discovered hosts
https://support.zabbix.com/browse/ZBXNEXT-1740

ユーザー yanta1 の写真

Zabbix Server 側の IPアドレスを固定にした方がいいかもしれません。
VPC 内であれば、セカンダリIP を付けられますので、あらかじめサブネット内の 1つの IPアドレスを選定して、Zabbix Server インスタンス起動時にセカンダリIP を付ける方法はどうでしょうか。

/etc/rc.d/rc.local などで、OS起動時に以下のような処理を実行するよう、AMI を作っておきます。

- http://169.254.169.254/latest/meta-data/mac から MACアドレスを取得
- http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC/interface-id から ENI ID を取得
- aws ec2 assign-private-ip-addresses --network-interface-id $ENI --private-ip-addresses $IP でセカンダリIPアドレスを付与
- ip addr add $IP/32 dev eth0 で Linux 側に IP Alias を設定

Zabbix Server で aws コマンドを使用できるよう、aws-cli インストールおよび role を設定しておきます。
zabbix_server.conf の SourceIP にこの IPアドレスを設定しておきます。
zabbix_agentd.conf の Server, ServerActive にこの IPアドレスを設定しておきます。

常に Zabbx Server インスタンスが稼働していて、セカンダリIPアドレスを使用していれば、他のインスタンス、ELB などにこの IPアドレスを奪われることはないと思います。
ELB から Zabbx Server インスタンスを起動し直すタイミングで、他のインスタンスなどが起動した場合、IPアドレスを奪われる可能性はあります。

ユーザー p3_twwt_3p の写真

TNKさん、yanta1さん、アドバイスありがとうございます。

yanta1さんのZabbix ServerIP固定案は構成検討時に考えたのですが、AWSのAutoRecoveryであればいいのですがAutoHealingでAZをまたぐDR構成とする場合、IPセグメントが異なるため単一のIPとできないため解決できないという結論になりました。
そのためAgent-Server間に内部ELBを挟み、AgentはELBをターゲットとすることでAZによらず監視する構成にたどり着いた次第です。
セグメントを超えたセカンダリIP付け替えで実現が可能であれば試してみたいと思うのですが、可能なのでしょうか。
>yanta1さん

TNKさん案はAgentのIPではなくDNSを利用してServerにホスト登録するということですね。
参考情報としていただいた内容を確認して試してみたいと思います。

ユーザー yanta1 の写真

Multi-AZ なのですね。
AZ が違うとサブネットも違うので、1つの IP にはできません。
しかし、zabbix_server.conf の Server には複数設定できますので、AZ-a の Zabbix Server (SourceIP) は IP-a、AZ-b の Zabbix Server (SourceIP) は IP-b として、
zabbix_agentd.conf の Server=IP-a,IP-b とするのはどうでしょうか。
アクティブチェックは Zabbix Agent -> ELB:10051 -> Zabbix Server:10051 とすればいいと思います。
あるいは、Zabbix Server からのポーリングをせずに、アクティブチェックだけにするとか。

ユーザー p3_twwt_3p の写真

いろいろ試してみて一旦以下とすることである程度期待動作とすることができました。
全自動の障害対応はできていませんが、復旧のTATは小さくて済むと考えています。

【AWS】
1.Route53でPrivate DNSを作成
2.Zabbix ServerをPrivate DNSに登録
3.VPSのDHCP設定でPrivate DNSをLookupできるように設定

【zabbix-agentd.conf】
1.Serverパラメーターに内部ELBとZabbix ServerのDNSを設定
2.ServerActiveパラメータに内部ELBとZabbix ServerのDNSを設定
※1,2ともにAuto Healing利用のためELBも設定しています。
 LookupでIP解決できるのでELB設定は不要だとは思っていますが現在両方設定で様子見中です。
3.ListenIPにAgentのインスタンスIPを設定
※インスタンス起動時にzabbix-agentd.confをチェックし必要であれば書き換えるようなスクリプトを作成、AMIに内包させています。

ListenIPを指定していなかったためインターフェースのIPがELBになってしまっているのであれば、起動時に自分のIPとなるよう書き換えることで対応できるのではと考え試してみた次第です。