Azure Container Apps ジョブを動作させる (スケジュール トリガー編)
概要
以前、Azure Container Apps ジョブを動作させる (手動トリガー編)を記載しましたが、今回はスケジュールによってトリガーされる Azure Container Apps ジョブを作成してみます。
詳細
イメージの準備
Azure Container Apps ジョブを動作させる (手動トリガー編) では、マイクロソフト公式ドキュメントにも記載されていたサンプル イメージを使用しましたが、今回は自分で準備します。中身は何でもいいのですが、python を使います。簡易的に以下のようなサンプル構成を作りました。
app
├─── requirements.txt
└─── src
└─── fork-exec.py
今回はとりあえず Azure Container Apps ジョブを動作させてみることに主眼を置いているので、処理の内容は何でも OK です。(手元に fork 関数の調査をしたときのものがあったのでそれを動かしてみます)
#!/usr/bin/python3
import os, sys
import time
#call fork
ret = os.fork()
#check the returned value
#In case of child process, returned value should be 0
#In case of parent process, returned value should be the process id of child.
if ret == 0:
#print("This is child process, Child Process : PID={}, Parent Process : PID={}".format(os.getpid(), os.getppid()))
#time.sleep(10)
#Using execve, child process is replaced with another program.
os.execve("/bin/echo", ["echo", "Hi from PID={}".format(os.getpid())],{})
exit()
elif ret >= 1:
print("This is Parent process, Parent Process : PID={}, Child Process : PID={}".format(os.getpid(), ret))
time.sleep(10)
exit()
sys.exit(1)
Dockerfile は以下のようにしました。
(Dockerfile や python Docker Official Image 等は以下を参照)
- Overview of best practices for writing Dockerfiles
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#cmd - Docker Python Official image
https://hub.docker.com/_/python
# set base image (host OS)
FROM python:3.13.0a2-slim-bookworm
# set the working directory in the container
WORKDIR /code
# copy the dependencies file to the working directory
COPY requirements.txt .
# install dependencies
RUN pip install -r requirements.txt
# copy the content of the local src directory to the working directory
COPY src/ .
# command to run on container start
CMD [ "python", "./fork-exec.py" ]
イメージをビルドして、docker run
します。
docker build -t <イメージ名> .
docker run --name <コンテナー名> -it <イメージ名>
This is Parent process, Parent Process : PID=1, Child Process : PID=7
Hi from PID=7
一応コンテナー内で、マニュアルで実行してみましたが同じ結果です。
意図しない動作になってしまった場合にはコンテナー内の状況等を確認してみるといいかと思います。
docker run --name <コンテナー名> -it <イメージ名> /bin/bash
xxxxxx:/code# python fork-exec.py
This is Parent process, Parent Process : PID=11, Child Process : PID=12
Hi from PID=12
イメージをレジストリに push します。
今回は、Azure Container Registry に Push します。(事前に ACR にログインします)
docker push <Image Name>:<Tag>
Azure Container Apps ジョブを作成する
ポータルから作成してみます。新しいリソースから "Container App ジョブ" を選びます。
今回はトリガーの種類に「スケジュール済み」を選択し、スケジュールを Cron 式で設定します。毎時 0 分に起動するように、0 */1 * * *
を設定しました。
(Azure CLI を使用して作成する場合は以下を参考)
- az containerapp job create
https://learn.microsoft.com/ja-jp/cli/azure/containerapp/job?view=azure-cli-latest#az-containerapp-job-create
イメージをを指定し作成を完了させます。
動作結果確認
ログを確認すると、以下の通り実行された事がわかります。(Execution History ブレードにて確認。一旦 10 分毎に動作するように変更しています)
更に詳細を見てみます。まず、ContainerAppSystemLogs_CL
から見てみます。
2 回実行されましたが以下の通りです。
ContainerAppSystemLogs_CL
| where TimeGenerated >= datetime(2024-01-02 01:00:00) and TimeGenerated <= datetime(2024-01-02 04:35:00)
| where ExecutionName_s has "scheduled-job-test-001"
| project TimeGenerated, Reason_s, JobName_s, ExecutionName_s,EventSource_s,ReplicaName_s,Log_s,Count_d
| order by TimeGenerated asc
次に、ContainerAppConsoleLogs_CL
を見てみます。
アプリケーションからのログも出力されています。
ContainerAppConsoleLogs_CL
| where TimeGenerated >= datetime(2024-01-02 01:00:00) and TimeGenerated <= datetime(2024-01-02 04:35:00)
| where * contains "scheduled-job-test-001"
| order by TimeGenerated asc
1 回目の実行
2 回目の実行
まとめ
今回は自分で用意したコンテナーを使ってスケジュール トリガーの Azure Container Apps ジョブを動作させてみました。次回はイベント ドリブンで起動する Azure Container ジョブを作成してみたいと思います。
Discussion