Azure Container Instance をベーシックに構築する
はじめに
ごきげんよう、mihohoi です。Azure Container Instance は Azure コンテナーサービス群の中でも早くにコンテナーサービスとしてリリースされたサービスです。
今回はざっくりと Azure Container Instance を動かすまでを書いていきます。
Azure Container Instance とは
Azure 上でコンテナーを稼働させるサービスです。
CPU やメモリを選択し、コンテナーを起動します。単純なコンテナーやバッチ処理などに向いており、リージョンによっては GPU リソースが使えるため、ある程度馬力が欲しいコンテナーも稼働ができます。
ただ現時点では、GPU リソースはプレビューであることと、日本リージョンでは使用できません。
Azure Container Instance のドキュメントはこちらです。
作成方法の流れ
作成の流れを示していきます。運用すると必須となる Log Analytics も作成し、コンテナーから出た標準出力/エラーを出して残します。
- リソースグループを作成する
- LogAnalytics を作成する
- Azure Container Registry がない場合は作成する
- イメージをアップロードする
- Azure Container Instance を作成する
Azure CLI を使って作成する
0. 変数
事前準備します。アプリケーションはすでにある想定ですが、もしない場合は最後の「おまけ」を使ってください。10分ごとにログを出力する Python アプリケーションです。
変数には好きな文字列を入れて適宜変更してください。
RESOURCE_GROUP=
LOCATION=japaneast
CONTAINER_INSTNCE=
CONTAINER_REGISTRY=
WORKSPACE=
CONTAINER_NAME=python-app:v1.0
ACR_ID=
1. リソースグループを作成する
リソースグループを作成します。
az group create --name $RESOURCE_GROUP --location $LOCATION
2. LogAnalytics を作成する
ログは残してなんぼ、ということで Log Analytics を作成します。消えちゃうからね。
az monitor log-analytics workspace create --resource-group $RESOURCE_GROUP --workspace-name $WORKSPACE --location japaneast
ワークスペースの情報は後ほど使うため、変数に入れておきます。
workspace_id=$(az monitor log-analytics workspace show --resource-group $RESOURCE_GROUP --workspace-name $WORKSPACE --query customerId --output tsv)
workspace_key=$(az monitor log-analytics workspace get-shared-keys --resource-group $RESOURCE_GROUP --workspace-name $WORKSPACE --query primarySharedKey --output tsv)
3. Azure Container Registry がない場合は作成する
Azure Container Registry を作成します。もし手元にない場合はここで新規作成します。手元にある場合はこの作業をスキップします。
az acr create --resource-group $RESOURCE_GROUP --name $CONTAINER_REGISTRY --sku Basic
4. イメージをアップロードする
ここでアプリケーションを Azure Container Registry にアップロードします。
az acr login --name $CONTAINER_REGISTRY
docker build -t $CONTAINER_REGISTRY.azurecr.io/$CONTAINER_NAME ./
# Push する
docker push $CONTAINER_REGISTRY.azurecr.io/$CONTAINER_NAME
5. Azure Container Instance を作成する
それでは、Azure Container Instance を作成します。
az container create --resource-group $RESOURCE_GROUP --name $CONTAINER_INSTNCE --image $CONTAINER_REGISTRY.azurecr.io/$CONTAINER_NAME --registry-login-server $CONTAINER_REGISTRY.azurecr.io --registry-username $CONTAINER_REGISTRY --registry-password <ACRの管理パスワード> --log-analytics-workspace $workspace_id --log-analytics-workspace-key $workspace_key
できました。ただ、これだと ACR の管理者権限を毎回たたくことになるので、Managed ID でやる方法で作成します。
まずは Managed ID を作成します。
az identity create --resource-group $RESOURCE_GROUP --name $ACR_ID
後の手順で必要な、リソース ID とサービスプリンシパル ID を変数に入れます。
# リソース ID
USERID=$(az identity show --resource-group $RESOURCE_GROUP --name $ACR_ID --query id --output tsv)
# サービスプリンシパル ID
SPID=$(az identity show --resource-group $RESOURCE_GROUP --name $ACR_ID --query principalId --output tsv)
ID にロールを割り当てする
RESOURCE_ID=$(az acr show --name $CONTAINER_REGISTRY --query id --output tsv)
az role assignment create --assignee $SPID --scope $RESOURCE_ID --role acrpull
az container create --name $CONTAINER_INSTNCE --resource-group $RESOURCE_GROUP --image $CONTAINER_REGISTRY.azurecr.io/$CONTAINER_NAME --acr-identity $USERID --assign-identity $USERID --log-analytics-workspace $workspace_id --log-analytics-workspace-key $workspace_key
しばらくすると、とは言っても数分ですが、Azure Container Instance が作成されます。Azure ポータルから見てみましょう。
Log Analytics にもログが届いていることがわかります。
関連するドキュメントはこちらにあります。
終わりに
以上です。「Azure Container Instance を使ってみる」の第一歩の内容なので、Microsoft Learn のドキュメントのチュートリアルを見れば作成できます。
がしかし、それだと私の作りたいベーシックな構成じゃないんだよなぁ、ということで書き残してみました。
では、良いコンテナーライフを!!
おまけ
今回使ったコードはこちらにあります。
main.py
はこんな感じです。単純に 10 分ごとに現在の時刻を出力します。
import logging
import time
import datetime
logging.basicConfig(filename='app.log', filemode='a', format='%(asctime)s - %(message)s', level=logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(message)s'))
logging.getLogger().addHandler(console_handler)
logging.info("== Hello Python ==")
def log_message(message):
logging.info(message)
while True:
# 今の時間を取得
now = datetime.datetime.now()
log_message("logmessage: " + str(now))
time.sleep(600) # 10 分まつ
Dockerfile はこちら
FROM python:3.10-slim-buster
WORKDIR /app
COPY . /app
CMD ["python", "./main.py"]
Discussion