【GCPSketchnote】コンピュートオプションの選び方　〜GCE、GKE、Cloud Run、GCF、GAE〜

:::note warn
この記事は、以下のソースをもとに和訳（意訳）し、より読みやすくなるように段落構成を一部変更したものになっています。同様に使用している画像も全て以下のソースからの引用です。
:::

https://github.com/priyankavergadia/GCPSketchnote

https://cloud.google.com/blog/topics/developers-practitioners/where-should-i-run-my-stuff-choosing-google-cloud-compute-option?utm_source=ext&utm_medium=partner&utm_campaign=CDR_pve_gcp_gcpsketchnote_&utm_content=-

:::note info
タイポや誤訳、不自然な日本語訳、誤解を招く表現、表記揺れ、リンク切れ、最新でない箇所などがありましたら、指摘していただけると幸いです。その際、該当箇所を修正した上で編集リクエストを送っていただけると助かります。
:::

# はじめに
ワークロードはどこで実行すべきでしょうか？それは場合によります...。アプリケーションを実行するための適切なコンピュートオプションを選択することは、アプリケーションの成功のためにも、それを管理し開発しているチームにとっても重要です。この記事では、コンピュートオプションを選ぶ際に考慮すべき最も重要な要素をいくつか紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/5877f046-f3b7-5ce8-111d-00e020e8f382.png)

# サービスの種類で選ぶ
## [Compute Engine](https://cloud.google.com/compute/) ( GCE )
![compute_engine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/5bcfe1e9-95ee-2e88-9a4b-223a521bf897.png)
仮想マシンです。 CPU やメモリ、ディスク、 GPU の構成、実行する OS 、追加ソフトウェアを選択します。

## [Kubernetes Engine](https://cloud.google.com/kubernetes-engine) ( GKE )
![google_kubernetes_engine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/a6fd2d4b-f23c-feee-3711-41d9aad76ca5.png)
マネージド Kubernetes クラスタです。Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースのシステムです。クラスターを作成し、実行するコンテナを設定します。Kubernetes はコンテナの実行を維持し続け、スケーリング、更新、接続を管理します。

## [Cloud Run](https://cloud.google.com/run)
![cloud_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/11cfe26d-3ce1-f0f2-4572-1f17b0ef18ec.png)
個々のコンテナを実行する、フルマネージドサーバーレスプラットフォームです。 Cloud Run にコードやコンテナを渡すと、 Web やその他のイベントに対応するために、必要に応じてホスティングや自動スケーリングが行われます。

## [App Engine](https://cloud.google.com/appengine) ( GAE )
![app_engine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/46b00e7e-3dc4-14ab-473e-aa0e23a3e094.png)
完全な Web アプリケーション用のフルマネージドサーバーレスプラットフォームです。ネットワークやアプリケーション、データベースのスケーリングは App Engine が行います。サポートされている言語の一つで Web アプリケーションを書き、 App Engine にデプロイすると、スケーリング、バージョン更新などが行われます。

## [Cloud Functions](https://cloud.google.com/functions) ( GCF )
![cloud_functions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639185/50f55b78-6138-1169-296c-2c776f1a9c0e.png)
イベント駆動型のサーバーレス関数です。個々の関数を書くと、イベントが発生したとき（ HTTP 、 Pub/Sub 、 Cloud Storage の変更など）に Cloud Functions がその関数を呼び出します。

