サーバレスコンピューティングにより、開発者やエンジニアがインフラストラクチャのプロビジョニングと管理に頭を悩ませる必要がなくなります。サーバレスコンピューティングを使用しないと、一般的なソフトウェアの開発、導入、管理のライフサイクルは以下のようになります。
開発者がソースコードを作成する。
運用チームがアプリケーションのパフォーマンスおよび拡張性要件を評価し、インフラストラクチャの計画案を準備する。
この計画をクラウド・サービス・プロバイダと共有し、特定の数のサーバを購入する。
アプリケーションが1週間円滑に動作した後、高いメモリ使用率が原因でクラッシュする。
開発者および運用エンジニアが問題をデバッグし、負荷を分散させるために数台のサーバを追加購入することになる。
他の問題が断続的に発生し続け、開発者は就業日の半分をインフラストラクチャの問題のデバッグに費やす。
運用チームはクラウドサービスのコストの上昇について財務部門から絶えずプレッシャーを受けるため、最適化する方法を常に模索する必要がある。
サーバレスコンピューティングを使用すると、開発者の業務はステップ1で終了します。アプリケーションの実行に必要なインフラストラクチャを自動的に割り当て、管理し、拡張するのはクラウドプロバイダです。インフラストラクチャの計画策定、サーバのヘルスチェックの監視、過大請求の心配は不要です。クラウドプロバイダが、アプリケーションのニーズに応じてリソースを自動的に追加または削除するため、使用した分だけが課金されます。それ以上でも、それ以下でもありません。
ここで重要なのは、サーバレスとはサーバを使用しないという意味ではないということです。サーバは使用しますが、インフラストラクチャの計画策定、管理、拡張性など、サーバに関連する通常のタスクは開発者からは見えません。
サーバレス環境では、開発者がビジネスロジックを実装し、その後の処理はクラウドプロバイダが処理するものと考えることができます。クラウドプロバイダは、そのアプリケーションを仮想マシンやコンテナの中で実行することができます。開発者はそれを知る必要も気にする必要もありません。つまり、アプリケーションは最小限のリソースを使用して実行され、必要に応じて拡張されます。
FaaS(Function-as-a-Service)は、マイクロサービスアプリケーションをサーバレスで構築する方法です。FaaSを使用すると、開発者はコードを臨機応変に作成することができ、このコードを、ユーザがWebアプリケーションのボタンをクリックしたときや、メッセージキューで新しいメッセージを受け取ったとき、または誰かがHTTPサーバにリクエストを送信したときなど、特定のイベントを受け取ったときに実行できます。
マイクロサービスアーキテクチャとは、開発者が複数の緩く結合したサービスにビジネスロジックを分割できるようにする実装アプローチです。これには、以下のようないくつかの利点があります。
小さいサービスの方がテストとメンテナンスが簡単である。
複数のサービスに広がったビジネスロジックにより、単一障害点を防止できる。
導入が迅速。
FaaSをサーバレスのサブセットと考えることができます。通常、サーバレスは計算、 データベース、APIゲートウェイ、保存などのすべてのサービスカテゴリをカバーし、計画、管理、課金を開発者に代わって行います。一方、FaaSはイベント駆動の計算だけに集中し、開発者はイベントに基づいてアプリケーションコードをトリガすることができます。FaaSのもう1つの重要な利点は、単一のプログラミング言語やフレームワークを使用してアプリケーションを構築する必要がない点です。任意の数の異なる言語やフレームワークで、ロジック駆動型の関数を作成することができます。例を検討してみましょう。
クラウド環境で、あなたはメッセージキューを関数と接続しています。このキューでメッセージを受け取ると(イベント)、関数がREST APIを呼び出し、これがビジネスロジックを実行します。同様に、認証サービスをデータベースと接続し、またEメールプロバイダをシステムの他の部分と接続する、別の関数を作成することができます。
サーバレスとPlatform-as-a-Serviceは、いずれもインフラストラクチャが開発者には見えず、開発者はコードを作成するだけで済む点が類似しています。ただし、この2つにはいくつかの違いがあります。
PaaSでは、アプリケーションを拡張するためには手動で設定しなければなりません。一方、サーバレスは必要に応じて自動的に拡張されます。
サーバレスアプリケーションでは、コードは呼び出された場合にのみ迅速に実行されます。例えば、サーバレスのアプリケーション/関数は、アクティビティがないときには完全にシャットダウンし、その後、イベントに応答するために(数ミリ秒以内で)リスタートされます。PaaSアプリケーションは、そのような速度でスケールアップまたはスケールダウンすることはできません。
PaaSを使用すると、インフラストラクチャと導入をより適切に制御できます。しかし、サーバレスはすべてを抽象化します。
ほとんどのソフトウェアアプリケーションにはフロントエンドとバックエンドがあります。通常、フロントエンドには、クライアント側のロジックに加えてユーザ向けインターフェイスが含まれます。例えば、Webアプリケーションのフロントエンドはブラウザに表示されるものです。バックエンドは、背後で発生しているすべてのもので構成されます。ログインすると、ユーザ名とパスワードはフロントエンドが受け取りますが、検証のためにバックエンドサーバに送られます。同様に、サインアップの際に収集されたユーザ情報も、バックエンドの一部であるデータベースに保存されます。すべてのバックエンドエンティティ(認証サービス、データベース、API)が実行されるサーバもバックエンドの一部です。
BaaS(Backend-as-a-Service)は、バックエンドの開発および管理の責任を開発者から引き受けます。開発者はアプリケーションのフロントエンドに集中し、APIやSDK(ソフトウェア開発のためのプリビルドキット)を使用してこれをバックエンドに接続することができます。
BaaSとサーバレスは、いずれもバックエンドが開発者には見えない点が類似しています。ただし、BaaSを使用しても、サーバレスのようなオンデマンドの拡張性は得られません。さらに、PaaSと同様に、BaaSアプリケーションはサーバレスのように迅速なスケールアップとスケールダウンはできません。
以下の図に示した従来のセットアップでは、2台のサーバで2つのアプリケーションを実行しています。アプリケーションごとに個別のサーバをプロビジョニングしているため、これは安全なアプローチです。しかし、(推定で)30 %の時間はアプリケーションがリクエストを一切受け取らないため、無駄も発生します。さらに、負荷が劇的に増えた場合にアプリケーションを自動的に拡張する方法がありません。
これに対し、左側のサーバレスアーキテクチャでは、わずか2台のサーバが4つのアプリケーションを実行しています。現在の需要ではこれで十分です。この時点ではこれ以上のサーバをプロビジョニングする必要はありません。ただし、プラットフォームが拡張の必要性を認識すると、必要な数のサーバを直ちに追加します。また、不要になったサーバは使用を停止します。
お使いのインフラストラクチャの定義、メンテナンス、拡張がクラウドプロバイダによって行われるため、セキュリティも主にクラウドプロバイダが対応します。ご自身でのOSの強化やファイアウォールの実装は不要です。
サーバレスコンピューティングがきわめてセキュアで、ハッキングが困難であるもう1つの理由は、これが一時的なものだからです。サーバレスのアプリケーション/関数/コンテナはニーズに応じて実行され、停止されるため、長期的な攻撃の可能性を大幅に低減することができます。
サーバレスを使用すると、マイクロサービスアプローチに移行することができます。この結果、サービスごとにポリシーを定義できますが、これはサービスが小さいと大幅に簡単になります。
しかし、セキュリティに関する責任の一部はお客様が担うことになります。以下の点に注意してください。
お客様に代わってクラウドプロバイダがOSレベルの依存関係にパッチを適用する可能性がありますが、アプリケーションの依存関係にパッチが適用され、最新の状態になっているかどうかはご自身で確認する必要があります。
サーバ/関数へのアクセスを許可すると同時に、最小特権の原則を使用してください。つまり、業務を行うために必要な最小限のアクセス権をユーザに提供してください。
イベント駆動型の関数を使用している場合は、インジェクション攻撃(SQLインジェクションなど)を回避するために入力データがサニタイズされていることを確認してください。
最後に、使用しているプログラミング言語またはフレームワークの関連するベストプラクティスを使用して、アプリケーションコードがセキュアであることを確認してください。
最も得意とすること(コードの作成)に開発者を集中させ、生産性を向上させる
正式なインフラ計画は不要
従量課金モデルによりコストを削減
強化され、自動化された拡張性
一部のサーバレス製品では、コールドスタート(操作がないためサーバをシャットダウンし、その後リスタートすること)によりパフォーマンスが低下する可能性がある
通常は、1つのプロバイダから別のプロバイダへのサーバレス環境の移行は非常に難しい
長期間実行するタスクのコストが高くなる可能性がある。サーバレスは無限に実行する必要がないタスクには理想的なため、関数/アプリケーションがアイドル状態のときのコストは下がります。
ユーザによっては習得に時間がかかる。サーバレス環境でのアプリケーションの構築は、従来のアプローチとは基本的に異なります。
サーバレスに関して大半のユーザが抱える懸念はコールドスタートです。前述のように、サーバレス環境のアプリケーションは、しばらく呼び出されないと休止状態になります。新しいリクエストを受け取ると、アプリケーションは直ちに再度アクティブになります。一部のサーバレス製品では、この起動時間によって大幅なレイテンシが加わることがあります。ただし、クラウドプロバイダは、アプリケーション/サーバ/関数のスピンアップに費やす時間を最小限に抑えることでこの問題に対応しようとしています。
サーバレスは、組織の種類や規模を問わず多くのメリットをもたらすため、今後数年間で採用が進むことが予想されます。