Azure Functions의 타이머 트리거

이 문서에서는 Azure Functions에서 타이머 트리거를 사용하는 방법을 설명합니다. 타이머 트리거를 사용하면 일정에 따라 함수를 실행할 수 있습니다.

이는 Azure Functions 개발자에 대한 참조 정보입니다. Azure Functions를 처음 접하는 경우 다음 리소스부터 시작합니다.

타이머 트리거 함수를 수동으로 실행하는 방법에 대한 자세한 내용은 비 HTTP 트리거 함수 수동 실행을 참조하세요.

패키지 - Functions 2.x 이상

타이머 트리거는 Microsoft.Azure.WebJobs.Extensions NuGet 패키지 버전 3.x에서 제공됩니다. 이 패키지에 대한 소스 코드는 azure-webjobs-sdk-extensions GitHub 리포지토리에 있습니다.

이 바인딩에 대한 지원은 모든 개발 환경에서 자동으로 제공됩니다. 패키지를 수동으로 설치하거나 확장을 등록할 필요는 없습니다.

패키지 - Functions 1.x

타이머 트리거는 Microsoft.Azure.WebJobs.Extensions NuGet 패키지 버전 2.x에서 제공됩니다. 이 패키지에 대한 소스 코드는 azure-webjobs-sdk-extensions GitHub 리포지토리에 있습니다.

이 바인딩에 대한 지원은 모든 개발 환경에서 자동으로 제공됩니다. 패키지를 수동으로 설치하거나 확장을 등록할 필요는 없습니다.

예제

다음 예에서는 5로 나눌 수 있는 값을 가질 때마다 실행되는 C# 함수를 보여 줍니다(예: 함수가 18:57:00에 시작되는 경우 다음 성능은 19:00:00이 됨). TimerInfo 개체가 함수에 전달됩니다.

[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}");
}

특성 및 주석

C# 클래스 라이브러리에서 TimerTriggerAttribute 특성을 사용합니다.

특성의 생성자는 CRON 식 또는 TimeSpan을 사용합니다. App Service 계획에서 함수 앱을 실행 중인 경우에만 TimeSpan을 사용할 수 있습니다. TimeSpan은 사용 또는 탄력적 프리미엄 함수에서 지원되지 않습니다.

다음 예제는 CRON 식을 보여줍니다.

[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}");
}

구성

다음 표에서는 function.json 파일 및 TimerTrigger 특성에 설정된 바인딩 구성 속성을 설명합니다.

function.json 속성 특성 속성 Description
type 해당 없음 "timerTrigger"로 설정해야 합니다. 이 속성은 사용자가 Azure Portal에서 트리거를 만들 때 자동으로 설정됩니다.
direction 해당 없음 "in"으로 설정해야 합니다. 이 속성은 사용자가 Azure Portal에서 트리거를 만들 때 자동으로 설정됩니다.
name 해당 없음 함수 코드에서 타이머 개체를 나타내는 변수의 이름입니다.
schedule ScheduleExpression CRON 식 또는 TimeSpan 값입니다. App Service 계획에서 함수 앱을 실행 중인 경우에만 TimeSpan을 사용할 수 있습니다. "%ScheduleAppSetting%" 예제와 같이 앱 설정에서 일정 식을 배치하고 이 속성을 % 기호에서 래핑된 앱 설정 이름으로 설정할 수 있습니다.
runOnStartup RunOnStartup true인 경우 함수는 런타임이 시작될 때 호출됩니다. 예를 들어 비활성으로 인해 유휴 상태로 전환된 후에 함수 앱이 작동될 때 런타임이 시작됩니다. 함수 앱이 함수 변경으로 인해 다시 시작되는 경우 또는 함수 앱이 스케일 아웃하는 경우. 따라서 runOnStartuptrue로 설정하지 않는 것이 좋습니다(특히 프로덕션에서).
useMonitor UseMonitor true 또는 false로 설정하여 일정을 모니터링해야 하는지를 나타냅니다. 일정 모니터링은 일정 발생을 유지하여 함수 앱 인스턴스가 다시 시작하는 경우에도 일정을 올바르게 유지하도록 지원합니다. 명시적으로 설정하지 않는 경우 되풀이 간격이 1분을 넘는 큰 일정에서 기본값은 true입니다. 분당 한 번 넘게 트리거되는 일정에서 기본값은 false입니다.