# サービスの特徴で選ぶ
## 自由にインフラを制御したいとき
もし、基盤となるインフラ（ OS 、ディスクイメージ、 CPU 、 RAM 、ディスクなど）をよりコントロールする必要があるなら、 [Compute Engine](https://cloud.google.com/compute/) を使うのが理にかなっています。レガシーアプリケーションの移行や、特定のOSを必要とする既存システムでよくあるケースです。

## コンテナを使いたいとき
コンテナは、 OS を仮想化し、1つの OS インスタンスで複数のワークロードを実行できるようにするための手段です。コンテナは、高速かつ軽量で、ポータブルです。アプリケーションがコンテナ化されている場合、主に以下の2つのオプションがあります。

### GKE
[Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine) （ GKE ）は、 OS 、 CPU 、 GPU 、ディスク、メモリ、ネットワークなど、コンテナをノード単位で完全に制御することが可能です。 GKE は Autopilot も提供しており、柔軟性と制御が必要だが、運用とエンジニアリングのリソースが限られている場合に利用することができます。

### Cloud Run
一方、インフラのスケーリングを気にせずにコンテナでアプリケーションを実行したい場合は、 [Cloud Run](https://cloud.google.com/run) が最適な選択肢です。アプリケーションのコードを書き、コンテナにパッケージし、デプロイするだけでよいのです。

## コンテナを使わず、単にWebアプリケーションを使いたいとき
HTTP ベースのアプリケーションのコードを書き、アプリケーションのスケーラビリティとデプロイを Google Cloud に任せたい場合は、Web アプリケーションのホスティングと実行用に設計された、サーバーレスでフルマネージドのオプションである [App Engine](https://cloud.google.com/appengine) が良い選択肢になります。

## イベント/トリガーで関数を実行したいとき
コードが関数で、イベント/トリガーに基づいてアクションを実行するだけなら、 [Cloud Functions](https://cloud.google.com/functions) を使ってデプロイするのが理にかなっています。

# ユースケースで選ぶ
## レガシーアプリケーションの移行をしたいとき
特定のライセンス、 OS 、カーネル、またはネットワーク要件を持つレガシーアプリケーションを移行する場合は、 [Compute Engine](https://cloud.google.com/compute) を使用します。

例：
- Windowsベースのアプリケーション
- ゲノミクス処理
- SAP HANA

## 特定の OS や HTTP/s 以上のネットワークプロトコルを必要とする場合
アプリケーションが特定の OS や HTTP/s 以上のネットワークプロトコルを必要とする場合は、 [GKE](https://cloud.google.com/kubernetes-engine) を使用します。 GKE を使用する場合、 Kubernetes を使用しているため、ハイブリッド/マルチクラウド環境へのデプロイやスケールが容易になります。 

:::note info
マルチクラウドとは、複数のパブリッククラウドサービスを利用することですが、ハイブリッドクラウドでは、1つまたは複数のパブリッククラウドサービスを、オンプレミスのプライベートクラウドと組み合わせて使用します。[^5]
:::

:::note info
[Anthos](https://cloud.google.com/anthos/) は、ハイブリッド/マルチクラウドのデプロイメントに特化して設計されたプラットフォームです。インフラからアプリケーションのパフォーマンスやトポロジーまで、すべてのクラスタに一元的な可視性を提供します。
:::

例：
- マイクロサービスベースのアプリケーション

## HTTP/s と WebSocket をサポートし、任意のプログラミング言語でコンテナ化されたアプリケーションをデプロイしたいとき
HTTP/s と WebSocket をサポートし、任意のプログラミング言語でコンテナ化されたアプリケーションをデプロイするだけなら、 [Cloud Run](https://cloud.google.com/run) を使用します。

例：
- Web サイト
- Web アプリケーション
- API
- データ処理アプリ
- Webhook

## コンテナを使わず、サーバーレスに Web アプリをデプロイしたいとき
サーバーレスプラットフォームで Web ベースのアプリケーション（ HTTP/s ）をデプロイしてホストしたい場合は、 [App Engine](https://cloud.google.com/appengine) を使用します。

例：
- Web アプリケーション
- モバイルアプリのバックエンド

## コードが関数で、イベント/トリガーに基づくアクションを実行するだけの場合
コードが関数で、 [Pub/Sub](https://cloud.google.com/pubsub/docs/overview) や [Cloud Storage](https://cloud.google.com/storage) からのイベント/トリガーに基づくアクションを実行するだけの場合は、 [Cloud Functions](https://cloud.google.com/functions) を使用します。

例：
- Cloud Storage のバケットに動画が保存されたら、すぐに動画のトランスコード機能を起動させる。

# オープンソースによるポータビリティで選ぶ
もし、あなたの要件がポータビリティとオープンソースのサポートなら、　GKE　、　Cloud Run　、　Cloud Functions　を検討してください。これらはすべてオープンソースのフレームワークに基づいており、ベンダーロックインを回避し、ハイブリッド/マルチクラウド環境にインフラをスケールする自由をもたらしてくれます。 

GKE クラスタは、 Kubernetes というオープンソースのクラスタ管理システムを利用しており[^2]、クラスタと対話するためのメカニズムを提供します。

Cloud Run for Anthos は、 Kubernetes 上のサーバーレスワークロードをサポートするオープンソースプロジェクトである Knative によって提供されています[^3]。

Cloud Functions は、オープンソースの FaaS （ function as a service ）フレームワークを使用し[^4]、複数の環境にわたって関数を実行します。

# チームの規模で選ぶ
開発者のチームが小規模で、彼らの注意をコードに集中させたい場合は、インフラ、スケール、および運用を管理するチームを持つ必要がないため、 Cloud Run や App Engine などのサーバーレスオプションが良い選択となります。

大規模なチームと独自のツールやプロセスがある場合は、 CI/CD 、セキュリティ、スケール、および運用のための独自のプロセスを定義できる Compute Engine または GKE がより理にかなっています。

# 課金モデルで選ぶ
Compute Engine および GKE の課金モデルは、リソースに基づいています。つまり、使用量とは関係なく、プロビジョニングしたインスタンスに対して支払うということです。また、[継続利用割引](https://cloud.google.com/compute/docs/sustained-use-discounts)や[確約利用割引](https://cloud.google.com/compute/docs/instances/signing-up-committed-use-discounts)を利用することも可能です。

:::note info
プロビジョニングとは、必要に応じてネットワークやコンピュータの設備などのリソースを提供できるよう予測し、準備しておくこと[^1]
:::

Cloud Run 、 App Engine 、および Cloud Functions は、リクエストごとに課金されるため、[使用した分だけ支払う](https://cloud.google.com/run/pricing)ことになります。

# おわりに
アプリケーションに適したコンピュートオプションを選ぶには、関連するすべての要素を考慮することが重要です。どのような決定も必ずしも完全なものではなく、ある選択肢から別の選択肢に移ることはいつでも可能であるということを覚えておいてください。

これらの点についてより詳しく知りたい方は、ビデオ「 [Where Should I Run My Stuff?](https://www.youtube.com/watch?v=q_5AgiI7KFQ) 」を、 GKE について知りたい方は、[このトレーニング](https://cloudonair.withgoogle.com/events/cloud-onboard-gke?utm_source=google&utm_medium=blog&utm_campaign=FY21-Q2-northam-NA1132-onlineevent-er-CloudOnBoardGKE&utm_content=dev_blog)をご覧ください。

[^1]: [プロビジョニングとは | クラウド・データセンター用語集/IDCフロンティア](https://www.idcf.jp/words/provisioning.html)
[^2]: [GKE の概要 | Kubernetes Engine ドキュメント | Google Cloud](https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview#:~:text=GKE%20clusters%20are%20powered%20by,you%20interact%20with%20your%20cluster.&text=When%20you%20run%20your%20applications,running%20production%20workloads%20in%20containers.)
[^3]: [Knative-based Cloud Run services are GA | Google Cloud](https://cloud.google.com/blog/products/serverless/knative-based-cloud-run-services-are-ga)
[^4]: [Cloud Functions | Google Cloud](https://cloud.google.com/functions)
[^5]: [「マルチクラウド」はなぜ話題？〜ハイブリットクラウドとの違いと特長〜 | VMware Cloud Frontier](https://frontier.networld.co.jp/3099/)