はじめに
今回はサーバーレスなプラットフォームでコンテナ化アプリケーションを実行できるAzure Container Appsについて紹介します。まずは、Azure Container Appsの概要とAzureが提供している他のコンテナ化アプリケーションをサポートするサービスとの違いについて説明します。
Azure Container Appsの概要
Azure Container AppsはAzureのサーバーレスなプラットフォーム上でコンテナ化アプリケーションを簡単にデプロイ、実行、管理できるサービスです。Azure Container Appsは主に以下の4つのパターンでのアプリケーションのデプロイがサポートされています。
・パブリックなAPIエンドポイント
Azure Container AppsはHTTP要求を受けることができるため、WebアプリケーションやREST APIのようなHTTPベースのアプリケーションのデプロイが可能です。
・バックグラウンド処理のためのアプリケーション
Azure Container Appsでは必ずしもエンドポイントを公開する必要はないため、バッチ処理などのバックグラウンド処理に特化したアプリケーションのデプロイも可能です。
・イベント駆動型アプリケーション
Azure Storageのキューにメッセージが送信されたことをトリガーに起動するような、イベント駆動型のアプリケーションも作成することができます。
・マイクロサービスアプリケーション
Azure Container AppsはDaprをサポートしているため、Daprを用いてマイクロサービスアーキテクチャで作成したアプリケーションをデプロイすることが可能です。
またAzure Container Appsでは、上記の用途別に、リクエスト量やCPU・メモリなどのリソース負荷、キューのメッセージ数などに応じて自動的にスケールさせることができたり、他のAzureサービスとの統合によって監視とログの収集やCI/CDなどの機能もサポートしています。
Azureの他のコンテナ化アプリケーション向けサービスとの比較
Azure Container Appsとこれまでに紹介してきた他のコンテナ化アプリケーション向けのサービスとの違いについて説明します。
・Azure Container Instances(ACI)
ACIは最もシンプルにコンテナを実行することのできるサービスですが、主に単一のコンテナーを実行する用途に適しており、複数のコンテナーを組み合わせてアプリケーションを実現するパターンには向いていません。そのため、マイクロサービスのような複数コンテナーを組み合わせるアプリケーションを作成する場合は、Azure Container AppsやAzure Kubernetes Service(AKS)などを利用する方が適しています。
・Azure App Service
Azure App ServiceはWebアプリケーションのデプロイに特化しているため、バックグラウンド処理やイベント駆動アプリケーションをデプロイしたい場合はAzure Container Appsを選択する必要があります。一方でC#やPythonのようにApp Serviceがサポートしている言語を使用していて、コンテナ化が不要な場合などはApp Serviceの利用が向いています。
・Azure Kubernetes Service(AKS)
Azure Container AppsとAKSはそれぞれKubernetesを基盤にしたサービスであり、マイクロサービスなアプリケーションのデプロイができるなど用途としても近いサービス同士です。AKSはKubernetesの機能を柔軟に使用することができますが、Kubernetesに関する知識が必要となります。一方でAzure Container AppsはKubernetesを基盤として使用しているものの、その多くは隠蔽化されておりサービス利用者はKubernetesを意識せずにアプリケーションの開発に集中してサービスを利用することができるようになっています。
そのため、Kubernetesに対する調整が必要だったり大量のリソースを必要としたりする場合はAKSを利用し、Kubernetesの細かい管理は不要だが、Dapr等のKubernetesをベースとした機能を気軽に利用したい場合はAzure Container Appsを利用するといった使い分け方ができます。
Azure Container Appsは他のサービスより後発のコンテナ化アプリケーション向けのサービスであるため、比較的容易でかつ多様な用途に適した利用ができるサービスとなっています。ただしAzureではビジネスやアプリケーションの要件に応じてサービスの選択ができるようになっているので、要件に合ったサービスを見極める必要があります。
Azure Container Appsを使ってWebアプリケーションを構築しよう
ここからは実際にWebアプリケーションを実装し、Azure Container Apps上にデプロイするまでの流れを説明します。
サンプルWebアプリケーションの実装とACRへのプッシュ
今回も前回までと同様に、Redisをデータベースとして使用するFlaskのWebアプリケーションを作成していきます。
FlaskのWebアプリケーションの実装(src/app.py)
# Flaskのインポート
from flask import Flask
# Redisのインポート
from redis import Redis
import os
# Flaskの使用
app = Flask(__name__)
# Redisの初期化・・・①
redis_server = os.environ['REDIS_SERVER']
redis = Redis(host=redis_server, port=6379)
# 公開するAPIの定義
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello Helm! {}回目のアクセスです。\n'.format(count)
# アプリケーションの起動(外部公開できる状態で起動)
if __name__ == "__main__":
app.run(host="0.0.0.0", port="5000", debug=True)
これまでの記事と同じようにアクセスカウンターのアプリを実装します。アクセス数の保存先として使用するRedisの接続先情報は、環境変数から参照するようにします(①)。この環境変数の値は後ほどAzure Container Appsを作成する際に設定していきます。
Pythonアプリの依存ライブラリの定義(src/requirements.txt)
flask
redis
Flaskアプリケーションが依存するPythonのライブラリの一覧をrequirements.txtに記述します。今回はflaskとredisの2つのライブラリが必要になります。
Webアプリケーション用のDockerfile(src/Dockerfile)
# ベースイメージとしてpythonを使用する
FROM python:3.9-alpine
# アプリケーションの配置と依存関係のインストール
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
# 起動時のコマンドの指定
CMD ["python", "app.py"]
app.pyとrequirements.txtが用意できたら、Dockerfileを作成します。pythonイメージをベースイメージとして使用し、依存ライブラリのインストールとapp.pyの起動までを定義しています。
DockerイメージのビルドとACRへのプッシュ
$ az acr build --image zerokara-container-apps-web:v1 --registry zerokara .
Azure CLIの「az acr build」コマンドを使用してDockerイメージの作成とACRへのプッシュを一度に行います。
「--image」オプションでイメージ名とタグ名を指定し、「--registry」オプションでイメージをプッシュするACRのレジストリ名を指定します。
コマンドを実行すると、Dockerイメージのビルドが開始され、ビルドが完了すると続けてACRへのイメージのプッシュが開始されます。すべてが完了し、「successful」のログが出力されたらACRへのイメージプッシュまで成功となります。
Redis用コンテナーアプリの作成
ここからは実際にAzure Container Appsにアプリケーションをデプロイしていきます。今回はWebアプリケーション用とRedis用の2つのコンテナーアプリを作成します。
まずはアプリケーションのデータベースであるRedis用のコンテナーアプリを作成していきます。WebブラウザからAzureポータルにアクセスし、画面上部の検索ボックスで「コンテナー」と入力します。「コンテナー アプリ」と表示されているものがAzure Container Appsになるので選択します。
「コンテナー アプリ」を選択するとコンテナーアプリの一覧が表示されます。新しくコンテナーアプリを作成する場合は、画面左上の「作成」または画面中央の「コンテナー アプリの作成」ボタンを選択してコンテナーアプリの作成画面に移動します。
コンテナーアプリの「基本」タブに移動したら必要事項を入力していきます。
プロジェクトの詳細には、任意のサブスクリプションとリソースグループを選択します。「コンテナーアプリ名」には、デプロイするアプリケーションの名称を入力します。ここでは「zerokara-container-apps-db」という名称を入力します。
「Container Apps環境」のセクションではコンテナーアプリを実行するための仮想環境であるContainer Apps環境を作成または選択します。Container Apps環境はアプリの実行に必要なCPU・メモリ・ネットワーク等のリソースを設定することができ、複数のコンテナーアプリをContainer Apps環境に含めてリソースを共有することができます。
ここでは「地域」に「Japan East」を選択し、新たなContainer Apps環境を作成するため「新規作成」ボタンを選択します。
Container Apps環境の「基本」タブに遷移したら、ここでも必要事項を入力していきます。
「環境名」にはContainer Apps環境の名称を入力します。ここでは「zerokara-container-apps-env」という名称を使用します。現在選択している地域では、プランが「従量課金」に固定されます。従量課金プランでは、デプロイされているアプリの1秒あたりのリソース割り当て量とリクエスト数に基づいて課金が発生します。価格の詳細については、Azure Container AppsのHPをご覧ください。
「ゾーン冗長」は同一リージョン内でのレプリケーション設定です。今回は「無効」を選択します。ここまで入力したら、「監視」タブを選択します。
監視タブではログの出力先を設定できます。要件によってAzure Monitorに送信し、Log Analyticsを使ったログの分析などを行うことも可能です。今回は「ログを保存しない」を選択します。この設定の場合ログはAzure上に保存されませんが、アプリケーションから出力されるリアルタイムのログはストリーミングとして確認することができます。
次に「ネットワーク」タブを選択します。
ネットワークの設定では仮想ネットワーク使用の有無を選択することができます。仮想ネットワークを使用すると、コンテナーアプリと他のAzureリソースを同一ネットワーク経由で接続することができるようになります。今回は「いいえ」を選択します。
ここまで入力できたら、画面下部の「作成」ボタンを選択してContainer Apps環境の作成を完了します。
「作成」ボタンを選択するとコンテナーアプリの基本タブに戻ってきます。この時、Container Apps環境の名称が先程入力したものになっていることを確認します。確認できたら「次へ:アプリ設定 >」ボタンを選択します。
アプリ設定タブではデプロイするアプリケーションの詳細情報を入力していきます。今回はDocker Hub上にあるRedisのイメージを使用するため、「クイックスタートイメージを使用する」のチェックを外して以下の通り内容を入力します。
Redis用コンテナーアプリのアプリ設定例
設定項目名 | 設定値 |
---|---|
名前 | 任意のものを入力(今回は「zerokara-container-apps-db」) |
イメージのソース | Docker Hubまたはその他のレジストリ |
イメージの種類 | パブリック |
レジストリログインサーバー | docker.io |
イメージとタグ | redis:6.0 |
コマンドのオーバーライド | 未入力 |
CPUとメモリ | 0.25CPUコア、0.5Giメモリ |
環境変数 | 未入力 |
イングレス | 有効にする |
イングレストラフィック | Container Apps環境に限定 |
イングレスタイプ | TCP |
ターゲットポート | 6379 |
公開されたポート | 6379 |
設定例のように、Docker Hubに公開されているDockerイメージを参照してコンテナーアプリを作成することができます。他にも、ACRや他のイメージリポジトリを参照することも可能です。
イングレスを有効にすると、コンテナーアプリに対して外部からの接続が可能となります。「Container Apps環境に限定」を選択すると、同じContainer Apps環境に属するコンテナーアプリからの接続に公開範囲を限定することができます。Redis用のコンテナーアプリは後ほど作成するFlask用のコンテナーアプリからのみアクセスできればよいため、この設定にします。
ここまで入力ができたら「確認と作成」ボタンを選択し、確認画面で「作成」ボタンを選択してRedis用コンテナーアプリの作成を開始します。しばらく待つとコンテナーアプリの作成が完了します。
Flask用コンテナーアプリの作成
続いてFlask用のコンテナーアプリの作成も行います。Redis用コンテナーアプリの作成時と同様にAzureポータルから「コンテナー アプリ」を表示して「作成」を選択します。
コンテナーアプリ名は「zerokara-container-apps-web」とし、地域で「Japan East」を選択すると、「Container Apps環境」で先程作成した「zerokara-container-apps-env」という名称のContainer Apps環境が選択可能となるのでこちらを選択し、「次へ:アプリ設定 >」ボタンを選択します。