
この記事でわかること
-
バックエンドエンジニアが直面するインフラ・クラウド技術の壁と乗り越え方
-
安定稼働を支える「可用性設計」と「パフォーマンスチューニング」の原則
-
クラウドネイティブ時代に必須のコンテナ移行戦略と監視の実践
クラウドの普及とシステムの複雑化に伴い、バックエンドエンジニアにとってインフラ・クラウド技術の知識は不可欠なものとなりました。しかし、アプリケーション開発を主戦場としてきたエンジニアにとって、その壁は決して低くありません。
では、なぜインフラはこれほどまでに複雑になったのでしょうか。その構造的な課題について、長年にわたりWebシステムインフラの領域で活躍する株式会社X-Tech5のCTO、馬場俊彰氏は次のように語ります。
「システムは横にも縦にも複雑化している」。
本記事では、馬場氏へのインタビューを通じて、バックエンドエンジニアが現場で直面するインフラの課題を乗り越え、市場価値の高いエンジニアへと成長するための実践的なアプローチを探ります。

馬場 俊彰
株式会社X-Tech5 取締役CTO
電気通信大学卒業後、大手カード会社のWebサイトを開発・運用するJavaプログラマーを経て、MSP事業会社で取締役CTOとして従事。産業技術大学院大学に入学し修了。現在、X-Tech5のCTOへ就任。Webシステムインフラ、監視テクノロジに関する著書多数。代表作に『バックエンドエンジニアのためのインフラ・クラウド大全』がある。
【SNS】:https://x.com/netmarkjp
株式会社X-Tech5
クラウド創成期から日本のクラウド市場をリードしてきたメンバーが集まり2019年に設立。「DX時代にあるべきITインフラのあり方を実現する『Re:Design』」をミッションに、ユーザー体験(UX)を中心とした運用プラットフォームを提供。AWSを中心としたクラウドの豊富な知見を活かし、ITインフラ運用技術支援やコンサルティングを手がける。
【HP】:株式会社X-Tech5
目次
なぜインフラは難しくなったのか?縦と横に広がるシステムの複雑性
馬場さんはこれまで、システムの安定稼働を支えるITインフラの運用支援サービスの立ち上げをご経験されるなど、長年にわたり業界の最前線でキャリアを歩まれてきたと思います。その中で、バックエンドエンジニアが抱えるインフラ課題について、どのように捉えていらっしゃいますか?
バックエンドエンジニアにとってのインフラ課題は、一言で言うと「知るべきことの範囲が格段に広がり、複雑化した」ことに尽きます。昔のCGI(※1)のように、一つのプログラムをサーバーに置けば動く、という時代とは全く異なります。
現代のシステムはマイクロサービス化によって、小さなプログラムが多数連携して一つのサービスを構成する「横の複雑性」を持っています。
※1 CGI (Common Gateway Interface):Webサーバーが外部のプログラムを呼び出して、その実行結果をWebページとして生成するための仕組み。動的なWebコンテンツの草創期に広く利用された。
なるほど、一つのプログラムだけを見ていても全体像が掴めないのですね。
その通りです。さらにクラウドの普及により、物理サーバーの上にOSとプログラムがあるだけの単純な構造ではなくなりました。仮想化レイヤー、コンテナレイヤー、各種マネージドサービスなどが何層にも重なる「縦の複雑性」も増しています。技術の進化で便利になった反面、その仕組みをきちんと理解しようとすると、以前より遥かに多くの知識が求められるのが現状です。
そうした課題感が、書籍『バックエンドエンジニアのためのインフラ・クラウド大全』の執筆にも繋がっているのでしょうか。
その通りです。インフラやクラウドが複雑で難しいと感じて、学ぶ前から諦めてしまうエンジニアは少なくありません。ですが、どんなに複雑に見える技術も、元はすべて人間が作ったものです。一つひとつ丁寧に見ていけば、必ず仕組みは理解できますし、専門家でなくても対処は可能なんです。
この本には、その広大なインフラやクラウドの世界を諦めずに学ぶための「最初の地図」になってほしい、という思いを込めました。

