はじめに

今回はサーバーレスなプラットフォームでコンテナ化アプリケーションを実行できる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になるので選択します。

  • AzureポータルからAzure Container Appsを検索する

「コンテナー アプリ」を選択するとコンテナーアプリの一覧が表示されます。新しくコンテナーアプリを作成する場合は、画面左上の「作成」または画面中央の「コンテナー アプリの作成」ボタンを選択してコンテナーアプリの作成画面に移動します。

  • コンテナーアプリの一覧画面

コンテナーアプリの「基本」タブに移動したら必要事項を入力していきます。
プロジェクトの詳細には、任意のサブスクリプションとリソースグループを選択します。「コンテナーアプリ名」には、デプロイするアプリケーションの名称を入力します。ここでは「zerokara-container-apps-db」という名称を入力します。 「Container Apps環境」のセクションではコンテナーアプリを実行するための仮想環境であるContainer Apps環境を作成または選択します。Container Apps環境はアプリの実行に必要なCPU・メモリ・ネットワーク等のリソースを設定することができ、複数のコンテナーアプリをContainer Apps環境に含めてリソースを共有することができます。
ここでは「地域」に「Japan East」を選択し、新たなContainer Apps環境を作成するため「新規作成」ボタンを選択します。

  • :Redis用コンテナーアプリの新規作成画面(基本タブ)

Container Apps環境の「基本」タブに遷移したら、ここでも必要事項を入力していきます。
「環境名」にはContainer Apps環境の名称を入力します。ここでは「zerokara-container-apps-env」という名称を使用します。現在選択している地域では、プランが「従量課金」に固定されます。従量課金プランでは、デプロイされているアプリの1秒あたりのリソース割り当て量とリクエスト数に基づいて課金が発生します。価格の詳細については、Azure Container AppsのHPをご覧ください。
「ゾーン冗長」は同一リージョン内でのレプリケーション設定です。今回は「無効」を選択します。ここまで入力したら、「監視」タブを選択します。

  • :Container Apps環境の新規作成画面(基本タブ)

監視タブではログの出力先を設定できます。要件によってAzure Monitorに送信し、Log Analyticsを使ったログの分析などを行うことも可能です。今回は「ログを保存しない」を選択します。この設定の場合ログはAzure上に保存されませんが、アプリケーションから出力されるリアルタイムのログはストリーミングとして確認することができます。
次に「ネットワーク」タブを選択します。

  • :Container Apps環境の新規作成画面(監視タブ)

ネットワークの設定では仮想ネットワーク使用の有無を選択することができます。仮想ネットワークを使用すると、コンテナーアプリと他のAzureリソースを同一ネットワーク経由で接続することができるようになります。今回は「いいえ」を選択します。
ここまで入力できたら、画面下部の「作成」ボタンを選択してContainer Apps環境の作成を完了します。

  • :Container Apps環境の新規作成画面(ネットワークタブ)

「作成」ボタンを選択するとコンテナーアプリの基本タブに戻ってきます。この時、Container Apps環境の名称が先程入力したものになっていることを確認します。確認できたら「次へ:アプリ設定 >」ボタンを選択します。

  • :Redis用コンテナーアプリの新規作成画面(アプリ設定タブ)

アプリ設定タブではデプロイするアプリケーションの詳細情報を入力していきます。今回は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ポータルから「コンテナー アプリ」を表示して「作成」を選択します。

  • :Flask用コンテナーアプリの新規作成画面(基本タブ)

コンテナーアプリ名は「zerokara-container-apps-web」とし、地域で「Japan East」を選択すると、「Container Apps環境」で先程作成した「zerokara-container-apps-env」という名称のContainer Apps環境が選択可能となるのでこちらを選択し、「次へ:アプリ設定 >」ボタンを選択します。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら