次の方法で共有


クイック スタート: Azure Functions を使用してスケジュールされたタスクを実行する

この記事では、Azure Developer CLI (azd) を使用して、スケジュールされたタスクを Azure Functions で実行するタイマー トリガー関数を作成します。 コードをローカルで確認したら、Azure Functions の Flex 従量課金プランで実行して作成した新しいサーバーレス関数アプリにコードをデプロイします。

プロジェクト ソースでは、 azd を使用して関数アプリと関連リソースを作成し、コードを Azure にデプロイします。 このデプロイは、セキュリティで保護されたスケーラブルな Azure Functions デプロイの最新のベスト プラクティスに従います。

既定では、Flex 従量課金プランは従 量課金 制の課金モデルに従います。つまり、この記事を完了でき、Azure アカウントでは数 USD セント以下の小さなコストしか発生しません。

Important

スケジュールされたタスクの実行はすべての言語でサポートされていますが、このクイック スタート シナリオには現在、C#、Python、TypeScript の例しかありません。 このクイック スタートを完了するには、この記事の上部にあるサポートされている言語のいずれかを選択します。

[前提条件]

プロジェクトを初期化する

azd init コマンドを使用して、テンプレートからローカル Azure Functions コード プロジェクトを作成します。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template functions-quickstart-dotnet-azd-timer -e scheduled-dotnet
    

    このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、現在のフォルダー内のプロジェクトが初期化されます。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 環境名は、Azure で作成するリソース グループの名前にも使用されます。

  2. 次のコマンドを実行して、アプリ フォルダーに移動します。

    cd src
    
  3. local.settings.json という名前のファイルを、次の JSON データを含む src フォルダーに作成します。

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
            "TIMER_SCHEDULE": "*/30 * * * * *"
        }
    }
    

    このファイルは、ローカルで実行する場合に必要です。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template functions-quickstart-typescript-azd-timer -e scheduled-ts
    

    このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、現在のフォルダー内のプロジェクトが初期化されます。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 環境名は、Azure で作成するリソース グループの名前にも使用されます。

  2. local.settings.json という名前のファイルを、次の JSON データを含む src フォルダーに作成します。

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node",
            "TIMER_SCHEDULE": "*/30 * * * * *"
        }
    }
    

    このファイルは、ローカルで実行する場合に必要です。

  1. ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の azd init コマンドを実行します。

    azd init --template functions-quickstart-python-azd-timer -e scheduled-py
    

    このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、現在のフォルダー内のプロジェクトが初期化されます。 -e フラグでは、現在の環境の名前が設定されます。 azdでは、環境はアプリの一意のデプロイ コンテキストを維持し、複数を定義できます。 環境名は、Azure で作成するリソース グループの名前にも使用されます。

  2. local.settings.json という名前のファイルを、次の JSON データを含む src フォルダーに作成します。

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "python",
            "TIMER_SCHEDULE": "*/30 * * * * *"
        }
    }
    

    このファイルは、ローカルで実行する場合に必要です。

仮想環境を作成してアクティブにする

ルート フォルダーで、次のコマンドを実行して、.venv という名前の仮想環境を作成してアクティブにします。

python3 -m venv .venv
source .venv/bin/activate

Python で Venv パッケージが Linux ディストリビューションにインストールされない場合は、次のコマンドを実行します。

sudo apt-get install python3-venv

ローカル環境で実行する

  1. ターミナルまたはコマンド プロンプトでアプリ フォルダーから次のコマンドを実行します。

    func start
    
  1. ターミナルまたはコマンド プロンプトでアプリ フォルダーから次のコマンドを実行します。

    npm install
    npm start  
    
  1. Functions ホストは、ローカル プロジェクト フォルダーで起動すると、タイマーによってトリガーされた関数に関する情報をターミナル出力に書き込みます。 Timer によってトリガーされる関数は、コードで定義されているスケジュールに基づいて実行されます。

    既定のスケジュールは */30 * * * * * で、30 秒ごとに実行されます。

  2. 完了したら、ターミナル ウィンドウで Ctrl + C キーを押して、func.exe ホスト プロセスを停止します。

  1. deactivate を実行して仮想環境をシャットダウンします。

コードの確認 (省略可能)

Timer トリガー関数を定義するコードを確認できます。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Timer;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public class timerFunction
    {
        private readonly ILogger _logger;

        public timerFunction(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<timerFunction>();
        }

        [Function("timerFunction")]
        public void Run(
            [TimerTrigger("%TIMER_SCHEDULE%", RunOnStartup = true)] TimerInfo myTimer,
            FunctionContext context
        )
        {
            _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            if (myTimer.IsPastDue)
            {
                _logger.LogWarning("The timer is running late!");
            }
        }
    }
}

