【Azure】コンテナを使うためのAzureサービス比較

# はじめに

Azure のコンテナサービスの特徴を比較することで、コンテナ技術を用いたアプリを構築する際の判断材料としました。
今回は、以下のサービスを比較します。

- Azure Container Apps
- Azure App Service
- Azure Container Instances
- Azure Kubernetes Service
- Azure Functions
- Azure Red Hat OpenShift
- Azure Spring Cloud

公式サイトのドキュメントを中心に、自分なりに要約してまとめます。  
[Container Apps と他の Azure コンテナー オプションの比較](https://docs.microsoft.com/ja-jp/azure/container-apps/compare-options)

# 各サービスの概要

## Azure Container Apps

Kubernetes の機能や Dapr・KEDA・envoy などのオープンソースのテクノロジーを活かして、Kubernetes スタイルのアプリやマイクロサービスを作るのに向いたサービスです。  
サービス自体は Kubernetes 基盤で構築されていますが、Kubernetes API への直接アクセスは提供されません。  
Kubernetes の機能を活かしたいが 1 から構築する必要性・知見がない中で、ある程度ベストプラクティスに沿いたい場合に向いています。
汎用的なので、迷ったらこれでいいかなと思います。

- 汎用コンテナ
- 多くののマイクロサービスと関わるアプリケーション
- イベント駆動型アプリケーションアーキテクチャ
- 実行時間の長いプロセス

## Azure App Service

Web アプリケーションのためのサービスです。  
フルマネージドで Web サイトや Web API を構築したいときに向いています。  
Windows/Linux ベースで .NET、.NET Core、Java、Ruby、Node.js、PHP、Python から環境を選択します。  
[バックグラウンドタスク](https://docs.microsoft.com/ja-jp/azure/app-service/webjobs-create)も同じインスタンス内で追加料金なしで実行可能です。

- Web サイト
- Web API

## Azure Container Instances

Azure Container Apps の条件に当てはまらなかったりそれほど多くの機能を必要としないような、単体で動くシンプルなアプリケーションやバッチ処理に適したサービスです。  
公式ドキュメントの[Azure Container Instances](https://docs.microsoft.com/ja-jp/azure/container-apps/compare-options#azure-container-instances)によると、「オンデマンドで Hyper-V 分離コンテナーの単一ポッドが提供されます。」と説明されています。また、スケーリング・負荷分散(ロードバランシング)・証明書などの機能も提供されません。  
Azure Container Instances はあくまで単一ポッドなので、複数コンテナの連携・オートスケーリングなどが必要な場合は Azure Kubernetes Service を使用して、間接的に Azure Container Instances を利用する方法が最適です。Kubernetes API への直接アクセスが必要ない場合は Azure Container Apps の利用が良いでしょう。

- 他のコンテナと連携が必要ない
- スケーリング・負荷分散(ロードバランシング)・証明書の機能が必要ない
- 単一で動くシンプルなアプリケーション
- バッチ処理

## Azure Kubernetes Service

Azure で Kubernetes をフル活用したい場合に最適なサービスです。  
一番の特徴は Kubernetes API への直接アクセスがサポートされていることです。Kubernetes をフルマネージドで使用できます。  
その代わり、クラスターの構成と運用はユーザーの制御と責任の範囲内となるため、クラウドサービスの利点が一部損なわれることには注意しましょう。

- フルマネージドで Kubernetes を使用したい
- Kubernetes API への直接アクセスが必要

## Azure Functions

サーバレスでサービスとしての関数(FaaS)です。イベント駆動型のアプリケーションを構築する場合に最適なサービスです。  
スケーリングがしやすかったり、イベント駆動型アプリケーションを構築出来たりなど Azure Container Apps と似ていますが、一時的な関数実行を行う用途に最適化されています。  
Azure Functions で作成したコードは基本的にコンテナイメージとしても使用できるので、後から環境を変えたい場合にも再利用しやすいというメリットもあります。  
プランが 2 種類あり、デフォルトは従量課金プランでは、コールドスタート・最大実行時間が 10 分など制限があります。それに対して Premium プランは、設定で最大実行時間を無制限(60 分保証)に出来たり、常にウォーム状態に維持できるなど制限の緩和ができます。
どちらのプランも一時的な関数としての用途を基本としていますので、実行時間が比較的短い(最大 60 分未満)コンテナでイベント駆動型のアプリケーションを構築したい場合に良い選択肢です。

- サーバレスでコンテナアプリケーションを構築・運用
- 一時的に使用する関数
- 1 度の実行時間が短い(60 分未満)

## Azure Red Hat OpenShift

Azure 上で OpenShift を使用したい場合に最適なサービスです。  
ソースコード管理・ビルド・デプロイ・スケーリング・正常性の管理は、OpenShift の機能で自動的に行うことが出来ます。
レジストリ・ネットワーク・ストレージ・CI/CD は組み込みの機能を使うこともできますし、独自のものを使用することもできます。  
元から OpenShift を使用して運用していたり、Kubernetes を本格的に運用する前提で、CI/CD ツールや長期のサポートなど、必要な他のツールや保守サービスも一通りほしい場合に便利です。

- システムを OpenShift で運用している
- Kubernetes を中心とした本格的な開発・運用
- CI/CD など他ツール一式を同時に導入したい
- Kubernetes を含めたツールの長期サポートがほしい

# 番外編

## Azure Spring Cloud

既存の Spring Boot のアプリケーションのコードを変更せずに Azure にデプロイしたい場合に最適なサービスです。  
Spring bbot の実行環境を一から構築する必要がないのがメリットです。また、監視やブルー/グリーンデプロイなどもあります。  
Spring Boot を使用する際は、コードを変更したりコンテナ用の構成管理ファイルを作成するわけではないので、コンテナを使用するような感覚はありませんが、内部的には専用の Kubernetes クラスターで管理されるようです。  
参考 | [Azure Spring Cloud では、アプリケーションがどのようにホストされますか?](https://docs.microsoft.com/ja-jp/azure/spring-cloud/faq?pivots=programming-language-java#how-does-azure-spring-cloud-host-my-applications)

- コードを変更せずに Spring boot アプリケーションをデプロイしたい
- コンテナ技術のノウハウなしにコンテナのメリットを享受したい

# おわりに

Azure の公式ドキュメントをもとに、各サービスについて調べてみました。  
ドキュメントも十分に分かりやすいので同じような内容の部分も多かったですが、概要の理解の助けになっていれば嬉しいです。  
~~調べてみた感じ Azure Container Apps が良サービスっぽいので、正式リリースが楽しみですね。~~
追記 2022/5/30  | Azure Container Appsは2022年5月24日に正式リリースされました！
[Azure Container Apps General Availability](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/azure-container-apps-general-availability/ba-p/3416885)