TECHNICAL BLOG

2021/11/26 # サーバレス # 使ってみた # 入門 # Azure # Docker 2021/11 Azure Container Apps を知る

2021年11月、 Azure の新サービスである Azure Container Apps が発表されました。

【追記:2022年7月1日】2022年5月25日に GA されました!

Azure Container Apps は、マイクロサービス向きのサーバレスなコンテナサービスです。
AKS (Azure Kubernetes Service) から Kubernetes の複雑さを取り去ったような、使いやすいサービスになっています。
AWS のサービスでは ECS Fargate に近いでしょうか。

Welcome to Azure Container Apps!

公開されて日が浅いため、 Azure 慣れした上級者の方が書かれた記事が多いようです。
この記事では、細かな機能や挙動について深堀りすることよりも、概要と特徴をつかむことを重視して Azure Container Apps についてご紹介したいと思います。
記載している内容は以下の4点です。

  1. Azure Container Apps とは
  2. 他のコンテナサービスとの比較
  3. Azure Container Apps を作成してみる
  4. Azure Container Apps を触ってみて

1. Azure Container Apps とは

Azure Container Apps は、フルマネージドなサーバレスコンテナサービスです。
互いに関連する複数のコンテナを実行し、イベントに応じて柔軟にスケーリングすることができます。
ただコンテナを動かすだけでなく、2つの大きな特徴があります。

  • KEDA による動的なスケーリング
  • Dapr によるサービス間連携の実装容易性

KEDA による動的なスケーリング

自在なスケーリング

HTTP のリクエスト数やキューのメッセージ数、 CPU 使用率など、様々なトリガーに基づいてアプリケーションをスケーリングできます。
Kubernetes ベースのイベント駆動オートスケーラである KEDA (ケーダと読むようです)によってサポートされているトリガーが利用可能です。
イベントがない場合は、最小で 0 にスケーリングして割安のアイドル使用料金を適用することができます。
イベント駆動という点は Azure Functions と共通ですが、 Azure Functions の従量課金プランでは 1 回の実行が 10 分までに制限されています。 Azure Container Apps には実行時間の制限はありません。

Dapr によるサービス間連携の実装容易性

Dapr (ダーパーやダッパーと読むようです)は、マイクロサービス構築に役立つ、言語やフレームワークに依存しないイベント駆動型のランタイムです。
セッションなどの状態管理、メトリックやトレースの発行、外部リソースのバインディングなどの機能を提供します。
一緒にデプロイするだけで、 HTTP と gRPC の API を呼び出して利用できます。アプリケーションに組み込む必要はありません。

Azure Container Apps では、 Dapr を有効にすることでコンテナーアプリ(Kubernetes でいう Pod)にセットで Dapr をデプロイでき、サービス間連携を実現しやすくなっています。

Azure Container Apps のユースケース

Azure Container Apps は常時稼働のアプリケーションでも、イベントによって起動するアプリケーションでも実行することができます。
主に次のような用途で使用することができます。
以下は公式ドキュメント「Azure Container Apps の概要 | Microsoft Docs」からの引用です。

  • API エンドポイントのデプロイ
  • バックグラウンド処理アプリケーションのホスティング
  • イベント 駆動型処理の処理
  • マイクロサービスの実行

シナリオの例

料金体系

料金は、メモリおよび vCPU の使用量と、実行回数に基づいて課金され、それぞれ一定範囲の無料枠があります。
コンテナがゼロにスケーリングされている間、 vCPU には割安のアイドル使用料金が適用されます。
なお、現在は「North Europe」「Canada Central」でのみ利用できますが、なぜか価格のページでは「East US 2」リージョンしか選択できません。

Azure Container Apps - 価格 | Microsoft Azure

2021/11/20現在、 vCPU は1時間あたりのアクティブ使用料金が約 9.8、アイドル使用料金が約 1.2、メモリは約 1.2です。
例えば、1 vCPU, メモリ 2 GiB で1か月(24時間×30日)実行し、100万リクエストがあった場合、約 8,229 となります。

参考までに、 Azure Container Instances では約 4,039 、 Azure App Service の Standard S1 (コア数 1, RAM 1.75 GB, ストレージ 50 GB)では約 9,662 となります。

2. 他のコンテナサービスとの比較

Azure には多くのコンテナーサービスがあります。
その中から以下の4つのサービスに焦点を当てて、 Azure Container Apps と比較して概括してみます。

Azure Functions との違い

  • イベント駆動のトリガー・スケーリングという点は似ている
  • Azure Functions はコードからのデプロイも可能
  • Azure Functions はトリガーやバインドにより、他の Azure サービスとの連携が容易
  • Azure Container Apps は常時稼働のアプリケーションにも向いている

Azure Functions は FaaS なので、小さく短い処理向けです。
従量課金プランでは、秒あたりのリソース使用量と実行回数で課金され、いずれにも月々無料枠があります。

価格 - Functions | Microsoft Azure

