チュートリアル:定義したスケジュールで ACR タスクを実行する

このチュートリアルでは、スケジュールに従って ACR タスクを実行する方法を説明します。 1 つ以上の "タイマー トリガー" を設定することによってタスクをスケジュールします。 タイマー トリガーは単独で使用することも、他のタスク トリガーと組み合わせて使用することもできます。

このチュートリアルでは、タスクのスケジュール設定と次の作業について説明します。

  • タイマー トリガーを含むタスクを作成する
  • タイマー トリガーを管理する

タスクのスケジュールは、次のようなシナリオで役に立ちます。

  • 予定メンテナンス操作に対するコンテナー ワークロードを実行します。 たとえば、コンテナー化されたアプリを実行して、不必要なイメージをレジストリから削除します。
  • ライブサイトの監視の一環として、勤務日の間に運用イメージで一連のテストを実行します。

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

タスクのスケジュールについて

  • Cron 式でのトリガー - タスクのタイマー トリガーでは、"Cron 式" を使います。 式は、タスクをトリガーする分、時、日、月、曜日を指定する 5 つのフィールドを含む文字列です。 最大で 1 分ごとに 1 回の頻度までサポートされます。

    たとえば、式 "0 12 * * Mon-Fri" では、各平日の UTC で正午にタスクがトリガーされます。 この記事の後半で詳細をご確認ください。

  • 複数のタイマー トリガー - スケジュールが異なる限り、1 つのタスクに複数のタイマーを追加できます。

    • タスクを作成するときに複数のタイマー トリガーを指定するか、または後で追加します。
    • 必要に応じて、管理しやすいようにトリガーの名前を指定します。指定しないと、ACR タスクによって既定のトリガー名が提供されます。
    • 一度に複数のタイマー スケジュールが重なっている場合、ACR タスクでは各タイマーのスケジュールされた時刻にタスクがトリガーされます。
  • その他のタスク トリガー - タイマーによってトリガーされるタスクでは、ソース コードのコミットまたは基本イメージの更新に基づいてトリガーを有効にすることもできます。 他の ACR タスクと同様に、スケジュールされたタスクを手動で実行することもできます。

タイマー トリガーを含むタスクを作成する

タスクのコマンド

最初に、次のシェル環境変数に、環境に適した値を設定します。 この手順は必須ではありませんが、このチュートリアルの複数行の Azure CLI コマンドの実行が少し簡単になります。 環境変数を設定しない場合は、それぞれの値を、サンプル コマンド内の現れたところで手動で置き換える必要があります。

ACR_NAME=<registry-name>        # The name of your Azure container registry

az acr task create コマンドでタスクを作成するときに、必要に応じて、タイマー トリガーを追加することができます。 --schedule パラメーターを追加し、タイマーの Cron 式を渡します。

簡単な例として、次のタスクでは、毎日 21:00 UTC に Microsoft Container Registry からの hello-world イメージの実行がトリガーされます。 そのタスクは、ソース コードのコンテキストなしで実行されます。

az acr task create \
  --name timertask \
  --registry $ACR_NAME \
  --cmd mcr.microsoft.com/hello-world \
  --schedule "0 21 * * *" \
  --context /dev/null

タイマー トリガーが構成されていることを確認するには、az acr task show コマンドを実行します。 既定では、基本イメージ更新トリガーも有効になります。

az acr task show --name timertask --registry $ACR_NAME --output table
NAME      PLATFORM    STATUS    SOURCE REPOSITORY       TRIGGERS
--------  ----------  --------  -------------------     -----------------
timertask linux       Enabled                           BASE_IMAGE, TIMER

また、ソース コード コンテキストで実行されるタスクの簡単な例です。 次のタスクでは、毎日 21:00 UTC に Microsoft Container Registry からの hello-world イメージの実行がトリガーされます。

前提条件に従ってソース コード コンテキストをビルドし、コンテキストを持つスケジュール タスクを作成します。

az acr task create \
  --name timertask \
  --registry $ACR_NAME \
  --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#master \
  --file Dockerfile \
  --image timertask:{{.Run.ID}} \
  --git-access-token $GIT_PAT \
  --schedule "0 21 * * *"

タイマー トリガーが構成されていることを確認するには、az acr task show コマンドを実行します。 既定では、基本イメージ更新トリガーも有効になります。

az acr task show --name timertask --registry $ACR_NAME --output table

az acr task run コマンドを実行して、タスクを手動でトリガーします。

az acr task run --name timertask --registry $ACR_NAME

タスクのトリガー

正しく設定されていることを確認するには、az acr task run を使って手動でタスクをトリガーします。

az acr task run --name timertask --registry $ACR_NAME

コンテナーが正常に実行された場合、出力は次のようになります。 次の出力は、主要な手順を表示するように要約されいます。

Queued a run with ID: cf2a
Waiting for an agent...
2020/11/20 21:03:36 Using acb_vol_2ca23c46-a9ac-4224-b0c6-9fde44eb42d2 as the home volume
2020/11/20 21:03:36 Creating Docker network: acb_default_network, driver: 'bridge'
[...]
2020/11/20 21:03:38 Launching container with name: acb_step_0

Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

