いまのルータはここまでできる、iPhoneのSMSからルータにコマンド送信も
今回のデブサミ2021での発表の一つ前の回にあたる「Developers Summit 2020 Summer」で、シスコシステムズ 田川真樹氏は「もうネットワークを土管とは呼ばせない!~LANスイッチでPythonだって動いちゃう~」と題して、ネットワークのプログラマビリティについて解説した。聴講したアプリケーション開発者からは「今はネットワークでここまでプログラムできるのか」など驚きの声が多く寄せられた。
可能性に気づいたら、次は実践してみたくなるというもの。今回は「実際のビジネスに活かすにはどうしたらいいか?」という視点を盛り込んだ続編となる。理想的な世界や可能性を示すユースケースと実体験からの学びを盛り込んだケーススタディの両方を織り交ぜて解説する。なお田川氏は大学でSDN(Software Defined Network)を学び、シスコシステムズではSDN応用技術室を経て、現在はカスタマーサクセススペシャリストとして活動している。ネットワークとソフトウェアを組み合わせたSDNの専門家だ。
まずはネットワークのプログラマビリティについてのキャッチアップから。昨今ではスイッチやルータなどネットワーク機器(箱=box)上でプログラムを実行できることを「On-boxプログラマビリティ」と呼ぶことがある。サーバー不要でネットワーク装置だけで、任意のイベントや条件をトリガーにしたアクションをプログラムできるのだ。ネットワーク機器のOS機能を活用するため、ネットワーク監視や運用保守作業の自動化などに役立つ。ネットワークOSに備わる機能の1つとして提供されているため、ネットワークエンジニアには親しみやすいだろう。
シスコ製品で「On-boxプログラマビリティ」を実現する最も歴史ある機能はCisco EEM(Embedded Event Manager)。各種イベントを検知して、あらかじめ用意されたアクションを実行する。
実際の活用例をいくつか挙げてみよう。毎日、業務時間終了後にオフィスの無線ルータを自動的に停止するケース。割り切ったケースとなるが、オフィスに誰もいないなら節電にもなるしセキュリティ対策にもなる。通常のオペレーション以外にも、ネットワーク運用者を悩ませるトラブルシューティングに関連する活用例もある。メモリリーク対策で何らかのしきい値を超えたらログを収集して再起動するケース、サイレントクラッシュ対策でメモリダンプを採取するケース、事後調査に役立つ情報を障害発生前/後に収集しておこうというものだ。
これらの作業は手動でも可能だが、毎回同じコマンドならスクリプトで自動化しておいたほうが楽だ。また現実的には、ネットワーク運用者がすぐに対応できないこともあるし、そもそも機器の負荷が高まると機器にログインできない状況も起こりうる。そのため装置単体が自主的にログやダンプを採取しておくことは極めて有効な対応となる。さらに高度な例としては、ネットワーク機器が他のネットワーク機器に遠隔ログイン (Telnet、SSH) して、障害発生時に設定を変更することもできる。
興味深い例として、田川氏はスマートフォン(iPhone)からルータを操作する方法をデモした。ルータの中にはLTEのモデムを搭載したモデルもあり、ルータが電話番号を持つ。電話番号があるということはSMSが送受信できるため、管理者がルータとSMSでやり取りできるようになるのだ。例えばSMSでスマートフォンからルータに「CPU」と送信すると、ルータが直近のCPU使用率をSMSで返信するという具合だ。このデモもプログラムの実行はルータ単体で完結しており、サーバーなどのコンポーネントを用意する必要がない。
テレワークのちょっとしたお悩みをPythonスクリプトで解決
私たちが日常で使うコンピューターが同じ価格帯でもどんどん性能が高まっているように、最近のネットワーク機器も非常に高い性能を持ち合わせている。例えば、シスコのLANスイッチのスペック表をよく見ると、こう書いてあるものがある。「x86 CPU complex with 8-GB memory and 16 GB of flash and external USB 3.0 SSD pluggable storage slot (delivering 120GB of storage with and option SSD drive) to host containers」。これはx86のCPUに8GBのメモリ、16GBのフラッシュ、SSDを外付けするためのUSBスロットもあるということ。最後の外付けSSDはコンテナのホストとして使う時のストレージになる。サーバーではなくスイッチでありながら、コンテナのホストになれるほどのハードウェアが備えられている。
ハードウェアの進化をフルに活かすために、ソフトウェアも進化している。実行可能なアプリケーションで最もよく使われるのがGuest Shell、Cisco IOS XEに標準で組み込まれているLinux環境だ。「本格的なコンテナ環境を作るまでもないが、ちょっとコンテナを使いたい」なら便利に使えそうだ。他にはDockerコンテナ、LXC(Linux Container)、KVM(Kernel-based Virtual Machine)も使える。
Cisco EEMとGuest ShellでのPythonを組み合わせると何ができるか考えてみてほしい。いろんな可能性が広がってくる。ネットワーク機器のイベントをトリガーとしてPythonスクリプトを実行できる。サーバー不要で、ネットワーク機器だけで自動的にプログラムを実行できて、外部とのプログラム連携も可能となる。
2020年末にはシスコのエンジニア有志がQiitaでアドベントカレンダーを2つ連載し、いろんなアイデアを披露した。興味があればぜひチェックしておこう。
実用的なアプリケーション例として、田川氏は「GoTo Meetingボタン」(GitHub)を披露した。昨年から自宅でWeb会議に参加する機会が増えている。Web会議にありがちな課題として「家族がWeb会議中と知らず、掃除や洗濯を始めてしまう(生活音がWeb会議に入り、気恥ずかしい思いをする)」、同じく「家族が動画を視聴していて、Web会議の品質が落ちる」などがある。これらを解決するための簡単なアプリケーションだ。
まずはアクションのトリガーとなるボタン(ネットワークにつながるもの)を用意する。このボタンを押すと「会議開始」のアクションが実行され、再び押すと「会議終了」のアクションが実行されるというシンプルなものだ。「会議開始」は自宅内にあるすべてのスマートスピーカーに「会議を開始します」とアナウンスし(生活音に配慮してもらう)、ルータの通信優先制御(QoS)を変更する。Web会議のトラフィックを優先し、それ以外は控えめにする。「会議終了」は自宅内にあるすべてのスマートスピーカーに「会議が終了しました」とアナウンスし、ルータの設定を元に戻す。プログラムはPythonスクリプトで記述した。これで同居の家族がいても安心してWeb会議ができるようになる。
田川氏は「いまやネットワーク機器はソフトウェアだけではなく、ハードウェアの進化により、さらに強力なプログラマビリティを備えています」という。