Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ネットワーク自動テストの実適用 / JTF2018

ネットワーク自動テストの実適用 / JTF2018

m.hagiwara

July 29, 2018
Tweet

More Decks by m.hagiwara

Other Decks in Programming

Transcript

  1. 経緯 2 Fy2016 Fy2017 JTF2017 2017/08/27 JTF2018 2018/07/29 ネットワークの検証やレビューに はもう正直疲弊したので全部プロ

    グラムで自動化できるようにして しまえばいいと思った https://speakerdeck.com/corestate55/jtf2017 実際に使ってみよう! ⚫ どんなものを作って、どう使ってみたのか ⚫ やってみて、実際どうだったのか 架空の利用者を想定した検証
  2. サービス提供のボトルネック? サーバ/アプリ ネットワーク 設定 各種プロビジョナ普及 プロビジョナ発展中 テスト ⚫ テストコード/xSpec ⚫

    各種テストツール ⚫ CI/CDサービス ⚫ 出張 ⚫ 人海戦術 ⚫ 温かみのある手作業 5 NWテストの自動化によりボトルネック解消
  3. NWのテスト? ◼NWのテストは大切 ◼「繋がること」の保証 ◼NWは自律分散システム → システム全体の挙動を予測す るのは難しい ◼しかし現実は… ◼物理作業をともなう人力作業 →

    スケールしない ◼系全体のテストが難しい → 単体のテストしかできない ◼提供するサービスレイヤと一致 しない 6 NW全体の動作を 自動テストする ユースケースによる 「受け入れテスト」 (ソフトウェア開発の知見をとりこむ)
  4. どうやって? ◼電子工作のテスト ◼ネットワークのテスト 7 テスト対象 NW Test Scenario Electronic boards

    tests http://www.astrosurf.com/audine/English/cisup2.htm テストの操作手順を記述 指示を受けて 計測するシステム “Probe”を 動的に接続
  5. NWテスト自動化のしくみ(TesterSet) 8 L3SW FW1 (Act) FW2 (Pasv) L2SW1 L2SW2 OFS1

    OVS テスト用 ノード Test Scenario (Cucumber) NetTester テスト対象NW “Probe”相当
  6. PC テスト対象NW(論理) 10 内部LAN SSL VPN DNS 資産 管理 テスト

    環境 PC PC 外部LAN Internet 内部LAN タジマックス通信工業社 ヨーヨーダイン社 DMZ PC PC PC NAT https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mon dai_kaitou_2013h25_2/2013h25a_nw_pm1_qs.pdf 平成25年度 ネットワークスペシャリスト試験の問題を もとに、架空の中小企業ネットワークとして設定 (「ヨーヨーダイン社」「タジマックス通信工業社」は架 空の企業名です)
  7. ふるまい=テストシナリオ例 11 Feature: リモート開発環境への安定したアクセス タジマックス通信工業社の社員として ヨーヨーダイン社内の開発環境に安定してアクセスしたい なぜならリモート作業を日常的に行うから Scenario: リンク障害発生でもリモート接続が切れない Given

    ヨーヨーダイン社のDMZ内部のVPNサーバ And タジマックス工業のPCをVPNクライアントに And ヨーヨーダイン社のサーバにVPN経由でリモートアクセスして作業 When “FW1” と “L2SW1” 間にリンク障害が発生 Then リモート接続が切れていない https://github.com/net-tester/examples/blob/feature/ood_demo/features/tcp_fw1_l2sw1_linkdown.feature
  8. テストノード生成・物理構成操作 12 L3SW FW1 (Act) FW2 (Pasv) L2SW1 L2SW2 OFS1

    OVS vpn_server tajimax_pc FW状態(Act/Pasv)変化 FW1-L2SW1間 リンクダウン/リンクアップ操作 "patch panel" 設定 (テスト用ノードの配置設定) OpenFlow Switchを Patch Panel として 制御する
  9. ねらい 15 Before After 繋げて! 設定うまくで きてる?? 終わったよ つながるか 確かめないと…

    ? どこが悪い のだろう… うまく つながらない んだけど!! 繋げて! 全パターン テストしたから 確実 終わったよ 安心して 使える 利用者 運用者 利用者 運用者
  10. NetTester の改修 19 Test Scenario (Cucumber) テスト対象NW tcp/3000 (REST API)

    テストシナリオ 実行API テストシナリオ 実行サーバ NetTester (拠点B) NetTester (拠点A) NetTester (拠点D) NetTester (拠点C) “Controller” (Stateful) “Worker” (Stateless)
  11. 他システムとの連携 ◼NorthBoundとしてのテストシナリオ実行のサービス化 ◼テストシナリオを実行するAPI層を提供 ◼テスト自体を提供するサービスとして疎結合化 20 Test Scenario (Cucumber) テスト対象NW tcp/3000

    (REST API) 他システム (設定自動化) REST API テストシナリオ 実行API テストシナリオ 実行サーバ NetTester (拠点B) NetTester (拠点A) NetTester (拠点D) NetTester (拠点C)
  12. テストシナリオ 実行サーバ 動作の全体像 21 21 NetTester Server 1 OFS (Pica8)

    テスト対象 ネットワーク (利用者セグメント) tcp/3000 (REST API) テストシステム用 セグメント Operator (テスト実行者) ssh (CLI) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) OFS (OVS) Test Nodes (NetNS) TestNode起動 コマンド実行 パッチ実行 Trema起動 NetTester Server N …… TestNode起動 コマンド実行 拠点N テストコマンドによる TestNode間の トラフィック テストシナリオ実行 Test Scenario 他システム (設定自動化) REST API
  13. テストシナリオ 実行サーバ 見え方 22 22 テスト対象 ネットワーク (利用者セグメント) Operator (テスト実行者)

    ssh (CLI) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) Test Nodes …… 拠点N Test Scenario 他システム (設定自動化) REST API Test Nodes
  14. (補足) テスト設定 Target ⚫ VPLS網 ⚫ ユーザ視点で見ると(拠点をまたぐ)L2ネットワーク Test Parameters ⚫

    ユーザに払い出すL2内に置くテスト用ノードのIP/MAC Parameter Policy ⚫ 今回はあえて固定 ⚫ IP: 利用者が使うアドレスと被らないIPを拠点ごとに確保 ⚫ MAC: 固定 ⚫ Teardown問題, 障害リスクの最小化 ⚫ 稼働中機器の状態変更をは最低限におさえる → テスタ側はテスト対象の状態をなるべく変えない 23
  15. 1. テストシナリオ実行要求 24 24 Test Scenario NetTester Server 1 OFS

    (Pica8) テスト対象 ネットワーク (SOで作成した 利用者セグメント) テストシナリオ 実行サーバ tcp/3000 (REST API) テストシステム用 セグメント Operator (テスト実行者) ssh (CLI) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) NetTester Server N …… 拠点N 拠点:1…N テスト内容:ping テストシナリオ実行
  16. 2. 各拠点を初期化 25 25 Test Scenario NetTester Server 1 OFS

    (Pica8) テスト対象 ネットワーク (SOで作成した 利用者セグメント) テストシナリオ 実行サーバ tcp/3000 (REST API) テストシステム用 セグメント Operator (テスト実行者) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) OFS (OVS) NetTester Server N …… 拠点N 各拠点初期化 NetTester等 コンポーネントの初期化 初期化 Trema起動
  17. 3. 各拠点にノード作成 26 26 Test Scenario NetTester Server 1 OFS

    (Pica8) テスト対象 ネットワーク (SOで作成した 利用者セグメント) テストシナリオ 実行サーバ tcp/3000 (REST API) テストシステム用 セグメント Operator (テスト実行者) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) OFS (OVS) Test Nodes (NetNS) NetTester Server N …… 拠点N ノード作成・ テスト対象NWへ接続 拠点1にAAを作成 拠点1にBBを作成 拠点NにXXを作成 拠点NにYYを作成 TestNode起動 TestNode起動 パッチ実行
  18. 4. 各拠点でコマンド実行 27 27 Test Scenario NetTester Server 1 OFS

    (Pica8) テスト対象 ネットワーク (SOで作成した 利用者セグメント) テストシナリオ 実行サーバ tcp/3000 (REST API) テストシステム用 セグメント Operator (テスト実行者) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) OFS (OVS) Test Nodes (NetNS) NetTester Server N …… 拠点N 拠点1のAAで 「ping XX」を実行 拠点1のBBで 「ping YY」を実行 各ノードでコマンド実行 コマンド実行 コマンド実行 テストコマンドによる TestNode間の トラフィック
  19. 5. 各拠点からコマンド実行結果を回収 28 28 Test Scenario NetTester Server 1 OFS

    (Pica8) テスト対象 ネットワーク (SOで作成した 利用者セグメント) テストシナリオ 実行サーバ tcp/3000 (REST API) テストシステム用 セグメント Operator (テスト実行者) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) OFS (OVS) Test Nodes (NetNS) NetTester Server N …… 実行結果回収 拠点N AAのログ回収 BBのログ回収 保存してあった 実行結果を送信
  20. 6. テスト成否を判断 29 29 Test Scenario NetTester Server 1 OFS

    (Pica8) テスト対象 ネットワーク (SOで作成した 利用者セグメント) テストシナリオ 実行サーバ tcp/3000 (REST API) テストシステム用 セグメント Operator (テスト実行者) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) OFS (OVS) Test Nodes (NetNS) テスト実行 結果 NetTester Server N …… 拠点N シナリオに設定された 要件表と比較 差分が無ければ テスト成功
  21. 7. 結果をもとに続行/中止を判断 30 30 Test Scenario NetTester Server 1 OFS

    (Pica8) テスト対象 ネットワーク (SOで作成した 利用者セグメント) テストシナリオ 実行サーバ tcp/3000 (REST API) テストシステム用 セグメント Operator (テスト実行者) 拠点1 各拠点 操作シナリオ 記述 (RubyCucumber) OFS (OVS) Test Nodes (NetNS) NetTester Server N …… 拠点N テストが成功たから 設定は完了 or 失敗したから 設定見直そう
  22. テスト要る? 作業増えるだけでは? 34 利用者に渡して「仕事がはじめられる」までの 時間・品質・リスクをどう変えられるか? 繋げて! 設定! できたよ 俺が チェッ

    クする のね なんか通 信できな いぞ 繋げて! 拠点 A 設定! 拠点 B 拠点 C 拠点 D まだー? テスト! ← 表に出ない テストのコスト が発生 Too Fat (Cost) なテスト ← タイムラグ +オペレータ調査
  23. 「テストの効果」をどう考えるか ◼設定時「間違えずにコードを書く」手順はない ◼ 必要なのは、間違えたときにリーズナブルなコストでそれを見つけて修正すること ◼間違えやすい・判断しにくい操作を対象にするのが有効 35 変化や揺らぎがある ⚫ 人手作業 (ヒューマンエラー対策)

    ⚫ 自動化シナリオやコードの変更 (自動化システムの動作保証) ⚫ 成否判断に作業者の主観が入る わかりにくい (configと実際の動作 が直接結びつかない) ⚫ 実際に動かしてみないとわかりにくいもの ⚫ 例) Firewall Rule など → 可否を Code/Config から判断しにくい ⚫ 例) 経路制御設定など → 複数デバイスが連動するため系全体の動きが予想しにくい めんどうくさい ⚫ 確認のためのリソース確保・事前準備等、人手が必要・時間 がかかる ⚫ 確認手順が複雑 (確認のオペレーション自体にミスが入りこみやすい)
  24. 「テストの効果」をどう考えるか ◼定量的に評価するための指標があるか? ◼テストを入れたことで何が変化したのか? ◼利用者から見える効果…環境引き渡し後の問題発生減 → これ自体はOK ◼ それは「設定自動化」の効果? 「テスト自動化」の効果? ◼

    「ユーザ視点の end-to-end テスト」によって見つけられたものは? ◼どこからが「リーズナブル」なのか? ◼線引き ◼(自動)テストの効果を謳いにくい → 導入を押しにくい ◼ベストプラクティス蓄積が必要だけど導入を押しにくいのでプラク ティスが集まらないみたいな堂々巡り 36
  25. で、どうなの? (-) ◼設定自動化がうまく回るとテスト自動化の効果が見えにくい ◼より複雑な (設定自動化したとしても全体の動きがわかりにくい) オペレーション向けの方がテストの効果が出やすいだろう ◼自動化の精度が高く「テストの効果が出にくい」は ”良くない” ? ◼設定自動化システムがあれば「テスト自動化は不要」なのか?

    ◼たとえば… ◼ 設定自動化が上手くいく前提でテスト自動化を考えなくてもよかった? ◼ 自動化システムを導入せず人力作業を続けていれば、 もっと「テストの効果があった」だろうけど、それは “良い” か? ◼バランスが取れているか? ◼どうやれば「適切なバランス」だと判断できるだろうか? 37
  26. で、どうなの? (+) ◼重要なのは、判断・評価のベースラインを決めること ◼設定するのが [人/システム] どちらかを問わず、 NWが満たすべき機能を利用者視点で定義できた。 ◼ たとえば… 設定自動化システム自体の障害・更新等があったらどうする?

    人力オペレーションに切り替えたときは? ◼サービスレベル要求や目標設定に沿って自動テストの要否を考える ◼ どのレベルで、どこまでフォローしたいか ◼実際 ◼人力オペのミス発見 ◼設定自動化システム導入時・設定シナリオのチェック 38
  27. 参照 (NetTester) ◼NetTesterリポジトリ https://github.com/net-tester ◼net-tester : NetTester本体 ◼scenario-api : シナリオ実行APIサーバ

    ◼multisite-examples : 多拠点対応シナリオサンプル ◼デモ動画 https://youtu.be/C7z3aaWgsf4 https://youtu.be/DhKutgqYdSw 41