Azure Container Instances との違い

  • コンテナの実行環境である点は同じ
  • Azure Container Instances はコンテナオーケストレーションや自動スケーリング機能がない
  • Azure Container Instances は料金が安価
  • Azure Container Instances は処理が終了するとコンテナが停止し、課金も停止される

Azure Container Instances コンテナを動かすことのみに特化したサービスで、付随機能はあまりありません。
バッチ処理などに向いていると思います。
また、比較的安価なので社内向けの小さなアプリケーションに使うのも良いと思います。
他のサービスに比べると、選ばれるケースは少ないかもしれません。
秒あたりのメモリと vCPU 使用量で課金されます。

価格 - Container Instances | Microsoft Azure

Azure App Service との違い

  • 動的なスケーリングができる点は同じ
  • Azure App Service はプランの種類が豊富
  • Azure App Service は機能が豊富
  • Azure App Service はコードからのデプロイも可能

Azure App Service はカスタムドメインやデプロイスロットなど、 Web アプリケーションの開発・運用に便利な機能が豊富にあり、幅広いユースケースに向いています。
複数コンテナアプリを作ることもできますが、現在プレビュー中の機能です(「クイック スタート:複数コンテナー アプリを作成する - Azure App Service | Microsoft Docs」)。

ワークロードに応じた複数のプランがあり、利用した時間によって課金されます。

App Service の料金 | Microsoft Azure

Azure Kubernetes Service との違い

  • コンテナオーケストレーションという点は同じ
  • Azure Kubernetes Service は Kubernetes API とクラスター管理への直接アクセスができる

Azure Container Apps も内部的には AKS (Azure Kubernetes Service) が使われているらしいので似ています。
Azure Container Apps で要件を満たせない場合や、より細かく管理したい場合には Azure Kubernetes Service が適しているでしょう。
Azure Kubernetes Service は利用するノード VM によって利用時間で課金されます。

価格 - Container Service | Microsoft Azure

サービスの使い分け

最適なサービスを選択する

各サービスに向いているユースケースの例です。

  • Azure Functions → イベント駆動で実行時間が短いプロセス向き
  • Azure Container Instances → ツール・バッチ的な使い方や小規模な社内システム向き
  • Azure App Service → マイクロサービス以外の Web アプリ全般向き
  • Azure Container Apps → マイクロサービス向き
  • Azure Kubernetes Service → 上記サービスで要件が満たせない場合向き

基本的に、上のサービスほど管理が楽であり、下のサービスほどカスタマイズ性が高いイメージです。
マネージドであることを重視する場合、次のような順で検討してみてはいかがでしょうか。

  1. 処理がシンプルで短時間で終わる場合、 Azure Functions を検討
  2. マイクロサービスなら Azure Container Apps が、それ以外は Azure App Service が有力
  3. バッチなどは Azure App Service でも可能だが、 Azure Container Instances で充分の場合もある
  4. 上記で要件を満たせない場合、 Azure Kubernetes Service を採用

個人的には、これまで Azure Kubernetes Service を選択していたケースの大半と、 Azure App Service を選択していたケースの一部で、 Azure Container Apps を選択するようになるイメージです。

上記では大まかなイメージをご紹介しましたが、詳細な比較は Azure Container Apps の公式ドキュメント「Container Apps と他の Azure コンテナー オプションの比較 | Microsoft Docs」にもあります。

また、 Azure には上記以外にもコンピューティングサービスがあります。
Azure Container Apps はまだ追加されていませんが、「Azure コンピューティング サービスの選択 - Azure Architecture Center | Microsoft Docs」にはサービス選択のためのフローチャートが記載されています。

(参考)AWS サービスとの比較

Microsoft は公式ドキュメントにて、 AWS の各サービスとほぼ同等の Azure サービスがどれかを提示しています。

AWS サービスと Azure サービスの比較 - Azure Architecture Center | Microsoft Docs

Azure の主なコンテナサービスに対応する AWS サービスは以下のようです。

  • Azure Functions → AWS Lambda
  • Azure Container Instances → ECS, Fargate
  • Azure App Service → Elastic Beanstalk, LightSail
  • Azure Kubernetes Service → EKS

Azure Container Apps はまだ追加されていませんが、 Fargate に近いサービスです。

両者で似たサービスがあります

3. Azure Container Apps を作成してみる

ここでは Azure Container Apps を実際に作って動かしてみます。
必要なリソースは以下3つで、いずれも以降の手順のなかで作成できます。

  • Log Analytics ワークスペース: ログデータ用の環境(既存サービス)
  • コンテナー アプリ環境: 1つまたは複数のコンテナからなるひとつのアプリ。 Kubernetes でいう Pod
  • コンテナー アプリ: コンテナ アプリのグループ。 Kubernetes でいうクラスター

以下は、2021/11/20現在の画面です。
なお、 Azure Container Apps は Azure ポータルでは「コンテナー アプリ」という表記です。

「コンテナー アプリの作成」画面から開始します。
「基本」タブの内容を入力し、コンテナー アプリ環境を新しく作るために「新規作成」リンクを押下します。

