Azure Functions のタイマー トリガーTimer trigger for Azure Functions

この記事では、Azure Functions でタイマー トリガーを使用する方法について説明します。This article explains how to work with timer triggers in Azure Functions. タイマー トリガーを使用すると、スケジュールに基づいて関数を実行できます。A timer trigger lets you run a function on a schedule.

これは、Azure Functions の開発者向けリファレンス情報です。This is reference information for Azure Functions developers. Azure Functions を初めて使用する場合は、先に次のリソースを参照してください。If you're new to Azure Functions, start with the following resources:

パッケージ - Functions 1.xPackages - Functions 1.x

タイマー トリガーは、Microsoft.Azure.WebJobs.Extensions NuGet パッケージ、バージョン 2.x で提供されます。The timer trigger is provided in the Microsoft.Azure.WebJobs.Extensions NuGet package, version 2.x. パッケージのソース コードは、azure-webjobs-sdk-extensions GitHub リポジトリにあります。Source code for the package is in the azure-webjobs-sdk-extensions GitHub repository.

このバインドのサポートは、すべての開発環境で自動的に提供されます。Support for this binding is automatically provided in all development environments. 手動でパッケージをインストールしたり、拡張機能を登録したりする必要はありません。You don't have to manually install the package or register the extension.

パッケージ - Functions 2.xPackages - Functions 2.x

タイマー トリガーは、Microsoft.Azure.WebJobs.Extensions NuGet パッケージ、バージョン 3.x で提供されます。The timer trigger is provided in the Microsoft.Azure.WebJobs.Extensions NuGet package, version 3.x. パッケージのソース コードは、azure-webjobs-sdk-extensions GitHub リポジトリにあります。Source code for the package is in the azure-webjobs-sdk-extensions GitHub repository.

このバインドのサポートは、すべての開発環境で自動的に提供されます。Support for this binding is automatically provided in all development environments. 手動でパッケージをインストールしたり、拡張機能を登録したりする必要はありません。You don't have to manually install the package or register the extension.

Example

言語固有の例をご覧ください。See the language-specific example:

C# の例C# example

次の例は、5 分ごとに実行される C# 関数を示しています。The following example shows a C# function that runs every five minutes:

[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, TraceWriter log)
{
    if(myTimer.IsPastDue)
    {
        log.Info("Timer is running late!");
    }
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
}

C# スクリプトの例C# script example

次の例は、function.json ファイルのタイマー トリガー バインドと、そのバインドが使用される C# スクリプト関数を示しています。The following example shows a timer trigger binding in a function.json file and a C# script function that uses the binding. この関数では、この関数呼び出しがスケジュールのミスの発生によるものかどうかを示すログが書き込まれます。The function writes a log indicating whether this function invocation is due to a missed schedule occurrence.

function.json ファイルのバインディング データを次に示します。Here's the binding data in the function.json file:

{
    "schedule": "0 */5 * * * *",
    "name": "myTimer",
    "type": "timerTrigger",
    "direction": "in"
}

C# スクリプト コードを次に示します。Here's the C# script code:

public static void Run(TimerInfo myTimer, TraceWriter log)
{
    if(myTimer.IsPastDue)
    {
        log.Info("Timer is running late!");
    }
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}" );  
}

F# の例F# example

次の例は、function.json ファイルのタイマー トリガー バインドと、そのバインドが使われる F# スクリプト関数を示しています。The following example shows a timer trigger binding in a function.json file and an F# script function that uses the binding. この関数では、この関数呼び出しがスケジュールのミスの発生によるものかどうかを示すログが書き込まれます。The function writes a log indicating whether this function invocation is due to a missed schedule occurrence.

function.json ファイルのバインディング データを次に示します。Here's the binding data in the function.json file:

{
    "schedule": "0 */5 * * * *",
    "name": "myTimer",
    "type": "timerTrigger",
    "direction": "in"
}

F# スクリプト コードを次に示します。Here's the F# script code:

let Run(myTimer: TimerInfo, log: TraceWriter ) =
    if (myTimer.IsPastDue) then
        log.Info("F# function is running late.")
    let now = DateTime.Now.ToLongTimeString()
    log.Info(sprintf "F# function executed at %s!" now)

JavaScript の例JavaScript example

次の例は、function.json ファイルのタイマー トリガー バインドと、そのバインドが使用される JavaScript 関数を示しています。The following example shows a timer trigger binding in a function.json file and a JavaScript function that uses the binding. この関数では、この関数呼び出しがスケジュールのミスの発生によるものかどうかを示すログが書き込まれます。The function writes a log indicating whether this function invocation is due to a missed schedule occurrence.

