Azure Container Apps (ACA) に Python FastAPI カスタムコンテナイメージをデプロイする
こんにちは、@studio_meowtoon です。今回は、Azure Container Apps 環境で、Python FastAPI Web アプリケーションをコンテナとして起動する方法を紹介します。
目的
Windows 11 の Linux でクラウド開発します。
こちらから記事の一覧がご覧いただけます。
実現すること
Microsoft Azure Container Apps (ACA) に Python FastAPI Web アプリケーションのカスタムコンテナイメージをデプロイします。
Python ファイルのアプリをコンテナとして起動
要素 | 概要 |
---|---|
terminal | ターミナル |
Azure | クラウド環境 |
Azure Container Apps | コンテナ実行環境 |
app-hello-fastapi | カスタムコンテナ |
python | Python 実行環境 |
main.py | Python スクリプト |
uvicorn | Web サーバー |
この記事では、Docker Hub に公開するパブリックアクセス可能なカスタムコンテナイメージを使用しています。実際のシステム開発では、どのレジストリからコンテナイメージを取得するかは異なる場合がありますので、適宜ご確認ください。
技術トピック
Microsoft Azure Container Apps (ACA) とは?
こちらを展開してご覧いただけます。
Microsoft Azure Container Apps (ACA)
Azure 上で実行されるコンテナアプリケーションのプラットフォームです。
ACA は、Docker コンテナと Kubernetes クラスタの環境をサポートしており、開発者はコンテナイメージを作成して、Kubernetes リソースとしてデプロイすることができます。また、カスタムドメイン名をサポートしているため、自社のブランドを維持することができます。
メリット | 説明 |
---|---|
簡単なセットアップとデプロイ | ACA は、簡単なユーザーインターフェイスを備えており、数回のクリックでコンテナアプリケーションをセットアップしてデプロイすることができます。 |
スケーラビリティ | ACA は、自動的にスケーリングを行うことができます。アプリケーションに必要なリソースが増加した場合、ACA は自動的に必要なリソースを追加して処理を分散します。 |
セキュリティ | ACA は、コンテナアプリケーションを実行する際に必要なセキュリティ機能を提供しています。例えば Azure Active Directory との統合や、コンテナレベルでのアクセス制御などがあります。 |
コスト効率 | ACA は、必要なときに必要なリソースを追加するため、無駄なリソースの使用を最小限に抑えることができます。また、必要なリソースに対してのみ支払いを行うため、コスト効率的に利用することができます。 |
開発環境
- Windows 11 Home 22H2 を使用しています。
WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
WSL (Microsoft Store アプリ版) ※ こちらの関連記事からインストール方法をご確認いただけます
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Python ※ 通常 Ubuntu 22.04 には、Python はプリインストールされています。
$ python3 --version
Python 3.10.6
Docker ※ こちらの関連記事からインストール方法をご確認いただけます
$ docker --version
Docker version 23.0.1, build a5ee5b1
Azure CLI ※ こちらの関連記事からインストール方法をご確認いただけます
$ az --version
azure-cli 2.45.0
core 2.45.0
telemetry 1.0.8
この記事では基本的に Ubuntu のターミナルで操作を行います。Vim を使用してコピペする方法を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
作成する Web アプリケーションの仕様
No | エンドポイント | HTTPメソッド | MIME タイプ |
---|---|---|---|
1 | /api/data | GET | application/json |
Hello World を表示する手順
Python FastAPI Web サービスの作成
こちらの関連記事で手順がご確認いただけます。
ここまでの手順で、ローカル環境の Docker にアプリのカスタムコンテナイメージをビルドすることができました。
プロジェクトフォルダに移動
プロジェクトフォルダに移動します。
※ ~/tmp/hello-fastapi をプロジェクトフォルダとします。
$ cd ~/tmp/hello-fastapi
コンテナイメージの確認
Docker デーモンを起動します。
$ sudo service docker start
* Starting Docker: docker [ OK ]
コンテナイメージを確認します。
$ docker images | grep app-hello-fastapi
app-hello-fastapi latest b7746661a566 About an hour ago 184MB
Docker Hub にコンテナイメージを登録
Docker Hub にログインします。
$ docker login
Login Succeeded
コンテナイメージにタグを付けます。
ここで $USER という埋め込み変数は、Ubuntu のシェル変数 USER のことです。つまり、カスタムコンテナイメージを Docker Hub にプッシュする際に指定するアカウント名と、Ubuntu のユーザー名を同じにすると、イメージの取り扱いが簡単になります。ただし、この方法は検証用途に限定されます。
$ docker tag app-hello-fastapi:latest \
$USER/app-hello-fastapi:latest
Docker Hub にコンテナイメージをプュシュします。
$ docker push $USER/app-hello-fastapi:latest
ここまでの手順で、Docker Hub に $USER/app-hello-fastapi:latest というカスタムコンテナイメージをプッシュすることができました。
シェル変数の作成
シェル変数として、Ubuntu に以下の値を作成します。状況により、コンテナ アプリの名前を変える必要があります。
location_name=japaneast
resource_group_name=rg-hello
containerapp_env_name=cae-hello
containerapp_name=ca-hello-fastapi
container_image_name=app-hello-fastapi:latest
Azure 環境にサインイン
こちらの関連記事の続きから手順を説明する記事となります。
Azure CLI でログインします。
$ az login
Azure 環境
リソースグループ
リソースグループを作成します。
$ az group create \
--name $resource_group_name \
--location $location_name
コンテナ アプリ環境
コンテナ アプリ環境を作成します。
※ Kubernetes 基盤の環境がベースとなっているので少し時間がかかります。
$ az containerapp env create \
--resource-group $resource_group_name \
--name $containerapp_env_name \
--location $location_name
コンテナ アプリ
コンテナ アプリの作成とデプロイを行います。
$ az containerapp create \
--resource-group $resource_group_name \
--environment $containerapp_env_name \
--name $containerapp_name \
--image $USER/$container_image_name \
--target-port 8000 \
--ingress 'external' \
--min-replicas 0
--min-replicas 0: と設定することにより、アクセスが300秒間ない場合にアプリケーションがスケールゼロ状態に移行します。
コンテナ アプリを削除する場合は以下のコマンドを実行します。
$ az containerapp delete \
--resource-group $resource_group_name \
--name $containerapp_name
コンテナ アプリの FQDN をシェル変数 containerapp_fqdn として取得します。
$ containerapp_fqdn=$(az containerapp show \
--resource-group $resource_group_name \
--name $containerapp_name \
--query 'properties.configuration.ingress.fqdn' \
--output tsv)
コンテナ アプリの FQDN を確認します。
$ set | grep containerapp_fqdn
containerapp_fqdn=ca-hello-fastapi.nicehill-fafa9131.japaneast.awsomecontainerapps.io
Azure Portal の確認
ここまでの手順で、Azure Container Apps にコンテナ アプリをデプロイすることができました。
コンテナの動作確認
ターミナルから curl コマンドで確認します。
$ curl https://$containerapp_fqdn/api/data -w '\ntime_total: %{time_total}s\n'
出力(※ time_total は省略)
{"message":"Hello World!"}
ここまでの手順で、ターミナルに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
コンテナに接続
コンテナ アプリに接続します。
$ az containerapp exec \
--resource-group $resource_group_name \
--name $containerapp_name
コンテナに接続後にディレクトリを確認します。
※ コンテナから出るときは ctrl + D を押します。
# pwd
/app
# ls -lah
total 12K
drwxr-xr-x 1 root root 4.0K Aug 4 06:26 .
drwxr-xr-x 1 root root 4.0K Aug 4 07:23 ..
drwxr-xr-x 3 root root 4.0K Aug 3 13:16 app
top コマンドで状況を確認します。
# apt update
# apt install procps
# top
top - 07:25:05 up 23:17, 0 user, load average: 0.43, 0.20, 0.17
Tasks: 3 total, 1 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.7 us, 0.9 sy, 0.0 ni, 96.1 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 15990.8 total, 1618.9 free, 2633.1 used, 12094.9 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 13357.7 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 1099412 55856 13080 S 0.3 0.3 0:00.82 uvicorn
7 root 20 0 2576 908 820 S 0.0 0.0 0:00.00 sh
175 root 20 0 8988 4820 2940 R 0.0 0.0 0:00.00 top
top コマンドで cpu を表示した状況です。
top - 07:25:40 up 23:18, 0 user, load average: 0.24, 0.17, 0.17
Tasks: 3 total, 1 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu0 : 3.7 us, 2.7 sy, 0.0 ni, 93.3 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu1 : 5.4 us, 2.0 sy, 0.0 ni, 91.6 id, 0.7 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu2 : 4.7 us, 2.7 sy, 0.0 ni, 92.3 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 4.4 us, 1.7 sy, 0.0 ni, 93.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15990.8 total, 1612.2 free, 2638.4 used, 12096.4 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 13352.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 1099412 55856 13080 S 0.0 0.3 0:00.87 uvicorn
7 root 20 0 2576 908 820 S 0.0 0.0 0:00.00 sh
175 root 20 0 8988 4820 2940 R 0.0 0.0 0:00.00 top
コンテナの情報を表示してみます。
# cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
このコンテナは Debian GNU/Linux をベースに作成されています。つまり、Debian GNU/Linux と同じように扱うことができます。
パフォーマンスの計測
コンテナ 環境
項目 | バージョン |
---|---|
Base Image | Debian GNU/Linux 12 |
Python | 3.10.12 |
FastAPI | 0.100.1 |
コンテナ リソースの割り当て
項目 | 設定値 |
---|---|
CPU コアの数 | 0.5 |
メモリ サイズ(Gi) | 1Gi |
リクエスト処理完了までの所要時間
No | 状況 | リクエスト所要時間(秒) |
---|---|---|
1 | デプロイ直後 | 0.240148秒 |
2 | 連続して2回目 | 0.223488秒 |
3 | さらに3回目 | 0.188143秒 |
4 | スケールゼロ回復直後 | 8.349183秒 |
5 | 連続して2回目 | 0.195509秒 |
6 | さらに3回目 | 0.195168秒 |
ログ ストリーム:起動時間を表示するログ
※該当するログ情報なし
状況 | アプリ起動時間(秒) |
---|---|
デプロイ直後 | ---秒 |
スケールゼロ回復直後 | ---秒 |
メトリック:CPU使用率
状況 | CPU使用率 |
---|---|
デプロイ後:ピーク値 | 0.01コア |
スケールゼロ回復後:ピーク値 | 0.02コア |
メトリック:メモリ使用量
状況 | メモリ使用量 |
---|---|
デプロイ後:ピーク値 | 45.3MB |
スケールゼロ回復後:ピーク値 | 45.2MB |
アプリケーションがスケールゼロ状態から再びアクティブになった後、リクエストを処理するまでにかなり時間がかかる状況がわかります。ただしスケールゼロ状態は、--min-replicas 1: と設定することにより回避可能です。
まとめ
Azure Container Apps 環境で、Dockerfile からビルドした Python FastAPI Web サービスのカスタムコンテナイメージを起動することができました。
Python、Docker、Azure CLI を使って、FastAPI アプリの開発からコンテナイメージの作成、Azure 環境へのデプロイまで、すべてをターミナルから行うことができます。このように、クラウドでのシステム開発に必要なスキルや理解を深めることができます。初めての人でも簡単に手順を追うことができるので、ぜひ挑戦してみてください。
どうでしたか? 検証目的として、Azure Container Apps 環境で、Python FastAPI Web アプリケーションをコンテナとして手軽に起動することができます。ぜひお試しください。今後も Azure の開発環境などを紹介していきますので、ぜひお楽しみにしてください。
推奨コンテンツ