コンテナー アプリの作成 基本タブ

「コンテナー アプリ環境の作成」画面の「基本」タブで情報を入力します。
2021/11/20現在、地域は「North Europe」「Canada Central」のみが選べます。
入力後、「監視」タブを選択します。「監視」タブの入力が必要であることが少しわかりにくいですね。

コンテナー アプリ環境の作成 基本タブ

「監視」タブでは Log Analytics ワークスペースを選択できますが、今回は新たに作成します。
「新規作成」リンクを押すと、画面右側にペインが表示されるので「名前」を入力します。
「場所」にはコンテナー アプリ環境と同じ場所が選択されており、変更できません。
入力したら「OK」を押します。

コンテナー アプリ環境の作成 監視タブ

「Log Analytics ワークスペース」に値がセットされたことを確認し、「Create」を押します。

コンテナー アプリ環境の作成 監視タブ入力後

「コンテナー アプリの作成」画面の「基本」タブに戻ってきます。
「コンテナー アプリ環境」に値がセットされたことを確認し、「次へ:アプリ設定」を押します。

コンテナー アプリの作成 基本タブ 次へ

「アプリ設定」タブでは、デフォルトで「クイックスタート イメージを使用する」にチェックが入っています。
このサンプルのイメージを使用すると、すぐにコンテナー アプリを作ってみることができるので、チェックを入れたままにします。
今回はタグをつけないため、「確認と作成」を押します。

なお、独自のコンテナイメージを利用する場合はチェックを外します。
チェックを外すと、以降の入力項目が変化します。その場合の画面キャプチャも参考として下に載せます。

[「クイックスタート イメージを使用する」にチェックを入れた場合]
2021/11/20現在、クイックスタート イメージは「Simple hello world container」のみで、リソースの割り当てやイングレス設定は固定となります。

コンテナー アプリの作成 アプリ設定タブ クイックスタート

[(参考)「クイックスタート イメージを使用する」のチェックを外した場合]

コンテナー アプリの作成 アプリ設定タブ 既存のコンテナー

「CPU とメモリ」の選択肢は以下の通りです。

選択可能なCPUとメモリ

「確認と作成」タブに遷移すると、入力内容のチェックが行われます。
画面上部に「合格」と表示されれば、入力内容に問題はありません。
「作成」ボタンを押すと、デプロイが開始します。

コンテナー アプリの作成 確認と作成タブ

ここまででリソースの作成は完了です。
今回、以下のリソースを作成したことになりますが、2分ほどで完了しました。

  • Log Analytics ワークスペース
  • コンテナー アプリ環境
  • コンテナー アプリ

デプロイ完了時の画面です。
そのまま動作確認に進みましょう。「リソースに移動」ボタンを押します。

デプロイ完了

作成したコンテナー アプリの概要に遷移します。
「アプリケーション URL」の URL をクリックして、アプリにアクセスします。

コンテナー アプリ 概要

見事画面が表示されました!

サンプルコンテナアプリの表示確認

4. Azure Container Apps を触ってみて

インフラ構成をほとんど意識することなく、コンテナアプリのデプロイができました。
今回はサンプルのコンテナイメージを利用しましたが、上記で確認したとおり、独自イメージの場合でもさほど設定項目は多くありません。
少ない手間で環境構築ができるのは魅力的ですね。これぞマネージドサービスという感じがします。

今後への期待として VNet 統合機能とカスタムドメインの設定機能が欲しいと思いました。
調べたところ、これらはすでにロードマップに組み込まれているようです。

他にも、マネージド ID のサポートとログ参照の簡略化がロードマップとなっていました。

【追記:2022年7月1日】 現在は VNet 統合、カスタムドメイン、マネージド ID のサポート、ログ参照の簡略化のいずれも実装されています。

おわりに

Azure Container Apps が公開される少し前に、 Azure Functions が Kubernetes 上で動かせることを知り、興味を持ちました。

KEDA を使用した Kubernetes での Azure Functions | Microsoft Docs

両者ともベースの仕組みがよく似ていますよね。
もともと Azure にも AWS Fargate のようなサービスがあればと思っていたこともあり、 Azure Container Apps について記事を書きました。

サービス内容を知って、まず「他のサービスとはどう使い分けるのがいいんだろう?」と思いました。
サービス公開時点では、上でご紹介した公式の比較ドキュメントはありませんでした。
結局、公式ドキュメントに先を越されてしまいましたが、この記事で自分なりに噛み砕いた比較説明をできたかなと思います。

Azure のコンピューティングサービスでは App Service が特に機能が豊富で便利な印象です。
実は App Service でも複数コンテナアプリを利用する機能がありますが、3年以上プレビューのまま現在も GA されていません。

複数コンテナアプリ用のサービスとしては、 Azure は Container Apps に力を入れていくのかもしれません。
まだサンプルを動かした程度ですが、簡単に使えて気に入っています。
Container Apps が App Service に並ぶくらい便利になっていくことを期待しています。