🚀

Azure Container Apps ジョブを動作させる (スケジュール トリガー編)

2024/01/01に公開

概要

以前、Azure Container Apps ジョブを動作させる (手動トリガー編)を記載しましたが、今回はスケジュールによってトリガーされる Azure Container Apps ジョブを作成してみます。

詳細

イメージの準備

Azure Container Apps ジョブを動作させる (手動トリガー編) では、マイクロソフト公式ドキュメントにも記載されていたサンプル イメージを使用しましたが、今回は自分で準備します。中身は何でもいいのですが、python を使います。簡易的に以下のようなサンプル構成を作りました。

サンプル構成
app
├─── requirements.txt
└─── src
     └─── fork-exec.py

今回はとりあえず Azure Container Apps ジョブを動作させてみることに主眼を置いているので、処理の内容は何でも OK です。(手元に fork 関数の調査をしたときのものがあったのでそれを動かしてみます)

fork-exec.py の内容サンプル
#!/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 等は以下を参照)

Dockerfile 例
# 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 を使用して作成する場合は以下を参考)

イメージをを指定し作成を完了させます。

動作結果確認

ログを確認すると、以下の通り実行された事がわかります。(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