システムインフラの変遷
インフラエンジニアとして7年ほど過ごしてきたのと、今サーバレスシングルページアプリケーションについて勉強していて、サーバレスに至るまでいろいろあったよなあと振り返る機会があったので、システムインフラの変遷を感じるままに書いてみました。
(昔の)ITインフラについてあまりよく知らない人向けくらいに書いています。
※物理環境からサーバレスアーキテクチャに至るまでの変遷を、私個人の視野・視点から非常にざっくり、かいつまんで記載しています。歴史的に不正確・不十分な記述がある可能性が大いにありますのでご注意ください。また、そういった点がありましたら是非コメントください。
物理環境
最も単純なインフラでは、物理的なサーバそれぞれに1つのOSをインストールし、個別の役割を持ったサーバを構築してシステムを構成していました。
仮想化
VMwareやKVM、Hyper-V等のサーバ仮想化技術により、1台の物理サーバ上に複数の独立したOSを仮想マシンとして動作させることが可能になりました。*1
ハードウェアそのものの「物理層」と、ユーザから見える「論理層」を分離したことになります。
この頃画期的だったのは仮想アプライアンスです。あらかじめ必要なソフトウェアや設定を導入した状態の仮想マシンイメージを提供するもので、環境のセットアップが格段に簡便になりました。今のAWSでいうAMIがイメージに近いです。
仮想化は「物理サーバの集約によるコスト削減」を主として導入が進んだ認識ですが、それに加えて
- 物理層と論理層の分離により、インフラレイヤでも柔軟な設計変更が可能になった
- 論理層の構築作業をのプログラムにすることにより、より強力な自動化が可能となった(Infrastructure as Code)
といったメリットが目立ってきました。 さらに加えて、サーバ(CPU、メモリ、ローカルディスク)だけでなく、ネットワークや共有ストレージのハードウェアもこれまで以上に仮想化が進み、システムの構成要素のほぼ全てが仮想化の恩恵を受けるようになりました。
クラウド
上記のような仮想化技術のメリットは、物理層の集約規模が大きくなればなるほど享受しやすくなります。同じ構成・仕組みで共通的なオペレーションを自動化すれば、コスト削減効果が高くなるからです。(スケールメリット)
かつ、論理層はインターネット経由でも操作できるため、クラウドサービスを提供する企業が発展しました。
現在の主要なクラウド業者といえば以下3社ですね。もちろんほかにもありますが。
- AmazonWebServices
- GoogleCloudPlatform
- Microsoft Azure
クラウド環境では
といったことから、従来には比べ物にならない早さでシステム構築できるようになりました。
AWSを例に、Web3層アーキテクチャを構成する場合に利用するサービスを(超ざっくり)図にします。
これらのうちRDSは、リレーショナルデータベースのフルマネージドサービスです。
フルマネージドサービスは、従来高度な技術をもったインフラエンジニアが行っていた、インフラまわりの非機能的な設計や作業の多くを裏で自動的に行ってくれるサービスです。
フルマネージドサービスを活用すると煩わしい環境管理作業にコストをかけずにシステム運用でき、クラウドサービスの大きな利点となっています。
DevOpsという文化も、こういった「インフラをコード化して手間をかけずに運用する」ことを前提に置いたときに生まれたものと思います。
ただし、自動化が進んでいるとはいえ、論理的なサーバを持っていることには変わりないため、ネットワーク配置、冗長化、バックアップあたりの設計には、従来と同様の考慮が必要です。
フルマネージドサービスの中には論理的なサーバを(ユーザ側では)持たないサービスもあります。AWSで言うとS3、DynamoDB、Route53など。
こういったサービスのみを利用したアーキテクチャが、サーバレスアーキテクチャです。
サーバレスアーキテクチャでは、ユーザから見えるのはAPIなどのエンドポイントのみなので、ユーザが論理的なサーバを持つことはなくなり、環境管理についてはもはや全く気にする必要がなくなります。
AWSを例にすると、サーバレスアーキテクチャの中心を担うのがLambdaです。 Lambdaは、特定の機能ではなく、任意のコードを実行するサービスであるため、APサーバの役割を果たします。 このような「任意のコード実行のためのフルマネージドサービス」の登場が、サーバレスアーキテクチャ発展の最大要因と思います。
サーバレスアーキテクチャではAPI等でサービスを利用するため、クライアントサイドのSPAのロジックに直接組み込むことができ、結果としてサーバレスSPAを構築できます。
サーバレスアーキテクチャの内部技術として使われるものの一つにコンテナがあります。
コンテナはサーバ仮想化と似ていますが、サーバ仮想化ではOSのイメージ(OSをインストールする先のディスク領域)が各VMで独立なのに対し、コンテナではOSのカーネルは共有し、イメージの差分データと、そのOS上で動作するプロセスを独立させて動作させる点で異なります。
コンテナでは各コンテナで独立している部分が少なくなるため、データが軽量かつ起動が高速という特徴があります。 Lambdaはこれを利用することで、ユーザが動かしたいときだけ動くサーバ(のように見えるプロセス)を実現しています。
おわりに
システムインフラの変遷について書いてきましたが、当然あとの方のアーキテクチャが正義というわけではなく、メリデメはあります。例えばサーバレスアーキテクチャでは、インフラのアップデートが比較的早いスパンであることが多いにも関わらず、アプリ側が必ずついていかなければならないことや、1ベンダーに依存するシステム構成になりやすいことがあると思います。適したものを選ぶ必要があるのはずっと変わりません。
最近はクラウドから入ったクラウドネイティブな方も多いと思います。そういう自分も仮想化ネイティブでしたが、物理→仮想化よりクラウドのほうが大きな変化に感じているので、クラウドにしっかりキャッチアップしていきたいです。
サーバレスアーキテクチャのように、どんどんインフラ側にかけるコストが低減され、よりプロダクトにかけるコスト/技術が重要視されていくので、インフラエンジニアとしては徐々にでもフロント側へスキルを寄せていかないとなあと思う次第です。