特にトラブルシューティングやパフォーマンスチューニングといった領域では、自分が直接関係ないと思っている分野の知識が不可欠になることがよくあります。この本が、そうした領域横断的な理解への「取っ掛かり」となり、先輩と会話したり、より深く学んだりするための起点になれば嬉しいですね。
知識のギャップをどう埋める? 「データの流れ」から理解を広げる学習法
バックエンドエンジニアが特につまずきやすいインフラ領域はどこだと感じていますか?
バックエンドエンジニアが特に壁を感じやすいのは、サーバー構成やネットワーク設計といった、システム全体のアーキテクチャを考える部分です。
そこでは、単にコードを書くだけでなく、「システムを止めないか(可用性)」「アクセスに耐えられるか(キャパシティ)」「将来スケールできるか(スケーラビリティ)」といった、アプリケーション開発とは全く異なる視点が求められます。多くの方が、この思考の切り替えで苦労されている印象ですね。
なるほど。アプリケーションという「中身」だけでなく、それを支える「器」の設計思想が問われるわけですね。クラウド化が進み、物理的な機器に触れる機会が減ったことも、その感覚を掴みづらくしている一因かもしれません。
おっしゃる通りです。特に今はネットワークも無線が当たり前なので、物理的な感覚が薄れ、体感として学びにくい領域になっているのは間違いありませんね。
だからこそ、学習する際は自分が今直接触れている実務範囲から、少しずつ外側に知識を広げていくのがおすすめです。例えば、プログラムを起動する際に何気なく設定しているポート番号が何なのか、といった身近なところから概念に繋げていくと、理解しやすいと思います。
まずは自分の足元から、ということですね。では、駆け出しのバックエンドエンジニアが「最低限ここまでは押さえるべき」という境界線はどこにあると思われますか?
実行基盤となるサーバー1台の中での「データの流れ」を把握できるようになることですね。どこから来たデータが、どういうルートを通り、物理的に何を経由して、どう返っていくのか。これがわかっていると、トラブルシューティングの際に「どこまでは正常に動いているか」という切り分けができます。

「データの流れ」が分かると、次のアクションに繋がる会話ができるようになるので、まずはここを理解するのが非常に重要です。
クラウドネイティブの時代になり、学習の優先順位も変わってきたかと思います。従来のオンプレミスの知識と、クラウドサービスの知識、どちらから学ぶべきでしょうか?
「学習スタイルによる」というのが正直なところです。ただ、多くの人にとっては、AWSやGoogle Cloudが提供しているクイックスタートガイドなどを参考に、まずクラウドで「動くもの」に触れてみて、それを分解しながら仕組みを理解していく方が、挫折しにくいでしょう。
もちろん、基礎から体系的に学びたい探求心の強い方は、オンプレミスの知識から入るのも良いと思います。いずれにせよ、実際に手を動かす実践は必須です。
システムは必ず壊れる。「止めない」より「早く回復する」可用性設計
次に、システムを止めないための可用性設計についてお伺いします。安定して稼働し続けるサービスを実現するために、設計段階で最も重視すべきことは何でしょうか?
大前提として理解するべきなのは「止まらないシステムはあり得ない」ということです。物理的なものである以上、必ずいつかは壊れます。ですから、壊れにくくすることも大事ですが、それ以上に「いかに早く異常を検知し、迅速に切り離し、早く回復させるか」という自己修復の考え方がセオリーになります。
「早く見つける」というのは、具体的にどのような仕組みで実現するのでしょうか?
常に近くでチェックして、すぐにリアクションすることが求められるので、人間がやるのは現実的ではありません。そこで、ロードバランサー(※2)やクラウドのヘルスチェック機能、nginx(※3)といった近接するレイヤーで常に監視を行い、異常を検知したら即座に対象を切り離して回復処理を自動で実行する、という仕組みを構築するのが一般的です。いわば「自己修復」の機能ですね。
※2 ロードバランサー:サーバーへのアクセスを複数のサーバーに分散させることで、一台あたりの負荷を軽減し、システムの安定性を高める仕組み。
※3 nginx:Webサーバーソフトウェアの一つ。高い処理性能を持ち、Webサーバーのほか、リバースプロキシやロードバランサーとしても広く利用されている。
修復の自動化が鍵になるのですね。一方で、特に中小企業などでは、対策にかけられる予算が限られているケースも多いと思います。SPOF(単一障害点)を排除したいが、どこから手をつければいいか、優先順位の判断基準はありますか?
最近はマネージドサービスに可用性を高めるオプションが組み込まれていることが多いので、まずはそれを活用するのが基本です。その上で費用を抑えたい場合は、「許容できるダメージはどの程度か」を明確にすることが重要になります。
つまり、止まらないことが絶対ではなく、例えば「月に1回30分停止する」というリスクがビジネスにどれだけ影響を与えるかをシミュレーションする。その影響度に応じて、リスクを「受容する」のか、「緩和する」のかを選択すれば良いのです。

