😊

Azure Container Instance をベーシックに構築する

2023/11/18に公開

はじめに

ごきげんよう、mihohoi です。Azure Container Instance は Azure コンテナーサービス群の中でも早くにコンテナーサービスとしてリリースされたサービスです。
今回はざっくりと Azure Container Instance を動かすまでを書いていきます。

Azure Container Instance とは

Azure 上でコンテナーを稼働させるサービスです。
CPU やメモリを選択し、コンテナーを起動します。単純なコンテナーやバッチ処理などに向いており、リージョンによっては GPU リソースが使えるため、ある程度馬力が欲しいコンテナーも稼働ができます。
ただ現時点では、GPU リソースはプレビューであることと、日本リージョンでは使用できません。

Azure Container Instance のドキュメントはこちらです。
https://learn.microsoft.com/ja-jp/azure/container-instances/

作成方法の流れ

作成の流れを示していきます。運用すると必須となる Log Analytics も作成し、コンテナーから出た標準出力/エラーを出して残します。

  1. リソースグループを作成する
  2. LogAnalytics を作成する
  3. Azure Container Registry がない場合は作成する
  4. イメージをアップロードする
  5. 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 ポータルから見てみましょう。
Azure Container Instance からログが出力されているのを確認

Log Analytics にもログが届いていることがわかります。
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"]
GitHubで編集を提案
Microsoft (有志)

Discussion