サーバーレスコンピューティングとは、サーバーを維持することなく、アプリケーションをサービスとしてホストできるクラウドベースの実行モデルです。

サービスプロバイダーがサーバー上のリソースの割り当てを担当し、ユーザーには実際の使用量に基づいて請求がされます(従量課金)。自らは作成するコアアプリケーションに集中することができ、インフラストラクチャはサービスプロバイダーに任せることになります。サーバーレスコンピューティングは「サービスとしてのファンクション(FaaS)」としても知られています。

例を挙げると、サーバーレスPHPは、PHPというバックエンドを使用したサーバーレスコンピューティングの実装に他なりません。

今回の記事では、サーバーレスPHPの意味、その主な機能と長所・短所を詳しく見て、クラウドコンピューティングと比較しこのアプローチを深く理解しましょう。

具体的には、サーバーレスコンピューティングの概念、そのユースケースと範囲、長所と短所、Brefを使用したサーバーレスPHPのシンプルな実装、3つの大手(Amazon、Microsoft、Google)でのサーバーレスPHPのステータスを見ていきます。

準備はいいですか?それでは参りましょう!

従来、インターネット上でアプリケーションをセットアップするには、サーバーのハードウェアが必要でした。 サーバーマシンは、ユーザーがアプリケーションにアクセスできるようにインターネットに物理的に接続されます。そしてサーバーのメンテナンスは高価なものでした。

次に、ホスティングサービスの進化に伴い、ウェブサイト管理者はホスティングスペースを購入できるようになりました。各サーバーが複数のアプリケーションを保持します。これによりコストが削減されました。

クラウドコンピューティングの台頭により、規模の経済が作用しさらにコストが削減されました。というのも大規模なリモートサーバーファームからわずかなスペースをレンタルできるからです。実際、サーバーレスコンピューティングでは、使用したサービスに対してのみ料金を支払うことができます。使用していないときは、実際にはクラウド上のスペースやリソースを使用していないことになります。

サーバーレスコンピューティングにより、ソフトウェア開発プロセスが簡素化されます。これにより、各社は展開、サーバーの維持、スケーリングを心配することなく、開発に専念できるようになります。

サーバーレスPHPの基本

Googleでの「serverless」という用語の検索数推移
Googleでの「serverless」という用語の検索数推移(英語での検索)

サーバーレスPHPアプリケーションをデプロイするには、まずサーバーレスコンピューティングの概念に親しむ必要があります。サーバーレスという用語は、ReadWriteの2012年のソフトウェア開発の未来に関するこちらの記事で初めて登場しました。そして、2014年のAWS Lambdaのローンチをきっかけに人気を博しました。

このセクションでは、サーバーレスコンピューティングに関する重要な概念に焦点を当て、このテクノロジーを取り巻く一般的な質問に答えることから始めたいと思います。これは、本当に「サーバーレス」なのでしょうか?

サーバーレスPHPの特徴

サーバーを管理する必要がなければ、展開は簡単な作業です。サーバーにコードをアップロードするだけで、残りはベンダーにより処理されます。サーバーレステクノロジーを使用すると、言語に依存しない機能を使用し相互にやり取りができます。

たとえば、メッセージングアプリケーションがあるとします。そのログインモジュールはある言語でコーディングされており、ステータスを更新する機能は別の言語でコーディングされるという具合です。

これはサーバーレスホスティングなしでも可能ではありますが、相互にやり取りすることは間違いなく困難です。アクションが関数をトリガーするたびに、インスタンスが生成されてこれを処理します。

インスタンスを生成するこのプロセスは、既存のインスタンスを使用する「ウォーム」、または新しいインスタンスを開始する「コールド」になり得ます。サーバーがリクエストを処理するために常にスタンバイモードにある従来のホスティングと比較して、このプロセスにはわずかな遅延があり、特にコールドスタートに言えることです。

ただし、多数のリクエストを処理するとなると、サーバーレスホスティングと従来のホスティングでは状況はまったく逆になります。サーバーレステクノロジーには、本質的にスケーラビリティが付属します。突然1000件の同時リクエストが必要になったとしても、ベンダーがそれを処理します。あなたが余分な労力や構成に時間をかける必要はありません。

サーバーレスPHPは本当に「サーバーレス」なのか?

「サーバーレス」という用語に惑わされないようにしてください。決して「サーバーが存在しない」という意味ではありません。サーバーレスアプリケーションを使用する時、入力を処理し必要な出力を計算するサーバーがバックグラウンドに存在します。

「-less(レス)」は、開発者の観点から使用されています。開発者について言えば、サーバーのさまざまな要素にさらされることがありません。したがって、サーバーレスPHPアプリケーションをデプロイすると、クラウド上で実行される実際のサーバーがリクエストに対応します。

BaaSとサーバーレスの構造の違い

「サーバーレスコンピューティング」が厳密に定義されていないことから、これがBaaS(サービスとしてのバックエンド)アプリケーションを指す場合もあります。BaaSはまたクラウドコンピューティングモデルも意味し得ます。これは、サーバーオペレーションがサードパーティに委託され、開発者はソフトウェアの作成と維持に集中する状態です。