function.json ファイルのバインディング データを次に示します。Here's the binding data in the function.json file:

{
    "schedule": "0 */5 * * * *",
    "name": "myTimer",
    "type": "timerTrigger",
    "direction": "in"
}

JavaScript スクリプト コードを次に示します。Here's the JavaScript script code:

module.exports = function (context, myTimer) {
    var timeStamp = new Date().toISOString();

    if(myTimer.isPastDue)
    {
        context.log('Node.js is running late!');
    }
    context.log('Node.js timer trigger function ran!', timeStamp);   

    context.done();
};

属性Attributes

C# クラス ライブラリでは、TimerTriggerAttributeを使用します。In C# class libraries, use the TimerTriggerAttribute.

属性のコンストラクターは、CRON 式または TimeSpan を受け取ります。The attribute's constructor takes a CRON expression or a TimeSpan. TimeSpan は、関数アプリが App Service プランで実行している場合にのみ使うことができます。You can use TimeSpan only if the function app is running on an App Service plan. 次の例では CRON 式を示します。The following example shows a CRON expression:

[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, TraceWriter log)
{
    if (myTimer.IsPastDue)
    {
        log.Info("Timer is running late!");
    }
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
}

構成Configuration

次の表は、function.json ファイルと TimerTrigger 属性で設定したバインド構成のプロパティを説明しています。The following table explains the binding configuration properties that you set in the function.json file and the TimerTrigger attribute.

function.json のプロパティfunction.json property 属性のプロパティAttribute property 説明Description
typetype 該当なしn/a "timerTrigger" に設定する必要があります。Must be set to "timerTrigger". このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。This property is set automatically when you create the trigger in the Azure portal.
directiondirection 該当なしn/a "in" に設定する必要があります。Must be set to "in". このプロパティは、Azure Portal でトリガーを作成するときに自動で設定されます。This property is set automatically when you create the trigger in the Azure portal.
namename 該当なしn/a 関数コード内のタイマー オブジェクトを表す変数の名前。The name of the variable that represents the timer object in function code.
scheduleschedule ScheduleExpressionScheduleExpression CRON 式または TimeSpan 値。A CRON expression or a TimeSpan value. TimeSpan は、App Service プランで実行している関数アプリに対してのみ使うことができます。A TimeSpan can be used only for a function app that runs on an App Service Plan. スケジュール式をアプリ設定に含めて、たとえば "%ScheduleAppSetting%" のように、% 記号で囲まれたアプリ設定名にこのプロパティを設定できます。You can put the schedule expression in an app setting and set this property to the app setting name wrapped in % signs, as in this example: "%ScheduleAppSetting%".
runOnStartuprunOnStartup runOnStartupRunOnStartup true の場合、関数はランタイムの開始時に呼び出されます。If true, the function is invoked when the runtime starts. たとえば、ランタイムが開始するのは、関数アプリが非アクティブになってアイドル状態に移行した後で起動したとき、For example, the runtime starts when the function app wakes up after going idle due to inactivity. 関数が変化したために関数アプリが再起動するとき、関数アプリがスケールアウトするときなどです。したがって、予期しない時にコードが実行される可能性が高くなるので、runOnStartuptrue に設定することはほとんどありません。when the function app restarts due to function changes, and when the function app scales out. So runOnStartup should rarely if ever be set to true, as it will make code execute at highly unpredictable times.
useMonitoruseMonitor UseMonitorUseMonitor true または false に設定し、スケジュールを監視する必要があるかどうかを示します。Set to true or false to indicate whether the schedule should be monitored. スケジュールの監視はスケジュールの発生を維持し、関数アプリのインスタンスが再起動するときでもスケジュールが正しく維持されることを保証するのに役立ちます。Schedule monitoring persists schedule occurrences to aid in ensuring the schedule is maintained correctly even when function app instances restart. このプロパティを明示的に設定しない場合、繰り返し間隔が 1 分より長いスケジュールの既定値は true です。If not set explicitly, the default is true for schedules that have a recurrence interval greater than 1 minute. 1 分間に 2 回以上トリガーするスケジュールの既定値は false です。For schedules that trigger more than once per minute, the default is false.

ローカルで開発している場合、アプリ設定は local.settings.json ファイルに保存されます。When you're developing locally, app settings go into the local.settings.json file.

使用法Usage

タイマー トリガー関数が呼び出されると、タイマー オブジェクトが関数に渡されます。When a timer trigger function is invoked, the timer object is passed into the function. 次の JSON は、タイマー オブジェクトの 1 つの表現例です。The following JSON is an example representation of the timer object.