로컬로 개발하는 경우 앱 설정은 local.settings.json 파일로 이동합니다.

주의

프로덕션 환경에서는 runOnStartuptrue로 설정하지 않는 것이 좋습니다. 이 설정을 사용하면 매우 예측할 수 없는 시간에 코드가 실행됩니다. 특정 프로덕션 환경에서 이러한 추가 실행으로 인해 소비 계획에서 호스팅되는 앱의 비용이 상당히 높아질 수 있습니다. 예를 들어 runOnStartup 을 사용하면 함수 앱의 크기를 조정할 때마다 트리거가 호출됩니다. 프로덕션 환경에서 runOnStartup 을 사용하도록 설정하기 전에 함수의 프로덕션 동작을 완전히 이해했는지 확인하세요.

사용량

타이머 트리거 함수를 호출하면 타이머 개체가 함수에 전달됩니다. 다음 JSON은 타이머 개체의 예제 표현입니다.

{
    "Schedule":{
        "AdjustForDST": true
    },
    "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입니다. 예를 들어 함수 앱을 다시 시작하면 호출이 누락될 수 있습니다.

NCRONTAB 식

Azure Functions는 NCronTab 라이브러리를 사용하여 CRON 식을 해석합니다. NCRONTAB 식은 시간 초 단위의 시간 정밀도들 위해 시작 부분에 추가 여섯 번째 필드를 포함한다는 점을 제외하고는 CRON 식과 비슷합니다.

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

각 필드에는 다음과 같은 형식의 값 중 하나가 포함될 수 있습니다.

Type 예제 트리거될 때
특정 값 0 5 * * * * 매 시간마다 x시 5분에 한 번
모든 값(*) 0 * 5 * * * 5시부터 매 분마다
범위(- 연산자) 5-7 * * * * * 매일 매 시간의 매 분마다 3번(5초, 6초, 7초)
값 집합(, 연산자) 5,8,10 * * * * * 매일 매 시간의 매 분마다 3번(5초, 8초, 10초)
간격 값(/ 연산자) 0 */5 * * * * 매 시간마다 12번, 5분마다 0초에

월 또는 요일을 지정하려면 숫자 값, 이름 또는 이름 약어를 사용할 수 있습니다.

  • 요일의 경우 숫자 값은 0에서 6까지이며 0은 Sunday로 시작합니다.
  • 이름은 영어입니다. 예: Monday, January.
  • 이름은 대/소문자를 구분하지 않습니다.
  • 이름은 축약될 수 있습니다. 약어 길이는 글자 세 개가 좋습니다. 예: Mon, Jan.

NCRONTAB 예

다음은 Azure Functions에서 타이머 트리거를 사용할 수 있는 NCRONTAB 식의 몇 가지 예입니다.

예제 트리거될 때
0 */5 * * * * 5분마다 한 번
0 0 * * * * 1시간이 시작할 때마다 한 번
0 0 */2 * * * 2시간마다 한 번
0 0 9-17 * * * 오전 9시에서 오후 5시까지 1시간마다 한 번
0 30 9 * * * 매일 오전 9시 30분
0 30 9 * * 1-5 평일 오전 9:30
0 30 9 * Jan Mon 1월 매주 월요일 오전 9:30

참고

NCRONTAB 식은 5개 필드6개 필드 형식을 모두 지원합니다. 여섯 번째 필드 위치는 식의 시작 부분에 있는 초의 값입니다.

NCRONTAB 시간대

CRON 식에 있는 숫자는 시간 범위가 아닌 시간 및 날짜를 가리킵니다. 예를 들어 hour 필드에 있는 5는 5시간마다 한 번이 아닌 오전 5시를 가리킵니다.

CRON 식과 함께 사용하는 기본 표준 시간대는 UTC(협정 세계시)입니다. 다른 표준 시간대를 기반으로 하는 CRON 식을 사용하려면 WEBSITE_TIME_ZONE이라는 함수 앱에 대한 앱 설정을 만듭니다.

이 설정의 값은 함수 앱이 실행되는 운영 체제 및 플랜에 따라 다릅니다.

운영 체제 계획
Windows 모두 Windows 명령 tzutil.exe /L에서 제공하는 각 쌍의 두 번째 줄에 지정된 원하는 표준 시간대의 이름으로 값을 설정합니다.
Linux Premium
전용
tz database에 나온 것과 같이 원하는 표준 시간대의 이름으로 값을 설정합니다.

참고

WEBSITE_TIME_ZONE는 Linux 사용 플랜에서 현재 지원되지 않습니다.

예를 들어 미국 동부 표준시(Eastern Standard Time(Windows) 또는 America/New_York(Linux)로 표시)는 현재 표준 시간 동안 UTC-05:00를 사용하고 일광 절약 시간 동안에는 UTC-04:00를 사용합니다. 매일 오전 10시(미국 동부 표준시)에 타이머 트리거를 두려면 WEBSITE_TIME_ZONE이라는 함수 앱에 대한 앱 설정을 만들고, 값을 Eastern Standard Time(Windows) 또는 America/New_York(Linux)로 설정하고, 다음 NCRONTAB 식을 사용합니다.

"0 0 10 * * *"

WEBSITE_TIME_ZONE을 사용하는 경우 일광 절약 시간 및 표준 시간의 변경을 포함하여 특정 시간대의 시간 변경에 따라 조정됩니다.

TimeSpan

App Service 계획에서 함수 앱을 실행 중인 경우에만 TimeSpan을 사용할 수 있습니다.

CRON 식과 다르게 TimeSpan 값은 각 함수 호출 간의 시간 간격을 지정합니다. 함수가 지정된 간격보다 오랫동안 실행한 후에 완료되면 타이머는 즉시 함수를 다시 호출합니다.

hh이 24 미만인 경우 문자열로 표현되는 TimeSpan 형식은 hh:mm:ss입니다. 처음 두 자리가 24 이상인 경우 형식은 dd:hh:mm입니다. 다음은 몇 가지 예입니다.

예제 트리거될 때
"01:00:00" 매시간
"00:01:00" 매분
"25:00:00" 25일마다
"1.00:00:00" 매일

확장

함수 앱이 여러 인스턴스로 확장하는 경우 모든 인스턴스에서 타이머 트리거 함수의 단일 인스턴스만을 실행합니다. 미해결 호출이 아직 실행되고 있는 경우에는 다시 트리거되지 않습니다.

스토리지를 공유하는 함수 앱

App Service에 배포되지 않은 함수 앱에서 스토리지 계정을 공유하는 경우 각 앱에 호스트 ID를 명시적으로 할당해야 할 수 있습니다.

Functions 버전 설정
2.x 이상 AzureFunctionsWebHost__hostid환경 변수
1.x host.jsonid

식별하는 값을 제거하거나 각 함수 앱의 구성을 다른 값으로 수동으로 설정할 수 있습니다.

타이머 트리거는 함수 앱이 여러 인스턴스로 확장되는 경우 스토리지 잠금을 사용하여 하나의 타이머 인스턴스만이 존재하도록 합니다. 두 개의 함수 앱이 동일한 식별하는 구성을 공유하고 각각 타이머 트리거를 사용하는 경우 하나의 타이머만이 실행됩니다.

다시 시도 동작

큐 트리거와 다르게 타이머 트리거는 함수가 실패한 후에 다시 시도하지 않습니다. 함수가 실패한 경우 일정에 따라 다음 시도까지 다시 호출되지 않습니다.

수동으로 타이머 트리거 호출

Azure Functions에 대한 타이머 트리거는 수동으로 함수를 트리거하기 위해 호출할 수 있는 HTTP 웹후크를 제공합니다. 이는 다음과 같은 시나리오에서 매우 유용할 수 있습니다.

  • 통합 테스트
  • 스모크 테스트 또는 워밍업 작업의 일부로 슬롯 교체
  • 데이터베이스의 캐시 또는 조회 테이블을 즉시 채우는 함수의 초기 배포

타이머 트리거 함수를 수동으로 호출하는 방법에 대한 자세한 내용은 비 HTTP 트리거 함수 수동 실행을 참조하세요.

문제 해결

타이머 트리거가 예상대로 작동하지 않는 경우 수행할 작업에 대한 정보는 타이머 트리거 함수가 작동하지 않는 문제 조사 및 보고를 참조하세요.

다음 단계