Yuichi Murata's Engineering Blog

グローバル・エンジニアリング・チームをつくる

いまクラウドよりオンプレを学ぶべき理由

f:id:yuichi1004:20210314110505p:plain

今日、ありとあらゆる企業がクラウド移行を果たし活用している。 こんな今だからこそ、オンプレ時代の知識が大事だという話をしていきたい。

問題

過去の経験から、一つ具体的な例を上げて話そうと思う。

以下のようなシステム構成において、System A から System B への通信が定期的にタイムアウトするという問題が発生していた。 この問題の分析は難航していて数々の担当者があたっていたが、ついに解決されないまま数年間放置されていた。

f:id:yuichi1004:20210314105232p:plain

問題の規模がそれほど大きくなく、業務影響が大きくなかったことも放置されていた原因の一つであった。 しかし、サービスが成長するにつれて、いよいよ無視するわけにも行かなくなってきていた。

System A の担当エンジニアは言う。

タイムアウトのためのパラメターは確認したし、思いつく限りのログを取ってみた。ログを確認したところ、System B からのレスポンスが全くかえってこないのだ。LB か System B が怪しいのではないか」

System B の担当エンジニアは言う。

「該当リクエストのうち、System A からのリクエストが届かないこともあるし、届いていることもある。届いている時には数ミリ秒で応答を返している。Managed Service C か System A でのレスポンスを受け取る処理が怪しいのではないか」

マネージド・サービス C に問い合わせた担当者は言う。

タイムアウトのレポートがあった時間帯のログを見てみたが該当の通信はきちんと通っているし、ブロックされている形跡はない。本当に System A, B で問題はないのか」

三者ともに明確に問題を指摘することができずに暗礁に乗り上げていた。

問題解決

この問題を解決したのは、チームでは新参のエンジニアであった。彼はもともとネットワーク・エンジニアとしてのバックグラウンドを持っていた。彼は持ち前のネットワークの知識を活用しつつ、このクラウド・ベースのアプリケーションの問題を一つずつ紐解いていった。その結果、以下のような結論を導き出した。

  • この問題は以下の複合的な要因によるものである
  • NAT Gateway のポート枯渇: NAT とマネージド・サービス C は、それぞれ一つの Public IP しか持っていない。一分間に 65,000 以上の接続があると新たな通信ができなくなる
  • タイムアウト設定の一貫性: 各コンポーネントタイムアウトがばらばらで、途中の経路で予期せぬ応答結果を返す
  • マネージド・サービス C 内部の問題: マネージド・サービス内部の通信問題もまれに発生している

先程あげた担当者は皆間違っていなかった。ただし、問題の一部分しか見ることができていなかったのである。あるときには NAT Gatewayタイムアウトが起き、あるときはタイムアウトの設定の不一致で、あるときはマネージド・サービスの問題が発生していたのである。

問題が複雑なときにむやみに仮説を棄却するのは危険だ。例えそれを反証する事実があったとしても、複合された他の要因のものである可能性があるからである。

問題を解決できるエンジニア

先のエンジニアのアプローチは以下のような単純なものであった。

通信が途絶える可能性のある経路をたどり、全ての仮説を上げて一つずつ潰していく。一つずつ被疑箇所を修正し、リリースし、変化を計測する。 一つの問題を解決するとタイムアウトの発生件数ががくっと下がり、複合問題がそれぞれの問題に分解され、より効果的に問題分析を進めることができた。 アプリケーション・ログや業者への問い合わせのみに頼ることなく、システムの下回りで何が起きているのかを、一つ一つ丁寧に掘り下げていった。

クラウドやマネージド・サービスは重要である。便利である。これらはあなたのシステムが扱いやすいように全てを抽象化してくれる。

一方、仕組みが抽象化された世界では、問題すら抽象化されてしまう。つまりそのままでは解決が難しいということだ。 だから、発生した問題をネットワークやオペレーティングシステムといった低次元のレベルまで掘り下げて分析をしていかなければいけない。

世界ではデジタル変革のニーズは高まる一方だ。それに伴ってエンジニアが必要とされ、より多くの「エンジニア」が市場にあふれることになる。 コードを書くことができるエンジニアは増えるだろう。だが問題を解決できるエンジニアはそれに伴って増えていくとは限らない。 世の中には、ますます多くのデジタル・プロダクトが生まれ、それと共に多くの問題が生まれるだろう。

こうしたトレンドの中、きちんと問題を解決できるエンジニアの希少価値はますます高まっていくと思う。だから、むやみやたらとバズワードを追いかけるよりも、基本を大切にするべきだ。今からブレード・サーバーを買ってきて自宅のラックに備えようと言うつもりはない。だが、かつてそうした時代に求められていた基本的な知識を学ぶことは大事だ。オペレーティング・システム、システム・プログラミング、ネットワーク、データ構造とアルゴリズム、データベースといった足腰を鍛えることが大事なのではないかと思う。