BaaSとサーバーレスの主な類似点として、どちらでも、開発者はサーバー管理に集中しません。多くの企業が、BaaS、FaaSパッケージの両方を同じ括りの中で提供しています。

BaaSとサーバーレスコンピューティングの主な違いは次のとおりです。

  • コンポーネント:BaaSでもサーバーレスでも、アプリケーションを開発するのに、そのバックエンドを管理する必要はありません。サーバーレスでは、アプリケーションは個別の関数に分割され、各関数がイベントに応答するかたちで特定のタスクを実行します。
  • スケーラビリティ:スケーラビリティは、サーバーレスアプリケーションの重要な構成要素です。トラフィックが増加すると、より多くのリソースが割り当てられます。BaaSアプリケーションにとっては(一部のサービスプロバイダーはアドオンとして提供していますが)不可欠なモジュールではありません。
  • トリガー:サーバーレスアプリケーションはイベントドリブンです。つまり、特定のアクティビティが発生するたびにアプリケーションがトリガーされます。一方、BaaSアプリケーションでは、従来のアプリケーションと同様に、リソースを継続的に利用してバックグラウンドで実行することがあります。
  • モジュラーアーキテクチャ:サーバーレスアーキテクチャでは、アプリケーションの様々な関数を異なるサーバーに存在させ、実行しつつ、それらをシームレスに統合できます。BaaSアプリケーションは、この構造に従う場合とそうでない場合があります。

サーバーレスPHPの活用例

サーバーレスコンピューティングのさまざまな側面と、それがBaaSとどのように異なるかについてご説明しました。サーバーレスコンピューティングの基本を踏まえ、このアーキテクチャが活用できる状況を見てみましょう。

サーバーレステクノロジで複雑なアプリケーションをホストするのは賢いやり方ではない—そう気付いたかもしれません。ただし、サーバーレスPHPを介して完全なアプリケーションをデプロイしないことにした場合でも、モジュールをデプロイすることは可能です。

このセクションでは、サーバーレススタック実装の2つの例、データベースとファイルストレージをご説明します。

サーバーレスデータベースは、必要なときにいつでもクエリを実行できるオンデマンドのデータベースです。サーバーレススタックのため、スケーリングは簡単です。また、ベンダーは、リソース使用期間に基づいて請求をします。

現在市場に出回るサーバーレスデータベースの例としては、Amazon AuroraGoogle Cloud Datastoreがあります。サーバーレスファイルストレージシステムは、オブジェクトストアとして実装されます。ファイルは、ファイルシステム内の階層としてではなく、ファイル自体のデータとそのメタデータを含むオブジェクトとして扱われます。ストレージと取得は、RESTに似たAPIを介して行われます。

IBM Cloudは、オブジェクトストレージサービスを提供しています。その他のサーバーレスアプリケーションの一般的な使用例は、APIとモバイルバックエンドです。これらの設計は、細かく、論理的で、相互に依存した関数を基本としています。

サーバーレスPHPの長所

このセクションでは、サーバーレスコンピューティングの主な強みと、これが近年注目を集めている理由をご説明します。

サーバーコストの削減

理論上は、サーバーレスコンピューティングは、従来のホスティングと比較して低コストにつながります。その理由はシンプルです。特定の時間だけサービスを使用することになり、アイドル時間には維持費が発生しません。ただし、 一定の時間である程度のトラフィックがある場合には、サーバーレスアーキテクチャを採用しても、コストに大きな違いは生じません。

より簡単なデプロイ

サーバーレスサービスのデプロイでは、サーバーをセットアップして構成する必要はありません。サーバーレスアプリケーションのデプロイも、単純な関数を介して行われます。アプリケーションのバージョンを作成し、クラウドで利用できるようにするのはさらに簡単です。したがって、デプロイプロセス全体がより簡単で効率的になります。

スケーラビリティ

従来のセットアップでは、トラフィック増加に対応したスケールアップには多くの手間がかかります。一方、サーバーレスでは、トラフィックが増加した際には、サービスプロバイダーがリソースの割り当てを処理します。そのため、サーバーレスアーキテクチャにデプロイする方がスケールアップが容易になります。

サーバーレスPHPの弱み

サーバーレスコンピューティングにはかなりの強みがありますが、実際に利用し始める前に潜在的な欠点についても理解しておく必要があります。

パフォーマンス

ユーザーが直面するサーバーレスコンピューティングでの主な問題は、パフォーマンスの低下です。イベントドリブンですが、マイクロインスタンスを作成してリクエストを処理するのに数百ミリ秒かかります。

この遅延は、速度が重要視されるアプリケーションにとっては重大になることがあります。アプリケーションの複雑さが増すにつれて、さまざまな場所にあるコンポーネントがこの遅れを助長します。このようにして積み重なったタイムラグは、ユーザーエクスペリエンスに悪影響を与える可能性があります。