{
    "Schedule":{
    },
    "ScheduleStatus": {
        "Last":"2016-10-04T10:15:00+00:00",
        "LastUpdated":"2016-10-04T10:16:00+00:00",
        "Next":"2016-10-04T10:20:00+00:00"
    },
    "IsPastDue":false
}

現在の関数の呼び出しがスケジュールより遅い場合、IsPastDue プロパティは true になります。The IsPastDue property is true when the current function invocation is later than scheduled. たとえば、関数アプリが再起動すると、呼び出しが行われない可能性があります。For example, a function app restart might cause an invocation to be missed.

CRON 式CRON expressions

Azure Functions では、CRON 式を解釈するのに NCronTab ライブラリが使用されます。Azure Functions uses the NCronTab library to interpret CRON expressions. CRON 式には、次の 6 つのフィールドが含まれます。A CRON expression includes six fields:

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

各フィールドは、次の種類の値のいずれかを持つことができます。Each field can have one of the following types of values:

TypeType Example トリガーのタイミングWhen triggered
特定の値A specific value "0 5 * * * *""0 5 * * * *" hh:05:00。hh は毎時です (1 時間に 1 回)at hh:05:00 where hh is every hour (once an hour)
すべての値 (*)All values (*) "0 * 5 * * *""0 * 5 * * *" 毎日 5:mm:00。mm はその時間の毎分です (1 日に 60 回)at 5:mm:00 every day, where mm is every minute of the hour (60 times a day)
範囲 (- 演算子)A range (- operator) "5-7 * * * * *""5-7 * * * * *" hh:mm:05、hh:mm:06、hh:mm:07。hh:mm は毎時の毎分です (1 分間に 3 回)at hh:mm:05,hh:mm:06, and hh:mm:07 where hh:mm is every minute of every hour (3 times a minute)
値のセット (, 演算子)A set of values (, operator) "5,8,10 * * * * *""5,8,10 * * * * *" hh:mm:05、hh:mm:08、hh:mm:10。hh:mm は毎時の毎分です (1 分間に 3 回)at hh:mm:05,hh:mm:08, and hh:mm:10 where hh:mm is every minute of every hour (3 times a minute)
間隔値 (/ 演算子)An interval value (/ operator) "0 */5 * * * *""0 */5 * * * *" hh:05:00、hh:10:00、hh:15:00、... hh:55:00 まで。hh は毎時です (1 時間に 12 回)at hh:05:00, hh:10:00, hh:15:00, and so on through hh:55:00 where hh is every hour (12 times an hour)

月や曜日を指定するには、数値、名前、または名前の省略形を使用できます。To specify months or days you can use numeric values, names, or abbreviations of names:

  • 曜日については、数値は 0 から 6 で指定します (0 は日曜日です)。For days, the numeric values are 0 to 6 where 0 starts with Sunday.
  • 名前は英語で指定します。Names are in English. 例: Monday, JanuaryFor example: Monday, January.
  • 名前の大文字と小文字は区別されません。Names are case-insensitive.
  • 名前は省略形でも指定できます。Names can be abbreviated. 省略形は 3 文字にすることをお勧めします。Three letters is the recommended abbreviation length. 例: Mon, JanFor example: Mon, Jan.

CRON の例CRON examples

Azure Functions のタイマー トリガーに使用できる CRON 式の例をいくつか示します。Here are some examples of CRON expressions you can use for the timer trigger in Azure Functions.

Example トリガーのタイミングWhen triggered
"0 */5 * * * *" 5 分ごとに 1 回once every five minutes
"0 0 * * * *" 毎正時に 1 回once at the top of every hour
"0 0 */2 * * *" 2 時間に 1 回once every two hours
"0 0 9-17 * * *" 午前 9 時から午後 5 時ま、1 時間に 1 回once every hour from 9 AM to 5 PM
"0 30 9 * * *" 毎日午前 9 時 30 分at 9:30 AM every day
"0 30 9 * * 1-5" 平日の毎日午前 9 時 30 分at 9:30 AM every weekday
"0 30 9 * Jan Mon" 1 月の毎週月曜日の午前 9時 30分at 9:30 AM every Monday in January

注意

CRON 式の例はオンラインで見つかりますが、その多くでは {second} フィールドが省略されています。You can find CRON expression examples online, but many of them omit the {second} field. それらのいずれかをコピーして、欠けている {second} フィールドを追加します。If you copy from one of them, add the missing {second} field. 通常、そのフィールドにはアスタリスクではなく 0 を設定します。Usually you'll want a zero in that field, not an asterisk.

CRON のタイム ゾーンCRON time zones