スケジュールされた時刻の後で、想定どおりにタイマーでタスクがトリガーされたことを確認するには、az acr task list-runs コマンドを実行します。

az acr task list-runs --name timertask --registry $ACR_NAME --output table

タイマーが成功している場合、次のような出力が表示されます。

RUN ID    TASK       PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  ---------  ----------  ---------  ---------  --------------------  ----------
ca15      timertask  linux       Succeeded  Timer      2020-11-20T21:00:23Z  00:00:06
ca14      timertask  linux       Succeeded  Manual     2020-11-20T20:53:35Z  00:00:06

タイマー トリガーを管理する

ACR タスクのタイマー トリガーを管理するには、az acr task timer コマンドを使います。

タイマー トリガーを追加または更新する

タスクを作成した後は、必要に応じて、az acr task timer add コマンドを使ってタイマー トリガーを追加します。 次の例では、前に作成した timertasktimer2 という名前のタイマー トリガーが追加されます。 このタイマーでは、毎日 10:30 UTC にタスクがトリガーされます。

az acr task timer add \
  --name timertask \
  --registry $ACR_NAME \
  --timer-name timer2 \
  --schedule "30 10 * * *"

既存のトリガーのスケジュールを更新したり、その状態を変更したりするには、az acr task timer update コマンドを使います。 たとえば、timer2 という名前のトリガーを、11:30 UTC にタスクをトリガーするように更新します。

az acr task timer update \
  --name timertask \
  --registry $ACR_NAME \
  --timer-name timer2 \
  --schedule "30 11 * * *"

タイマー トリガーを一覧表示する

az acr task timer list コマンドでは、タスクに設定されているタイマー トリガーが表示されます。

az acr task timer list --name timertask --registry $ACR_NAME

出力例:

[
  {
    "name": "timer2",
    "schedule": "30 11 * * *",
    "status": "Enabled"
  },
  {
    "name": "t1",
    "schedule": "0 21 * * *",
    "status": "Enabled"
  }
]

タイマー トリガーを削除する

タスクからタイマー トリガーを削除するには、az acr task timer remove コマンドを使います。 次の例では、timertask から timer2 トリガーが削除されます。

az acr task timer remove \
  --name timertask \
  --registry $ACR_NAME \
  --timer-name timer2

Cron 式

ACR タスクでは、Cron 式を解釈するために NCronTab ライブラリが使われます。 ACR タスクでは、5 つの必須フィールドが空白で区切られた式がサポートされます。

{minute} {hour} {day} {month} {day-of-week}

Cron 式で使われるタイム ゾーンは、協定世界時 (UTC) です。 時間は 24 時間形式です。

Note

ACR タスクでは、Cron 式の {second} または {year} フィールドはサポートされていません。 別のシステムで使われている Cron 式をコピーする場合、それらのフィールドが使われている場合は、忘れずに削除してください。

各フィールドは、次の種類の値のいずれかを持つことができます。

Type トリガーのタイミング
特定の値 "5 * * * *" 毎時、正時から 5 分後
すべての値 (*) "* 5 * * *" 5:00 UTC からの 1 時間の毎分 (1 日に 60 回 )
範囲 (- 演算子) "0 1-3 * * *" 1 日 3 回、1:00、2:00、3:00 UTC
値のセット (, 演算子) "20,30,40 * * * *" 1 時間に 3 回、各時の 20 分、30 分、40 分
間隔値 (/ 演算子) "*/10 * * * *" 1 時間に 6 回、各時の 10 分、20 分など

月や曜日を指定するには、数値、名前、または名前の省略形を使用できます。

  • 曜日については、数値は 0 から 6 で指定します (0 は日曜日です)。
  • 名前は英語で指定します。 例: Monday, January
  • 名前の大文字と小文字は区別されません。
  • 名前は省略形でも指定できます。 省略形は 3 文字にすることをお勧めします。 例: Mon, Jan

Cron の例

トリガーのタイミング
"*/5 * * * *" 5 分ごとに 1 回
"0 * * * *" 毎正時に 1 回
"0 */2 * * *" 2 時間に 1 回
"0 9-17 * * *" 9:00 から 17:00 UTC まで、1 時間に 1 回
"30 9 * * *" 毎日 9:30 UTC
"30 9 * * 1-5" 毎平日 9:30 UTC
"30 9 * Jan Mon" 1 月の毎週月曜日の 9:30 UTC

リソースをクリーンアップする

このチュートリアル シリーズで作成したすべてのリソース (コンテナー レジストリ、コンテナー インスタンス、キー コンテナー、サービス プリンシパルなど) を削除するには、次のコマンドを実行します。

az group delete --resource-group $RES_GROUP
az ad sp delete --id http://$ACR_NAME-pull

次のステップ

このチュートリアルでは、タイマーによって自動的にトリガーされる Azure Container Registry タスクを作成する方法について学習しました。

スケジュールされたタスクを使用してレジストリ内のリポジトリをクリーンアップする例については、「Azure コンテナー レジストリからイメージを自動的に消去する」を参照してください。

ソース コード コミットまたは基本イメージ更新によってトリガーされるタスクの例については、ACR タスク チュートリアル シリーズの他の記事をご覧ください。