今回は Azure Container Apps (コンテナー アプリ)を使って、簡単な WebAPI を作ってみたいと思います。
Azure Container Apps とは
Azure Container Apps とは Azure 上でコンテナーをデプロイして、そのコンテナーを実行できる仕組みです。
docker.io などのリポジトリ上のコンテナーだけでなく、 Azure Container Registry にローカルのコンテナイメージを登録して動かくすことも可能です。
詳しくは、以下の公式サイトを参照してください。
Azure Container Apps | Microsoft Azure
前提条件
今回のコラムでは、Azure CLI と Docker と docker compose を利用しています。
- Azure CLI をインストールする方法 | Microsoft Learn
- Install Docker Engine | Docker Docs
- Install the Compose plugin | Docker Docs
今回の手順
- Azure Container Registry を作成する
- ローカル環境で動かしたいコンテナーを作成する
- 作成したコンテナーを Azure Container Registry にコンテナイメージとして登録する
- 登録したコンテナイメージを Azure Container Apps で動かす
Azure Container Registry を作成する
まずは、 Azure Container Registry を作成する必要があります。
まだ、 Azure CLI でログインしていない場合は、ログインしましょう。
$ az login
gio: https://login.microsoftonline.com/(省略)
[
{
"cloudName": "AzureCloud",
(省略)
}
]
$
以下のコマンドで Azure Container Registry を作成します。
$ az acr create \
--resource-group (指定のリソースグループ) \
--name mycontainerregistrytest \
--sku Basic \
--admin-enabled
{
"adminUserEnabled": true,
(省略)
"name": "mycontainerregistrytest ",
(省略)
"resourceGroup": "(指定のリソースグループ)",
"sku": {
"name": "Basic",
"tier": "Basic"
},
(省略)
}
$
パラメータの詳細は以下を参照してください。
今回 --admin-enabled
を付けて管理者ユーザーを有効化しています。
管理者ユーザーを有効化しておかないと、Azure Container Apps から対象のコンテナイメージが参照できないためです。
ローカル環境で動かしたいコンテナーを作成する
続いてローカル環境で Azure Container Apps で動かすためのコンテナーを作成します。
今回は Flask を利用した簡単な WebAPI を作りたいと思います。
まずは、以下のサイトに docker compose 用多数のサンプルが用意されたリポジトリがありますので、そこからクローンします。
GitHub – docker/awesome-compose: Awesome Docker Compose samples
git clone https://github.com/docker/awesome-compose.git
クローンしたディレクトリ内に /flask ディレクトリがありますので、そのディレクトリに移動しコンテナーを起動します。
$ docker compose up -d
[+] Building 4.4s (12/12) FINISHED docker:default
(省略)
✔ Network flask_default Created 0.1s
✔ Container flask-web-1 Started
$
正常に起動したことを確認したところで、 以下のコマンドでコンテナーを確認します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
5132008cdb9c flask-web "python3 app.py" 22 seconds ago Up 21 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp flask-web-1
$ curl localhost:8000
Hello World!
$
正しく確認出来たら、一旦コンテナーを削除します。
$ docker compose down
[+] Running 2/2
✔ Container flask-web-1 Removed 0.6s
✔ Network flask_default Removed 0.8s
$
このままこのコンテナーを使ってもいいのですが、 WebAPI っぽくするためにコードを修正します。
flask のディレクトリ内に app ディレクトリがあり、その中に app.py
というファイルがあります。
これが Web サーバの処理の本体になるので、このコードを vi などで以下のように修正します。
from flask import Flask
import uuid
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello World!"
@app.route('/generate-uuid')
def generate_uuid():
return str(uuid.uuid4())
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
内容としては /generate-uuid
にアクセスしたらランダムな UUID を返すという処理です。
コードを修正したら、コンテナイメージをリビルドしてコンテナーを再度起動します。
$ docker compose build
[+] Building 4.8s (12/12) FINISHED docker:default
(省略)
$ docker compose up -d
[+] Running 2/2
✔ Network flask_default Created 0.2s
✔ Container flask-web-1 Started 0.5s
$
正常に起動したことを確認したところで、 再びコンテナーを確認します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
0c7666a61196 flask-web "python3 app.py" 48 seconds ago Up 47 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp flask-web-1
$ curl localhost:8000
Hello World!
$ curl localhost:8000/generate-uuid
7b081b12-0133-41c1-a282-7022f71e757d
$
正しくコンテナーが作成できたことが確認できたのであれば、コンテナーを停止してください(削除ではないので気をつけてください)。
$ docker compose stop
[+] Stopping 1/1
✔ Container flask-web-1 Stopped 0.6s
$
作成したコンテナーを Azure Container Registry にコンテナイメージとして登録する
正しくコンテナーが作成できたところで、次はその作成したコンテナーをコンテナイメージとして Azure Container Registry に登録します。
まずは、先ほど作成した Azure Container Registry にログインします。
$ az acr login --name mycontainerregistrytest
Login Succeeded
$
ログインが成功したら、以下のコマンドで Azure Container Registry のログインサーバーの情報を確認します。
$ az acr show --name mycontainerregistrytest --query loginServer
"mycontainerregistrytest.azurecr.io"
$
ログインサーバーの情報( mycontainerregistrytest.azurecr.io
)が確認できましたら、続いて先ほど停止したコンテナー名を確認します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c7666a61196 flask-web "python3 app.py" 26 minutes ago Exited (0) 6 minutes ago flask-web-1
$
コンテナー名を確認できました。
それでは、このコンテナーを Azure Container Registry に登録するために、作成したコンテナーをコンテナイメージとしてコミットします。
$ docker commit flask-web-1 mycontainerregistrytest.azurecr.io/flask-test:1.0.0
sha256:01234567890abcdef01234567890abcdef01234567890abcdef01234567890ab
$
flask-web-1
は先ほど確認したコンテナー名です。mycontainerregistrytest.azurecr.io
は先ほど取得したログインサーバーの情報です。
ログインサーバー以降の値は任意の指定ですので、今回は以下の内容で進めます。
- イメージ名:
flask-test
- タグ:
1.0.0
コミットが正常にできましたら、そのコンテナイメージを Azure Container Registry にプッシュします。
$ docker push mycontainerregistrytest.azurecr.io/flask-test:1.0.0
The push refers to repository [mycontainerregistrytest.azurecr.io/flask-test]
(省略)
1.0.0: digest: sha256:01234567890abcdef01234567890abcdef01234567890abcdef01234567890ab size: 2408
$
正常に Azure Container Registry に登録されたか確認します。
$ az acr repository list --name mycontainerregistrytest
[
"flask-test"
]
$
このように先ほどプッシュしたコンテナイメージ名が表示されれば正しく登録されています。
登録したコンテナイメージを Azure Container Apps で動かす
それでは登録したコンテナイメージを Azure Container Apps で起動します。
まずは Azure Container Apps 用の環境設定を作成します。
$ az containerapp env create \
--resource-group (指定のリソースグループ) \
--name my-container-test-app-env \
--location japaneast \
--enable-workload-profiles false \
--logs-destination none
Container Apps environment created. To deploy a container app, use: az containerapp create --help
{
"id": "(省略)",
"location": "Japan East",
"name": "my-container-test-app-env",
"properties": {
"appLogsConfiguration": {
"destination": null,
"logAnalyticsConfiguration": null
},
(省略)
"workloadProfiles": null,
"zoneRedundant": false
},
"resourceGroup": "(指定のリソースグループ)",
(省略)
}
$
パラメータの詳細は以下を参照してください。
az containerapp env | Microsoft Learn
正常に Azure Container Apps 用の環境設定が作成できましたら、先ほどのコンテナイメージを用いて Azure Container Apps を作成します。
$ az containerapp create \
--resource-group (指定のリソースグループ) \
--name my-container-test-app \
--environment my-container-test-app-env \
--image mycontainerregistrytest.azurecr.io/flask-test:1.0.0 \
--ingress external \
--target-port 8000 \
--registry-server mycontainerregistrytest.azurecr.io \
--query properties.configuration.ingress.fqdn
No credential was provided to access Azure Container Registry. Trying to look up credentials...
Adding registry password as a secret with name "(省略)"
Container app created. Access your app at https://(コンテナ接続URL)/
"(コンテナ接続URL)"
$
パラメータの詳細は以下を参照してください。
az containerapp | Microsoft Learn
今回はイングレスルールを設定しましたので、自動的にコンテナに接続するための URL が発行されます。
最後に実際に正しく動くか確認してみます。
$ curl https://(コンテナ接続URL)/
Hello World!
$ curl https://(コンテナ接続URL)/generate-uuid
ea652012-02d8-4da6-b222-bdb73f372a68
$
正しく動くことが確認できました。
このように、簡単な手順で Azure 上で任意のコンテナーを動かくすことができました。
Azure でもコンテナーを動かす仕組みが色々用意されていますので、是非活用してみてください。