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:

타이머 트리거 함수를 수동으로 실행 하는 방법에 대 한 자세한 내용은 비 HTTP 트리거 함수 수동 실행을 참조 하세요.For information on how to manually run a timer-triggered function, see Manually run a non HTTP-triggered function.

패키지 - 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.

패키지-함수 2.x 이상Packages - Functions 2.x and higher

타이머 트리거는 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

다음 예제에서는 분이 5로 나눌 때마다 실행 되는 c # 함수 를 보여 줍니다 (예: 함수가 18:57:00에서 시작 하는 경우 다음 성능은 19:00:00에 있습니다).The following example shows a C# function that is executed each time the minutes have a value divisible by five (eg if the function starts at 18:57:00, the next performance will be at 19:00:00). TimerInfo개체는 함수에 전달 됩니다.The TimerInfo object is passed into the function.

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

특성 및 주석Attributes and annotations

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. TimeSpan는 소비 또는 탄력적 프리미엄 함수에서 지원 되지 않습니다.TimeSpan is not supported for Consumption or Elastic Premium Functions.

다음 예제는 CRON 식을 보여줍니다.The following example shows a CRON expression:

[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
{
    if (myTimer.IsPastDue)
    {
        log.LogInformation("Timer is running late!");
    }
    log.LogInformation($"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 DescriptionDescription
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.
일정과schedule ScheduleExpressionScheduleExpression CRON 식 또는 TimeSpan 값입니다.A CRON expression or a TimeSpan value. App Service 계획에서 함수 앱을 실행 중인 경우에만 TimeSpan을 사용할 수 있습니다.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. 함수 앱이 함수 변경으로 인해 다시 시작 되 고 함수 앱이 확장 될 때 따라서 Runonstartup 은 특히 프로덕션에서로 설정 하는 경우 거의 없습니다 true .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, especially in production.
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. 명시적으로 설정 하지 않은 경우 true 되풀이 간격이 1 분 보다 크거나 같은 일정의 경우 기본값은입니다.If not set explicitly, the default is true for schedules that have a recurrence interval greater than or equal to 1 minute. 분당 한 번 넘게 트리거되는 일정에서 기본값은 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.

주의

프로덕션 환경에서는 runOnStartuptrue로 설정하지 않는 것이 좋습니다.We recommend against setting runOnStartup to true in production. 이 설정을 사용하면 매우 예측할 수 없는 시간에 코드가 실행됩니다.Using this setting makes code execute at highly unpredictable times. 특정 프로덕션 환경에서 이러한 추가 실행으로 인해 소비 계획에서 호스팅되는 앱의 비용이 상당히 높아질 수 있습니다.In certain production settings, these extra executions can result in significantly higher costs for apps hosted in Consumption plans. 예를 들어 Runonstartup 을 사용 하도록 설정 하면 함수 앱이 확장 될 때마다 트리거가 호출 됩니다.For example, with runOnStartup enabled the trigger is invoked whenever your function app is scaled. 프로덕션 환경에서 runOnStartup을 사용하도록 설정하기 전에 함수의 프로덕션 동작을 완전히 이해했는지 확인하세요.Make sure you fully understand the production behavior of your functions before enabling runOnStartup in production.

사용Usage

타이머 트리거 함수를 호출 하면 timer 개체가 함수에 전달 됩니다.When a timer trigger function is invoked, a timer object is passed into the function. 다음 JSON은 타이머 개체의 예제 표현입니다.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.

NCRONTAB 식NCRONTAB expressions

Azure Functions NCronTab 라이브러리를 사용 하 여 NCronTab 식을 해석 합니다.Azure Functions uses the NCronTab library to interpret NCRONTAB expressions. NCRONTAB 식은 시간 전체 자릿수 (초)에 사용할 시작 부분에 추가 여섯 번째 필드를 포함 한다는 점을 제외 하 고는 CRON 식과 비슷합니다.An NCRONTAB expression is similar to a CRON expression except that it includes an additional sixth field at the beginning to use for time precision in seconds:

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

각 필드에는 다음과 같은 형식의 값 중 하나가 포함될 수 있습니다.Each field can have one of the following types of values:

형식Type 예제Example 트리거될 때When triggered
특정 값A specific value "0 5 * * * *""0 5 * * * *" hh:05:00에서 hh는 매시간임(시간당 한 번)at hh:05:00 where hh is every hour (once an hour)
모든 값(*)All values (*) "0 * 5 * * *""0 * 5 * * *" 5:mm:00에서 mm은 해당 시간의 매분임(하루 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은 매시간의 매분임(분당 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은 매시간의 매분임(분당 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: 00:00, hh: 05:00, hh: 10:00, hh: 55:00, hh는 매시간 (12 번 a 시간)at hh:00:00, hh:05:00, hh:10: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은 Sunday로 시작합니다.For days, the numeric values are 0 to 6 where 0 starts with Sunday.
  • 이름은 영어입니다.Names are in English. 예: Monday, January.For example: Monday, January.
  • 이름은 대/소문자를 구분하지 않습니다.Names are case-insensitive.
  • 이름은 축약될 수 있습니다.Names can be abbreviated. 약어 길이는 글자 세 개가 좋습니다.Three letters is the recommended abbreviation length. 예: Mon, Jan.For example: Mon, Jan.

NCRONTAB 예제NCRONTAB examples

Azure Functions에서 타이머 트리거에 사용할 수 있는 NCRONTAB 식의 몇 가지 예는 다음과 같습니다.Here are some examples of NCRONTAB expressions you can use for the timer trigger in Azure Functions.

예제Example 트리거될 때When triggered
"0 */5 * * * *" 5분마다 한 번once every five minutes
"0 0 * * * *" 1시간이 시작할 때마다 한 번once at the top of every hour
"0 0 */2 * * *" 2시간마다 한 번once every two hours
"0 0 9-17 * * *" 오전 9시에서 오후 5시까지 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:30at 9:30 AM every weekday
"0 30 9 * Jan Mon" 1월 매주 월요일 오전 9:30at 9:30 AM every Monday in January

NCRONTAB 표준 시간대NCRONTAB time zones

CRON 식에 있는 숫자는 시간 범위가 아닌 시간 및 날짜를 가리킵니다.The numbers in a CRON expression refer to a time and date, not a time span. 예를 들어 hour 필드에 있는 5는 5시간마다 한 번이 아닌 오전 5시를 가리킵니다.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 식을 사용하려면 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.

이 설정의 값은 함수 앱이 실행 되는 운영 체제 및 계획에 따라 다릅니다.The value of this setting depends on the operating system and plan on which your function app runs.

운영 체제Operating system 계획Plan Value
WindowsWindows 모두All [Microsoft 표준 시간대 인덱스] ()에 표시 된 대로 값을 원하는 표준 시간대의 이름으로 설정 https://docs.microsoft.com/previous-versions/windows/it-pro/windows-vista/cc749073(v=ws.10) 합니다.Set the value to the name of the desired time zone as shown in the [Microsoft Time Zone Index](https://docs.microsoft.com/previous-versions/windows/it-pro/windows-vista/cc749073(v=ws.10).
LinuxLinux 프리미엄Premium
전용Dedicated
Tz 데이터베이스에 표시 된 대로 값을 원하는 표준 시간대의 이름으로 설정 합니다.Set the value to the name of the desired time zone as shown in the tz database.

참고

WEBSITE_TIME_ZONE는 Linux 소비 계획에서 현재 지원 되지 않습니다.WEBSITE_TIME_ZONE is not currently supported on the Linux Consumption plan.

예를 들어 동부 표준시 (Windows) 또는 아메리카/New_York (Linux)는 UTC-05:00입니다.For example, Eastern Standard Time (Windows) or America/New_York (Linux) is UTC-05:00. 매일 오전 10:00 시에 타이머 트리거가 발생 하도록 하려면 UTC 표준 시간대에 대 한 계정을 나타내는 다음 NCRONTAB 식을 사용 합니다.To have your timer trigger fire at 10:00 AM EST every day, use the following NCRONTAB expression that accounts for UTC time zone:

"0 0 15 * * *"

또는 이라는 함수 앱에 대 한 앱 설정을 만들고 WEBSITE_TIME_ZONE , 값을 Eastern Standard Time (Windows) 또는 America/New_York (Linux)로 설정한 후 다음 NCRONTAB 식을 사용 합니다.Or create an app setting for your function app named WEBSITE_TIME_ZONE, set the value to Eastern Standard Time (Windows) or America/New_York (Linux), and then use the following NCRONTAB expression:

"0 0 10 * * *"

WEBSITE_TIME_ZONE을 사용하는 경우 일광 절약 시간제와 같은 특정 표준 시간대에서 시간 변경에 대해 시간이 조정됩니다.When you use WEBSITE_TIME_ZONE, the time is adjusted for time changes in the specific timezone, such as daylight savings time.

TimeSpanTimeSpan

App Service 계획에서 함수 앱을 실행 중인 경우에만 TimeSpan을 사용할 수 있습니다.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.

hh이 24 미만인 경우 문자열로 표현되는 TimeSpan 형식은 hh:mm:ss입니다.Expressed as a string, the TimeSpan format is hh:mm:ss when hh is less than 24. 처음 두 자리가 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" 매시간every hour
"00:01:00""00:01:00" 매분every minute
"24:00:00""24:00:00" 매일every 24 days
"1.00:00:00""1.00:00:00" 매일every day

확장Scale-out

함수 앱이 여러 인스턴스로 확장하는 경우 모든 인스턴스에서 타이머 트리거 함수의 단일 인스턴스만을 실행합니다.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

App service에 배포 되지 않은 함수 앱에서 저장소 계정을 공유 하는 경우 각 앱에 호스트 ID를 명시적으로 할당 해야 할 수 있습니다.If you are sharing storage accounts across function apps that are not deployed to app service, you might need to explicitly assign host ID to each app.

Functions 버전Functions version 설정Setting
2.x 이상2.x (and higher) AzureFunctionsWebHost__hostid환경 변수AzureFunctionsWebHost__hostid environment variable
1.x1.x idhost.jsid in host.json

식별 값을 생략 하거나 각 함수 앱의 식별 구성을 다른 값으로 수동으로 설정할 수 있습니다.You can omit the identifying value or manually set each function app's identifying configuration to a different value.

타이머 트리거는 저장소 잠금을 사용 하 여 함수 앱이 여러 인스턴스로 확장 될 때 하나의 타이머 인스턴스만 있는지 확인 합니다.The timer trigger uses a storage lock to ensure that there is only one timer instance when a function app scales out to multiple instances. 두 함수 앱이 동일한 식별 구성을 공유 하 고 각각 타이머 트리거를 사용 하는 경우 하나의 타이머만 실행 됩니다.If two function apps share the same identifying configuration and each uses a timer trigger, only one timer runs.

다시 시도 동작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