サーバーレスコンピューティングとコンテナはどちらも、クラウドでホストされるWebアプリケーションのオーバーヘッドを削減するアーキテクチャですが、いくつかの重要な点で異なります。コンテナは仮想マシンよりも軽量ですが、サーバーレスの展開は、コンテナベースのアーキテクチャよりもさらに軽量で簡単に拡張できます。
この記事を読み終えると、以下のことができるようになります。
記事のリンクをコピーする
サーバーレスコンピューティングとコンテナは、開発者がアプリケーションを構築するにあたって、従来のサーバーや仮想マシンでホストされるアプリケーションよりも必要なオーバーヘッドははるかに少なく、より高い柔軟性を持ちます。開発者が使用するアーキテクチャのスタイルは、アプリケーションのニーズによって異なりますが、サーバーレスアプリケーションはよりスケーラブルで、通常は費用対効果が高くなります。
コンテナには、アプリケーションと、システムライブラリ、システム設定、その他の依存関係など、アプリケーションが適切に実行するために必要なすべての要素の両方が「含まれて」います。「水を追加するだけ」のパンケーキミックスのように、コンテナは機能を実行するために、ホストされて実行されるものを1つだけ必要とします。
あらゆる種類のアプリケーションをコンテナで実行できます。コンテナ化されたアプリケーションは、ホストされている場所に関係なく同じ方法で実行されます。コンテナは、必要に応じて簡単に移動およびリリースできます。これは、物理的な出荷コンテナが標準サイズであり、内容物に関係なく、さまざまな輸送手段(船、トラック、列車など)を介してどこにでも出荷できるのと同様です。
技術用語では、コンテナはマシンまたはサーバーを個別のユーザー空間環境に分割する方法であり、各環境は1つのアプリケーションのみを実行し、マシン上の他のパーティションセクションと対話しません。各コンテナはマシンのカーネルを他のコンテナと共有します(カーネルはオペレーティングシステムの基盤であり、コンピュータのハードウェアと相互作用します)が、マシン上の唯一のシステムであるかのように実行されます。
仮想マシンは、完全なコンピューターシステムを模倣するソフトウェアです。それをホストする他のマシンから隔離され、独自のカーネルを持つことを含め、あたかもそれが唯一のオペレーティングシステムであるかのように動作します。仮想マシンは、1つのサーバーで複数の環境をホストする別の一般的な方法ですが、コンテナよりもはるかに多くの処理能力を使用します。
サーバーレスアプリケーションは機能別に分割され、サードパーティベンダーによってホストされます。アプリケーション開発者は各機能の実行時間に基づいた金額のみサードパーティベンダーによって課金されます。サーバーレスコンピューティングの詳細については、サーバーレスコンピューティングとは?をご覧ください。
「サーバーレス」コンピューティングは実際にはサーバー上で実行されますが、アプリケーションが必要とするサーバースペースをプロビジョニングするのはサーバーレスベンダーに任されており、特定の機能またはアプリケーションに特定のマシンが割り当てられていません。一方、各コンテナは一度に1台のマシン上に存在し、そのマシンのオペレーティングシステムを使用しますが、必要に応じて別のマシンに簡単に移動できます。
コンテナベースのアーキテクチャでは、リリースされるコンテナの数は開発者が事前に決定します。これに対して、サーバーレスアーキテクチャでは、バックエンドは本質的かつ自動的に要求に応じてスケーリングされます。
輸送コンテナの比喩に戻ると、海運会社は特定の製品の需要の増加を予測し、その需要を満たすためにより多くのコンテナを目的地に出荷しようとすることができますが、需要が期待値を超えた場合に指をぱちんとならして製品がいっぱいのコンテナを作り出すことはできません。
サーバーレスアーキテクチャは、まさにそれを実現する方法です。計算能力に関して言えば、サーバーレスコンピューティングは現代の家庭の水道のようなものです。栓を開くだけで、消費者はいつでも必要なだけの水を手に入れて使用でき、使用した分だけ支払います。これは、一度にバケツ1杯または輸送コンテナ1台を購入しようとするよりもはるかにスケーラブルです。
コンテナは常に実行されているため、その時点では誰もアプリケーションを使用していない場合でも、クラウドプロバイダーはサーバースペースに対して課金します。
アプリケーションコードは呼び出されない限り実行されないため、サーバーレスアーキテクチャでは継続的な費用は発生しません。代わりに、開発者は、アプリケーションが実際に使用するサーバー容量に対してのみ課金されます。
コンテナはクラウドでホストされますが、クラウドプロバイダーはこれを更新または維持しません。開発者は、リリースする各コンテナを管理および更新する必要があります。
開発者の観点から見ると、サーバーレスアーキテクチャには管理するバックエンドがありません。ベンダーは、コードを実行するサーバーのすべての管理およびソフトウェアの更新を処理します。
コンテナは、システム設定やライブラリなどを構成する必要があるため、サーバーレス機能よりも初期設定に時間がかかります。構成が完了すると、コンテナは数秒でリリースされます。一方、サーバーレス機能はコンテナマイクロサービスよりも小さく、システムの依存関係がバンドルされていないため、リリースに数ミリ秒しかかかりません。サーバーレスアプリケーションは、コードがアップロードされるとすぐに実装できます。
バックエンド環境はローカル環境で複製するのが難しいため、サーバーレスWebアプリケーションをテストすることは困難です。対照的に、コンテナはどこにリリースされても同じように実行されるため、コンテナベースのアプリケーションを本番環境にリリースする前にテストするのは比較的簡単です。
サーバーレスアーキテクチャを可能にするCloudflare Workersについては、当社は仮想テスト環境を作成して、開発プロセスを改善するのに役立てています。
両方ともクラウドベースであり、どちらもインフラストラクチャのオーバーヘッドを大幅に削減しますが、コンテナよりもサーバーレスコンピューティングの方が削減が大きくなります。どちらの種類のアーキテクチャでも、アプリケーションは分解され、小さなコンポーネントとしてリリースされます。コンテナベースのアーキテクチャでは、各コンテナが1つのマイクロサービスを実行します。
マイクロサービスはアプリケーションのセグメントです。各マイクロサービスは1つのサービスを実行し、複数の統合されたマイクロサービスが組み合わされてアプリケーションを構成します。名前はマイクロサービスが小さいことを示しているように見えますが、小さい必要はありません。
マイクロサービスの集合としてアプリケーションを構築する利点の1つは、開発者が変更を加える必要があるときにアプリケーション全体を更新する代わりに、一度に1つのマイクロサービスを更新できることです。サーバーレスアーキテクチャの場合のように、アプリケーションを機能のコレクションとして構築すると、同様の利点がより詳細なレベルで得られます。
サーバーレスアーキテクチャを選択する開発者は、アプリケーションが拡張可能かどうかを心配することなく、新しいアプリケーションを迅速にリリースおよび反復できます。さらに、アプリケーションで一貫したトラフィックや使用状況が見られない場合、サーバーレスコンピューティングは、コードを常に実行する必要がないため、コンテナよりもコスト効率が高くなります。
コンテナを使用すると、開発者はアプリケーションを実行する環境(この場合はさらにメンテナンスが必要になります)および使用する言語とライブラリをより細かく制御できます。このため、コンテナは、アプリケーションの元の実行環境をより厳密に再現できるため、レガシーアプリケーションをクラウドに移行するのに非常に役立ちます。
そして最後に、一部の機能がサーバーレス、一部の機能がコンテナでリリースされたハイブリッドアーキテクチャを使用することが可能です。たとえば、アプリケーション機能がサーバーレスベンダーによって割り当てられたよりも多くのメモリを必要とする場合、機能が大きすぎる場合、または特定の機能が他の機能よりも長時間実行する必要がある場合、ハイブリッドアーキテクチャにより、開発者はサーバーレスのメリットを享受しながらサーバーレスがサポートできない機能にコンテナを使用することができます。
Cloudflareは、開発者が高パフォーマンスのサーバーレスアプリケーションをCloudflare Workersを介して構築できるようにします。