リスクマネジメントの話になってくるわけですね。
その通りです。多くのクラウドの可用性機能も、「止めない」ことより「自動で早く回復する(1〜3分程度)」ことを提供している場合が多いです。どのプランを選ぶかは、結局のところコストとリスク許容度のバランスで決まります。
必ずしも完全な冗長構成を目指す必要はなく、代替手段として「性能は落ちるが手作業で業務を継続する」といった選択肢も設計に含めることができます。
そうしたリスクの基準は、どのように決めていくのが望ましいのでしょうか。
現実的には「なんとなくの基準」で運用されていることが多いのが実情です。しかし、年に1回など定期的に、重要システムと、あると便利なツールを分類し直し、それぞれのビジネス価値に見合った基準に見直していくプロセスが理想ですね。
これはエンジニアだけでなく、ビジネスサイドも巻き込んで、システムの価値をすり合わせていくことが大切です。
ボトルネック特定は「原理原則」に忠実に。遠回りに見えて最速の解決策
パフォーマンスに問題が発生した際の、原因特定についてお伺いします。アプリケーション側とインフラ側、どのように切り分けて調査を進めるのが効率的でしょうか?
ここでも基本に忠実に「データの流れに沿って、一つずつ区間計測していく」のが原理原則です。どこまでは速くて、どこからが遅いのかを地道に特定していく。遠回りに見えるかもしれませんが、結果的にはこれが一番の近道になることがほとんどです。
経験や勘に頼るのではなく、計測に基づいた地道な切り分けこそが、確実な解決に繋がるのですね。
まさにそうです。安定して期待通りの結果を出すためには、原理原則に則って、計測に基づいた切り分けをすることが非常に重要です。計測には事前準備が要りますが、最近のクラウドサービスは、利用状況を計測する機能が標準で備わっていることが多いので、計測基盤が何もないということは減ってきましたね。
クラウド環境において、特にボトルネックになりやすいリソースはありますか?
システムによりますが、ケースとして多いのはCPUとディスクI/O(※4)ですね。CPUは、低コストのインスタンスを使っていると性能が頭打ちになったり、共有基盤で他の利用者の影響を受けたりすることがあります。一方でディスクI/Oは、ローカルの開発環境が高速なため、本番環境との差に気づかず、うっかり遅延を発生させてしまうケースがありがちです。
ただ、先入観を持つのは禁物です。必ず一度はすべてのリソースを俯瞰して、診断にバイアスがかからないようにすることが大切です。
※4 ディスクI/O:コンピュータのストレージ(ディスク)に対するデータの読み込み(Input)と書き込み(Output)のこと。この処理速度がシステムのパフォーマンスに大きく影響することがある。
データベースのチューニングなどは、バックエンドエンジニアとインフラエンジニアで、どのように役割分担するのが良いのでしょうか?
トラブルシューティングやチューニングは、領域をきれいに分割するのが難しい分野です。処理の流れは、人間が決めた役割分担をまたいで進んでいきますからね。「ここからはあなたの仕事」と線を引くのではなく、それぞれの専門性を持ち寄って、処理フロー全体で協力して当たるのが最良の結果に繋がると思います。
「移行に成功、運用で失敗」はなぜ起こる? クラウドネイティブ移行の落とし穴
可用性やパフォーマンスといった基本的ながらも重要な課題の先に、近年ではコンテナ化やクラウドネイティブへの移行という、新たなチャレンジも増えています。「移行で技術的には成功したが、運用で失敗する」という話を耳にすることがありますが、これはなぜ起こるのでしょうか?
そもそも「運用で失敗したら、それは技術的に成功していない」と私は考えています。なぜそうした認識のズレが起こるかというと、ゴール設定が狭いからです。使える状態になって初めてプロジェクトは成功と言えるはずなのに、開発と運用が分断されていると、そうした失敗が起こりがちです。