完全なテンプレート プロジェクトをこちらで確認できます。

import { app, InvocationContext, Timer } from '@azure/functions';

export async function timerFunction(myTimer: Timer, context: InvocationContext): Promise<void> {
    context.log(`TypeScript Timer trigger function executed at: ${new Date().toISOString()}`);

    if (myTimer.isPastDue) {
        context.warn("The timer is running late!");
    }
}

app.timer('timerFunction', {
    schedule: '%TIMER_SCHEDULE%',
    runOnStartup: true,
    handler: timerFunction
});

完全なテンプレート プロジェクトをこちらで確認できます。

import datetime
import logging

import azure.functions as func

# Create the function app instance
app = func.FunctionApp()

@app.timer_trigger(schedule="%TIMER_SCHEDULE%", 
                   arg_name="mytimer", 
                   run_on_startup=True,
                   use_monitor=False) 
def timer_function(mytimer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.now(datetime.timezone.utc).isoformat()
    
    logging.info(f'Python timer trigger function executed at: {utc_timestamp}')
    
    if mytimer.past_due:
        logging.warning('The timer is running late!')

完全なテンプレート プロジェクトをこちらで確認できます。

関数をローカルで検証したら、Azure に発行します。

Azure にデプロイ

このプロジェクトは、 azd up コマンドを使用して、Azure の Flex Consumption プランの新しい関数アプリにコードをデプロイするように構成されています。

ヒント

このプロジェクトには、ベスト プラクティスに従った Flex 従量課金プランへの安全なデプロイを作成するために azd で使用される Bicep ファイルのセットが含まれています。

  1. 次のコマンドを実行し、azd で必要な Azure リソースを Azure に作成し、コード プロジェクトを新しい関数アプリにデプロイします。

    azd up
    

    ルート フォルダーには、azure.yaml に必要な azd 定義ファイルが含まれています。

    まだサインインしていない場合は、Azure アカウントで認証するように求められます。

  2. プロンプトが表示されたら、次の必須のデプロイ パラメーターを指定します。

    パラメーター Description
    Azure サブスクリプション リソースが作成されるサブスクリプション。
    Azure の場所 新しい Azure リソースを含むリソース グループを作成する Azure リージョン。 現在、Flex 従量課金プランをサポートしているリージョンのみが表示されます。

    azd up コマンドでは、Bicep 構成ファイルでこれらのプロンプトに対する応答を使用して、次のデプロイ タスクを完了します。

    • 次の必要な Azure リソースを作成して構成します (azd provision と同等)。

      • Flex 従量課金プランと関数アプリ
      • Azure Storage (必須) と Application Insights (推奨)
      • アカウントのアクセス ポリシーとロール
      • マネージド ID を使用したサービス間接続 (格納されている接続文字列の代わり)
      • 関数アプリとその他の Azure リソースの両方を安全に実行するための仮想ネットワーク
    • コードをパッケージ化し、デプロイ コンテナーにデプロイします (azd deploy と同等)。 その後、アプリが起動し、デプロイされたパッケージで実行されます。

    コマンドが正常に完了した後、作成したリソースへのリンクが表示されます。

デプロイを検証する

デプロイが完了すると、タイマー トリガー関数は、スケジュールに基づいて Azure での実行を自動的に開始します。

  1. Azure portal で、新しい関数アプリに移動します。

  2. 左側のメニューから [ログ ストリーム ] を選択して、関数の実行をリアルタイムで監視します。

  3. スケジュールに従って実行されている Timer トリガー関数を示すログ エントリが表示されます。

コードを再デプロイする

azd up コマンドを必要な回数実行して、Azure リソースをプロビジョニングし、コード更新プログラムを関数アプリにデプロイします。

デプロイされたコード ファイルは常に最新のデプロイ パッケージによって上書きされます。

azd プロンプトに対する最初の応答と、azd によって生成された環境変数は、名前付き環境にローカルに格納されます。 azd env get-values コマンドを使用して、Azure リソースの作成時に使用された環境内のすべての変数を確認します。

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

関数アプリと関連リソースの操作が完了したら、次のコマンドを使用して関数アプリとその関連リソースを Azure から削除し、それ以上のコストが発生しないようにします。

azd down --no-prompt

--no-prompt オプションは、確認なしでリソース グループを削除するように azd に指示します。

このコマンドは、ローカル コード プロジェクトには影響しません。