CRON 式に出現する値は、時間間隔ではなく時刻と日付を示します。The numbers in a CRON expression refer to a time and date, not a time span. たとえば、hour フィールドの 5 は、5 時間ごとではなく、午前 5 時 00 分を示します。For example, a 5 in the hour field refers to 5:00 AM, not every 5 hours.

CRON 式で使用する既定のタイム ゾーンは、協定世界時 (UTC) です。The default time zone used with the CRON expressions is Coordinated Universal Time (UTC). 別のタイム ゾーンに基づく CRON 式を使うには、Function App 用に WEBSITE_TIME_ZONE という名前のアプリ設定を作成します。To have your CRON expression based on another time zone, create an app setting for your function app named WEBSITE_TIME_ZONE. この値を、Microsoft のタイム ゾーン インデックスに関するページに示されている目的のタイム ゾーンの名前に設定します。Set the value to the name of the desired time zone as shown in the Microsoft Time Zone Index.

たとえば、"東部標準時" は UTC-05:00 です。For example, Eastern Standard Time is UTC-05:00. タイマー トリガーが毎日東部標準時の 10:00 AM に発生するように設定するには、UTC タイム ゾーンを考慮した次の CRON 式を使用できます。To have your timer trigger fire at 10:00 AM EST every day, use the following CRON expression that accounts for UTC time zone:

"schedule": "0 0 15 * * *"

または、Function App のアプリ設定を WEBSITE_TIME_ZONE という名前で作成し、その値を "東部標準時" に設定します。Or create an app setting for your function app named WEBSITE_TIME_ZONE and set the value to Eastern Standard Time. そして、次の CRON 式を使います。Then uses the following CRON expression:

"schedule": "0 0 10 * * *"

timespanTimeSpan

TimeSpan は、App Service プランで実行している関数アプリに対してのみ使うことができます。A TimeSpan can be used only for a function app that runs on an App Service Plan.

CRON 式とは異なり、TimeSpan の値は各関数呼び出しの間の時間間隔を指定します。Unlike a CRON expression, a TimeSpan value specifies the time interval between each function invocation. 指定された間隔より長く実行した後で関数が完了すると、タイマーすぐに関数を再び呼び出します。When a function completes after running longer than the specified interval, the timer immediately invokes the function again.

TimeSpan は文字列として表され、hh が 24 未満のときの形式は hh:mm:ss です。Expressed as a string, the TimeSpan format is hh:mm:ss when hh is less than 24. 最初の 2 つの数字が 24 以上のときの形式は dd:hh:mm です。When the first two digits are 24 or greater, the format is dd:hh:mm. 次に例をいくつか示します。Here are some examples:

Example トリガーのタイミングWhen triggered
"01:00:00""01:00:00" 1 時間ごとevery hour
"00:01:00""00:01:00" 1 分ごとevery minute
"24:00:00""24:00:00" 24 日ごとevery 24 days

スケールアウトScale-out

関数アプリが複数のインスタンスにスケールアウトする場合は、タイマーによってトリガーされる関数の 1 つのインスタンスだけがすべてのインスタンスで実行されます。If a function app scales out to multiple instances, only a single instance of a timer-triggered function is run across all instances.

ストレージを共有する関数アプリFunction apps sharing Storage

ストレージ アカウントを複数の関数アプリで共有している場合は、各関数アプリの host.jsonid がそれぞれ異なることを確認してください。If you share a Storage account across multiple function apps, make sure that each function app has a different id in host.json. id プロパティは省略することができます。または、各関数アプリの id を手動でそれぞれ異なる値に設定することもできます。You can omit the id property or manually set each function app's id to a different value. 1 つの関数アプリが複数のインスタンスにスケール アウトする場合、タイマー インスタンスが 1 しか存在しないようにするために、タイマー トリガーではストレージ ロックが使用されます。The timer trigger uses a storage lock to ensure that there will be only one timer instance when a function app scales out to multiple instances. 2 つの関数アプリが同じ id を共有していて、それぞれタイマー トリガーを使用している場合は、1 つのタイマーのみが実行されます。If two function apps share the same id and each uses a timer trigger, only one timer will run.

再試行の動作Retry behavior

キュー トリガーとは異なり、タイマー トリガーは関数が失敗した後で再試行しません。Unlike the queue trigger, the timer trigger doesn't retry after a function fails. 失敗した関数は、次のスケジュール時刻まで再び呼び出されることはありません。When a function fails, it isn't called again until the next time on the schedule.

トラブルシューティングTroubleshooting

タイマー トリガーが期待どおりに機能しない場合の対処方法については、タイマー トリガーが設定された関数が発生しない問題の調査と報告に関するページを参照してください。For information about what to do when the timer trigger doesn't work as expected, see Investigating and reporting issues with timer triggered functions not firing.

次の手順Next steps