アプリケーションプラットフォーム選択におけるベストプラクティス

Yasushi Takata
google-cloud-jp
Published in
7 min readDec 6, 2020

この記事は Google Cloud Japan Customer Engineer Advent Calendar 2020 の 6日目の記事です。

はじめに

Google Cloud でアプリケーションを実行する基盤として、Google Compute Engine ( GCE ), Google Kubernetes Engine ( GKE ), Google App Engine ( GAE ), Cloud Run, Cloud Functions などの選択肢が挙げられます。これらのプラットフォームを適切に選択するためのベストプラクティスを本記事では書いていきたいと思います。GAE について、第2世代を対象としています。

各プラットフォームの特徴

まずは、Google Cloud でアプリケーションを実行するためのプラットフォームについて簡単に説明をしたいと思います。

GCE

GCE はいわゆる仮想マシンです。しかし、この GCE にも様々な機能がついているため、非常に運用を効率的に行うことができます。例えば、ライブマイグレーションの機能があったり、カスタムマシンタイプ(自由に CPU の core 数とメモリのサイズを変更できる)などの機能があります。また、デフォルトで継続利用割引という割引が適用されるため、月の実行時間が一定の割合を超えると自動的に割引が有効になる仕組みがあります。

GKE

GKE は Kubernetes のマネージドサービスです。コンテナを活用してワークロードを実行するには最適です。Kubernetes を活用してアプリケーションを構築したい場合には最適な選択肢となります。

GAE

フルマネージドでサーバレスなプラットフォームになります。サーバレスであっても非常に高いスケーラビリティを持っていますので、リクエストの頻度の少ないアプリケーションから、大規模なアプリケーションまで幅広く活用することができます。他のサービスと比較しても圧倒的に運用にかかる手間を抑えることができます。インフラの設定がほとんど不要なので、コードを書いてすぐにアプリケーションを公開することが可能です。GAE には Standard と Flex の2つの種類がありますが、本記事では主に GAE Standard をベースに記述しています。Standard と Flex の違いはこちらを参照ください。

Cloud Run (フルマネージド版)

GAE と同様にフルマネージドでサーバレスなプラットフォームになります。サーバレスでコンテナを実行するには最適なプラットフォームとなります。コンテナを実行するため、好きなランタイムを利用してアプリケーションを構築することが可能です。今年のリリースの中では最小インスタンス の設定ができるようになったり、Serverless NEG を活用して Google Cloud Load Balancing(GCLB)と組み合わせて使えるようになりました。これらのリリースによって幅広く、さまざまなワークロードに対して活用できるようになってきました。

Cloud Functions

GAE、Cloud Run と同様にフルマネージドでサーバレスなプラットフォームになります。様々なイベントトリガを元にアプリケーションの実行を行うことができるため、簡単な ETL 処理や、インフラストラクチャ管理の自動化などに活用することができます。Cloud Run との大きな違いは、トリガとして利用できるイベントの種類が豊富だったり、GAE と同様にアプリケーションのコードを書くだけですぐに実行できるというメリットがあります。

どのプラットフォームを選択するか?

上記で説明したプラットフォームを大きく大別すると、サーバレスプラットフォーム、それ以外のサービスと分けることができます。
上記プラットフォームのうち、サーバレスプラットフォームには GAE 、Cloud Run、Cloud Functions があります。サーバレスプラットフォームを利用することで、Runtime より下位のミドルウェアや OS などの管理をクラウドサービスベンダーが行うため、運用コストを抑えることができます。例えば GAE では、アプリケーションを書きさえすれば、A/B テストや、サービスのロールアウト(カナリアデプロイとかブルーグリーンデプロイとか)、Firewall などの機能が標準でついているため、非常に早く運用を開始することができます。
一方、サーバーレスではないサービス( GKE , GCE )では、インスタンス のタイプの自由度が高かったり、実行されるランタイムに制約がなかったり、必要なミドルウェアをインストールすることが可能です。一般的にはこれらの考えに基づいて、基本的なプラットフォームの選択が行われるかと思います。ここから、もう少し細かい要件においてどのプラットフォームが選択されるのかについて紹介します。

  1. プラットフォームのプログラミング言語による制約を確認する。
    GAE standard では、利用されるプログラミング言語だけでなくバージョンについても指定されます。一方、Cloud Runではコンテナを実行することができるため、自分の好きな言語で開発を行うことが可能です。
    GAE Standard で自分が使いたい言語とバージョンがサポートされていない場合には、Cloud Runなどのサービスを選択する必要があります。
  2. アプリケーションへのリクエストのプロトコルを考える。
    HTTP(S)のリクエストについては、GAE, Cloud Run, Cloud Functions で受け取ることが可能です。Cloud Run では、gRPC でのリクエストを利用することができます。(2020.12.6 時点でサポートされているのは、server-streaming RPCsunary (non-streaming) RPCs になります。)また、WebSocket 通信については、GAE Standard、Cloud Runではサポートされていないため、注意が必要です。TCP/UDP での接続、gRPC のbi-directional streaming や WebSocket の常時接続をしたいアプリケーションでは、GKE もしくは GCE を選択されるケースが多いです。GAE Flex は WebSocket を利用することが可能です。
  3. サービスのロケーションを考える。
    GAE では複数のサービスを構成することはできますが、プロジェクトに1つのリージョンしか選択することができません。サービスによってリージョンを分けたい場合には、Cloud Run や、GKE、GCE を選択する必要があります。Google Cloud Load Balancing(GCLB)と組み合わせることによって、リクエストに応じて、最適なリージョンで処理を行うことが可能です。Cloud Run と GCLB を使う場合には、Serverless NEG の設定が必要です。詳細はこちらの記事を参照。
  4. インスタンス に対する要件を確認する。
    アプリケーションによっては GPU を使いたいとか、メモリを指定したいといった要件があるかと思います。そういった場合には、GKE もしくは GCE を利用した方がより柔軟にインフラストラクチャを選択することが可能です。GAEやCloud Run、Cloud Functionsでは利用可能なインスタンスのタイプが予め設定されていますので、特定のインフラストラクチャの要件がある場合には確認する必要があります。(GAEのインスタンス のクラス)

まとめ

これまでプラットフォーム選択のポイントについて書いてきました。一般的にシステム開発では、ビジネスのフェーズによって要件が変わってくるものと思います。そのため、開発のタイミングにおけるビジネスの状況やアプリケーションの要件によって最適なプラットフォームを選択することが良いのかなと思っています。ぜひみなさんのプロジェクトにおいて最適な方法を探してみてください!

明日は、Hawk-san による 「Google Cloud のブロックストレージの使い方」です!ブロックストレージに果たしてどのような使い方があるのか、非常に楽しみです:)

それでは Enjoy hacking and the holidays !

--

--

Yasushi Takata
google-cloud-jp

Google Cloud, Manager, Customer engineering for Gaming. Disclaimer. Opinions are my own, NOT the views of my employer. All posts here are my personal opinion.