あくまでもプロジェクトとしての成功を見据える必要があるのですね。移行を成功させるために、特に重要になるポイントは何でしょうか?
アプリケーションがThe Twelve-Factor App(※5)のような原則に沿って設計されていれば、大きな問題は起きにくいです。その上で鍵となるのが、チームの力ですね。コンテナ化を進めると、アプリケーション開発者と、OSやコンテナといったインフラ領域がより密接になります。
そこで重要になるのが、開発者とインフラ担当者がそれぞれの専門領域に閉じこもるのではなく、互いの領域に関心を持ち、協力し合える文化です。例えば、開発者は「自分の書いたコードがコンテナ上でどう動くのか」を理解しようと努め、インフラ担当者は「そのアプリケーションにとって最適な環境は何か」を一緒に考える。そうした建設的な歩み寄りが、移行プロジェクトの成功を左右します。
※5 The Twelve-Factor App:モダンなクラウドアプリケーションを構築するための方法論。ポータビリティと回復性を最大化するための12のベストプラクティスを提唱している。
Kubernetes(※6)の導入において、過度に複雑化してしまう失敗を避けるための指針はありますか?
※6 Kubernetes:コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースプラットフォーム。
背伸びをしすぎたり、過度に「正しさ」を追求したりすると、現状とのギャップが大きくなり失敗の要因になります。理想を掲げることは大切ですが、まずは現実的な一歩を踏み出すことが重要です。 例えば、いきなり全てのサービスをKubernetes上で動かすのではなく、まずは一つのアプリケーションだけコンテナ化してみる。あるいは、今ある運用上の課題(例えば「デプロイに時間がかかる」など)を一つだけ解決するところから始めるのが現実的です。
スモールスタートが重要だということですね。一方で、そもそもKubernetesのような複雑な技術を、どのような基準で「採用する/しない」と判断すべきなのでしょうか?
まさにその点が重要で、そもそもKubernetesは、「それでないと駄目な理由」がある場合に選択すべきものです。可能であれば、Amazon ECS(※7)などのよりシンプルなサービスで運用を優先し、規模や要件がKubernetesを必要とする段階になってから採用を判断するのがスマートだと思います。
※7 Amazon ECS (Elastic Container Service):AWSが提供するコンテナ管理サービス。コンテナのデプロイ、管理、スケーリングを容易にする。
マイクロサービス化とコンテナ化を同時に進める、といったケースはいかがでしょうか。
この二つは別のテーマなので、基本的には分離して進めるべきです。一つの変更が大きければ大きいほど、リスクは増大します。プラクティスとしては、変更を小さく刻んでいくのが鉄則ですね。
「監視疲れ」を生まないために。ユーザー影響に直結する指標を見極める
コンテナ化などで複雑化したシステムでは「どこで何が起きているかわからない」という状況が生まれやすいと思います。障害の兆候を見逃さないために、どのような監視から始めるべきでしょうか?
まず、監視が何もない状態が一番危険です。もし本当に何も監視していないのであれば、ユーザー視点に近い外形監視や合成監視から始めるのが良いでしょう。
内部の監視については、クラウド付属の機能や、DatadogなどのオブザーバビリティSaaSが提供する標準的な項目から着手するのが手堅いですね。
馬場さんが支援に入られる現場で、よく見られる監視の課題はありますか?
クラウドサービスのおかげで、メトリクス(※8)の取得自体はできていることが多いです。しかし、障害に気づくきっかけがユーザーからの申告、というケースは散見されますね。
そうした場合は、監視のアプローチを変えることが効果的です。内部のサーバーの状態を見るだけでなく、あたかも一人のユーザーのように、定期的に外からサービスにアクセスしてみて、正常な応答が返ってくるかを確認するフローを追加することをおすすめします。
※8 メトリクス:システムのパフォーマンスや状態を定量的に測定するための指標。CPU使用率、メモリ使用量、レスポンスタイムなどがある。
なるほど、ユーザー視点の監視を追加するのですね。ただ、監視項目を増やすと、今度はアラートが鳴りすぎてしまう「アラート疲れ」に陥る、という話もよく聞きます。このあたりは、どのようにバランスを取れば良いのでしょうか?
「アラート疲れ」を避けるための最も重要な原則は、「何がアラートの対象になるべきか」を見極めることです。例えば、多くの現場でやりがちなのが、CPU使用率のような内部リソースの状況をアラートの基準にしてしまうことです。しかし、これは本質的に重要度が低い。唯一の例外は、ストレージ使用量のように、完全に枯渇するとサービスが停止してしまうものです。
本当にアラートを出すべきなのは、レスポンスタイムの悪化やエラー率の上昇といった、ユーザー体験に直接影響するものです。極端な話、CPU使用率が100%でも、ユーザーへの応答が速いのであれば、それはリソースを効率的に使えている良い状態と言えます。内部リソースの状況だけで、エンジニアを夜中に呼び出すようなアラートを鳴らすべきではありません。
オブザーバビリティツールの選定において、OSSと商用サービスはどのように使い分けるべきでしょうか?
知見があまりないのであれば、最初はSaaSの利用を推奨します。機能が充実しており、サポートも受けられます。監視基盤の運用負荷はできるだけ下げ、サービス本体の開発にリソースを集中させるべきです。OSSの活用は、知見が溜まったり、コスト要件が明確になったりしてから検討するのが良いでしょう。
AI時代でも変わらない、エンジニアの「プラスワンの価値」
生成AIの台頭など、技術の変化が激しい中で、バックエンドエンジニアが10年後も価値を発揮し続けるために、最も大切にすべきことは何だと思われますか?
少し体育会系に聞こえるかもしれませんが、努力、根性、執念といった、物事を諦めずにやり抜く力は、これからも不可欠だと思います。生成AIの登場で、世の中にある知見をそれなりの形に組み上げることは、非常に効率的にできるようになりました。
しかし、プロフェッショナルとして、ただ組み上げるだけでなく、それに責任を持ち、状況や顧客に合わせて「プラスワンの価値」を加えることが求められます。そこは非常に苦労する部分ですが、この最後のひと押しをやり抜く力が、エンジニアとしてのバリューになり、信頼に繋がるのだと思います。
AIにできることが増えるからこそ、人間にしかできない泥臭い部分や、価値を届ける最後のこだわりに、より一層焦点が当たるということですね。
もちろん、新しい技術を学び続け、古いやり方に固執しない柔軟性も大切です。その上で、ユーザーに本当に良いものを届けるために、最後まで粘り強くやり抜くこと。その姿勢こそが、これからもエンジニアとして輝き続けるための鍵になるのだと思います。
ライター