(関連記事:GatsbyとWordPressを使用したウェブサイト構築の基本

特定のベンダーへの依存

サーバーレスアーキテクチャでは、コードのみに集中できますが、これはベンダーがインフラストラクチャを完全に制御することを意味します。したがって、移行は難しいタスクになる可能性があり、サーバーレスを選ぶと、ベンダーの変更はできなくなります。

デバッグ

ベンダーは、サーバーレスアプリケーションのエンドツーエンドのデプロイを処理します。つまり、開発者は、デバッグに使える適したログを提供してもらうためにベンダーに依存することになります。サーバーレスアプリケーションをデバッグして根本原因を特定するプロセスも困難です。

サーバーレスPHP〜BrefでLambdaを使ってみる〜

サーバーレスアーキテクチャについてご説明しましたので、ここからはサーバーレスサービスを介してPHPアプリケーションをデプロイするのに必要なものを見てみましょう。

すでにご存じかもしれませんが、サーバーレスアプリケーションのデプロイは各ベンダーに依拠します。そのため、今回の記事では、Amazon AWSでのサーバーレスPHPアプリの実装を扱います。Bref(フランス語で「簡潔, 手短」を意味する)は、Lambdaを介してAWSにPHPアプリケーションをデプロイできるComposerパッケージです。

Brefは常に進化を続けているので、Brefの成熟度マトリックスをチェックして、アプリケーションをサーバーレスアーキテクチャに移植することが最善なのか判断することをお勧めします。

Brefを使用したサーバーレスPHPの前提条件

まず、Amazon AWSでアカウントを作成します。これはアプリケーションをデプロイするために必要になります。次に、デプロイを管理するためにサーバーレスフレームワークをインストールする必要があります。

npm install -g serverless

次に、AWSで公開/秘密鍵のペアを生成し、サーバーレスフレームワークをローカルで設定します。

serverless config credentials --provider aws --key  --secret 

次に、ComposerからBrefをインストールします。

composer require bref/bref

デプロイする前に、Composerの依存関係をインストールする必要があります。

composer install --prefer-dist --optimize-autoloader --no-dev

Brefを使用してサーバーレスPHPでHello Worldアプリケーションを作成する

Brefを使用して簡単なHello Worldアプリケーションを作成するには、イベントによりトリガーされ、文字列「Hello World」を返す関数を作成します。

まず、Brefのautoload.phpスクリプトを含め、そのラムダ関数を使用します。コンテキストからデータにアクセスするには、コンテキスト変数を宣言できます。

require __DIR__.'/vendor/autoload.php';
lambda(function ($event) {
 return 'Hello world');
});

関数の準備ができたので、serverless.yml設定ファイルを作成しましょう。Brefのガイドにある基本的な設定ファイルは次のとおりです。

service: app
provider:
 name: aws
 runtime: provided
plugins:
 - ./vendor/bref/bref
functions:
 hello:
 handler: index.php
 layers:
 - ${bref:layer.php-73}

次のコマンドを実行すると、Brefはこの構成ファイルを自動的に作成してくれます。

vendor/bin/bref init

関数と設定の準備ができたので、サーバーレスパッケージのinvokeコマンドを使用し関数を呼び出して、意図したとおりに実行されるかどうか確認しましょう。

serverless invoke -f hello

AWS SAMコマンドラインツールを使用したサーバーレスアプリケーションのローカルデプロイメントに関するガイドもあわせてご覧ください。プロジェクトの準備ができたら、サーバーレスのdeployコマンドを使用して、プロジェクトをデプロイできます。 --verboseを使用すれば、デプロイプロセスの詳細が取得できます。

serverless deploy

サーバーレスPHPのその他のデプロイ手段

Bref+AWS Lambdaが一般的な選択肢です。しかし、サーバーレスPHPアプリケーションには他にもいくつかの選択肢があります。

2019年7月にLaravelがローンチしたVaporは、AWS Lambda上のLaravel向けサーバーレスデプロイプラットフォームです。Vaporは、Laravelアプリケーションを単一のラムダ関数に変換します。AzureのサーバーレスはPHPを公式にサポートしていませんが、このデプロイの例を使用して試してみることができます。

まとめ

サーバーレスPHPについての今回の記事の大事なポイントを以下にまとめておきます。

  • アプリケーションでのサーバーレスPHP使用を検討する前に、まずはサーバーレスコンピューティングとは何か、そして、その利点と欠点を十分に理解するようにしてください。
  • アプリケーションをサーバーレスPHPフレームワークに移植する際に考慮すべき3つの主要な要素があります。アプリケーションの複雑さ、そのコンポーネントが速度を重要視するかどうか、そして、将来のスケーラビリティです。
  • サーバーレスPHPは、まだ市場では比較的新しいものだと言えるでしょう。完全に移行する前に、ベンダーのいずれかでBrefを使用してパイロットを実行してみてください。

サーバーレスは非常に人気が高まっていますが、これを活用するには、テクノロジーがどのように機能しているのかを深く理解する必要があります。

その他のケースでは、KinstaなどのマネージドWordPressホストを使用することで、ワークフローを大幅に簡素化できるはずです。

Shaumik Daityari

昼はデータアナリスト、夜は漫画オタク。5年以上にわたり解説記事の執筆とスクリーンキャストの作成を行なっている。仕事以外の時間は、綿密に記述したスクリプトを使って、何気ない日常のタスクを自動化することに明け暮れている。