やってみた
2021.04.30
GCPのPHP on Cloud Functionsを触ってみた
Web開発担当の木下です。
さて今回は、先日発表されたGCPの新機能「PHP on Cloud Functions」についてです。
Cloud Functionsとは
Googleの説明によれば、「サーバー管理なしでコードを実行するためのスケーラブルな従量課金制 Functions as a Service(FaaS)」とあります。
サーバーレスコンピューティングの1種で、PythonやGoなどで記述されたコードをアップロードするだけでGoogleがフルマネージドで実行してくれるサービスのことです。
自動でスケールし、実行した時間分(100ミリ秒単位)で課金されるため、サーバーのスペックを気にする必要がなく、かつほとんどの場合自分でサーバーをホスティングするよりコストを抑えられる、というメリットがあります。
AWSでいうとLambdaがこれに近いですが、Lambdaの場合はHTTPで公開しようとするとAPI Gateway等と組み合わせる必要があるのに対し、Cloud Functionsの場合はアップロードするだけでHTTPエンドポイントまで発行されるので、よりシンプルにAPIを作成できます。
これまでCloud FunctionsもLambdaもPHPをサポートしていませんでした(ランタイムをねじ込むという方法はありました)が、4月24日にGoogleがCloud FucntionsでのPHPサポートをプレビューとして開始することを発表しました。
これまではPythonかNode.jsで書いてきましたが、使い慣れたPHPが使えるようになるのであれば、今後はぜひこちらで書いていきたいところです。
さっそく触ってみる
DB(Firestore)と組み合わせて、現在位置をリクエストすると近くにあるお気に入りのラーメン屋さんの位置をJSONでレスポンスするAPIを作ってみましょう。
さっそくFirestoreにコレクションを作成し、お気に入りのラーメン屋さんの情報を入れていきます。
Cloud Functionsで関数を作成し、ソースを書いていきます。
composer.jsonを置いておけばライブラリをインストールでき、php.iniを置いておけば環境設定を変えられるようです。便利ですね。
関数を作成してHTTPエンドポイントが発行されたら、Postmanでたたいてみましょう。
リクエストした位置情報から半径5km以内にあるラーメン屋さんの情報がJSONで返却されました!
非常に便利なのですが、おそらくCloud FunctionsでAPIを作る時の最大の悩みどころが、DBをどうするか?だと思います。
RDBであればリッチな検索クエリを組める一方、サーバーレスという訳にはなかなかいかないため、結局RDBはずっとホスティングしておく必要があるのと、アクセスが集中した際にコネクション数が大変なことになるためコネクションプール等を噛ませておく必要があると考えると、サーバーレスのメリットを活かすには構成をよく考える必要があります。
一方でNoSQLであればサーバーレスのメリットを存分に活かせますが、RDBほど柔軟な検索クエリに対応できないというデメリットが発生します。今回はFirestoreを使いましたが、複数のインデックスに対して不等号条件を付けられないため、ある程度データを絞り込んでFirestoreから取得し、Cloud Functions側でさらに絞り込むという流れになります。件数が増えたりページネーションが欲しくなったりすると、これはこれでしんどくなるため、使いどころを考える必要があります。
結局はRDBとNoSQLを上手に組み合わせる形になるのでは、と思います。
サーバーレスの需要はますます高まっていくはずです
スマホアプリは瞬間風速的にアクティブユーザー数が増えることがよくあるため、使いどころを押さえればサーバーレスの採用はコスト面でもパフォーマンス面でも非常に大きなメリットがあります。
イーディーエーにはユーザー数が数十万・数百万人というアプリの開発実績が豊富にありますので、お気軽にお問い合わせください!