Azure Functions의 타이머 트리거

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

Azure Functions 개발자를 위한 참조 정보입니다. Azure Functions를 새로 사용하는 경우 다음 리소스로 시작합니다.

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

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

타이머 확장 패키지의 소스 코드는 azure-webjobs-sdk-extensions GitHub 리포지토리에 있습니다.

Important

이 문서에서는 탭을 사용하여 여러 버전의 Node.js 프로그래밍 모델을 지원합니다. v4 모델은 일반적으로 사용 가능하며 JavaScript 및 TypeScript 개발자를 위해 보다 유연하고 직관적인 환경을 제공하도록 설계되었습니다. v4 모델의 작동 방식에 대한 자세한 내용은 Azure Functions Node.js 개발자 가이드를 참조하세요. v3과 v4의 차이점에 대해 자세히 알아보려면 마이그레이션 가이드를 참조하세요.

Azure Functions는 Python에 대해 두 가지 프로그래밍 모델을 지원합니다. 바인딩을 정의하는 방법은 선택한 프로그래밍 모델에 따라 달라집니다.

Python v2 프로그래밍 모델을 사용하면 Python 함수 코드에서 직접 데코레이터를 사용하여 바인딩을 정의할 수 있습니다. 자세한 내용은 Python 개발자 가이드참조하세요.

이 문서에서는 두 프로그래밍 모델을 모두 지원합니다.

예시

이 예제에서는 분이 5로 나눌 수 있는 값을 가질 때마다 실행되는 C# 함수를 보여 줍니다. 예를 들어 함수가 18:55:00에 시작되면 다음 실행은 19:00:00입니다. TimerInfo 개체가 함수에 전달됩니다.

C# 함수는 다음 C# 모드 중 하나를 사용하여 만들 수 있습니다.

  • 격리된 작업자 모델: 런타임에서 격리된 작업자 프로세스에서 실행되는 컴파일된 C# 함수입니다. LTS 및 비 LTS 버전 .NET 및 .NET Framework에서 실행되는 C# 함수를 지원하려면 격리된 작업자 프로세스가 필요합니다. 격리된 작업자 프로세스 함수에 대한 확장은 Microsoft.Azure.Functions.Worker.Extensions.* 네임스페이스를 사용합니다.
  • In Process 모델: Functions 런타임과 동일한 프로세스에서 실행되는 컴파일된 C# 함수입니다. 이 모델의 변형에서는 주로 C# 포털 편집에 지원되는 C# 스크립팅을 사용하여 Functions를 실행할 수 있습니다. In Process 함수에 대한 확장은 Microsoft.Azure.WebJobs.Extensions.* 네임스페이스를 사용합니다.

Important

2026년 11월 10일에 In-process 모델에 대한 지원이 종료됩니다. 모든 지원을 위해 앱을 격리된 작업자 모델로 마이그레이션하는 것이 좋습니다.

//<docsnippet_fixed_delay_retry_example>
[Function(nameof(TimerFunction))]
[FixedDelayRetry(5, "00:00:10")]
public static void Run([TimerTrigger("0 */5 * * * *")] TimerInfo timerInfo,
    FunctionContext context)
{
    var logger = context.GetLogger(nameof(TimerFunction));

다음 예제 함수는 5분 간격으로 트리거되고 실행됩니다. 함수의 주석은 @TimerTrigger CRON 식과 동일한 문자열 형식 을 사용하여 일정을 정의합니다.

@FunctionName("keepAlive")
public void keepAlive(
  @TimerTrigger(name = "keepAliveTrigger", schedule = "0 */5 * * * *") String timerInfo,
      ExecutionContext context
 ) {
     // timeInfo is a JSON string, you can deserialize it to an object using your favorite JSON library
     context.getLogger().info("Timer is triggered: " + timerInfo);
}

다음 예제에서는 타이머를 나타내는 인스턴스가 함수에 전달되는 바인딩을 사용하는 타이머 트리거 바인딩 및 함수 코드를 보여 줍니다. 함수는 누락된 일정으로 인해 이 함수 호출이 발생했는지를 나타내는 로그를 씁니다. 이 예제는 v1 또는 v2 Python 프로그래밍 모델을 사용하는지 여부에 따라 달라집니다.

import datetime
import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="mytimer")
@app.timer_trigger(schedule="0 */5 * * * *", 
              arg_name="mytimer",
              run_on_startup=True) 
def test_function(mytimer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()
    if mytimer.past_due:
        logging.info('The timer is past due!')
    logging.info('Python timer trigger function ran at %s', utc_timestamp)

다음 예에서는 타이머 트리거 TypeScript 함수를 보여 줍니다.

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

export async function timerTrigger1(myTimer: Timer, context: InvocationContext): Promise<void> {
    context.log('Timer function processed request.');
}

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    handler: timerTrigger1,
});

다음 예에서는 타이머 트리거 JavaScript 함수를 보여 줍니다.

const { app } = require('@azure/functions');

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    handler: (myTimer, context) => {
        context.log('Timer function processed request.');
    },
});

function.json 파일의 바인딩 데이터는 다음과 같습니다.

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

다음은 run.ps1 파일의 타이머 함수 코드입니다.

# Input bindings are passed in via param block.
param($myTimer)

# Get the current universal time in the default string format.
$currentUTCtime = (Get-Date).ToUniversalTime()

# The 'IsPastDue' property is 'true' when the current function invocation is later than scheduled.
if ($myTimer.IsPastDue) {
    Write-Host "PowerShell timer is running late!"
}

# Write an information log with the current time.
Write-Host "PowerShell timer trigger function ran! TIME: $currentUTCtime"

특성

In-process C# 라이브러리는 Microsoft.Azure.WebJobs.ExtensionsTimerTriggerAttribute를 사용하는 반면 격리된 작업자 프로세스 C# 라이브러리는 Microsoft.Azure.Functions.Worker.Extensions.TimerTimerTriggerAttribute를 사용하여 함수를 정의합니다. C# 스크립트는 대신 function.json 구성 파일을 사용합니다.

특성 속성 설명
예약 CRON 식 또는 TimeSpan 값입니다. App Service 계획에서 함수 앱을 실행 중인 경우에만 TimeSpan을 사용할 수 있습니다. 일정 식을 앱 설정에 넣고 이 속성을 % 기호로 래핑된 앱 설정 이름으로 설정할 수 있습니다(예: %ScheduleAppSetting%).
RunOnStartup true인 경우 함수는 런타임이 시작될 때 호출됩니다. 예를 들어 비활성으로 인해 유휴 상태로 전환된 후에 함수 앱이 작동될 때 런타임이 시작됩니다. 함수 변경으로 인해 함수 앱이 다시 시작될 때 및 함수 앱이 확장될 때에도 런타임이 시작됩니다. 주의해서 사용합니다.RunOnStartup은 특히 프로덕션 환경에서 true로 설정되는 경우가 거의 없습니다.
UseMonitor true 또는 false로 설정하여 일정을 모니터링해야 하는지를 나타냅니다. 일정 모니터링은 일정 발생을 유지하여 함수 앱 인스턴스가 다시 시작하는 경우에도 일정을 올바르게 유지하도록 지원합니다. 명시적으로 설정하지 않는 경우 되풀이 간격이 1분을 넘는 큰 일정에서 기본값은 true입니다. 분당 한 번 넘게 트리거되는 일정에서 기본값은 false입니다.

데코레이터

Python v2 프로그래밍 모델에만 적용됩니다.

데코레이터를 사용하여 정의된 Python v2 함수의 경우 다음 속성은 schedule다음과 같습니다.

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

function.json 사용하여 정의된 Python 함수는 구성 섹션을 참조하세요.

주석

함수의 @TimerTrigger 주석은 CRON 식과 동일한 문자열 형식을 사용하여 schedule을 정의합니다. 주석은 다음 설정을 지원합니다.

구성

Python v1 프로그래밍 모델에만 적용됩니다.

다음 표에서는 app.timer() 메서드에 전달된 options 개체에 설정할 수 있는 속성에 대해 설명합니다.

속성 설명
schedule CRON 식 또는 TimeSpan 값입니다. App Service 계획에서 함수 앱을 실행 중인 경우에만 TimeSpan을 사용할 수 있습니다. "%ScheduleAppSetting%" 예제와 같이 앱 설정에서 일정 식을 배치하고 이 속성을 % 기호에서 래핑된 앱 설정 이름으로 설정할 수 있습니다.
runOnStartup true인 경우 함수는 런타임이 시작될 때 호출됩니다. 예를 들어 비활성으로 인해 유휴 상태로 전환된 후에 함수 앱이 작동될 때 런타임이 시작됩니다. 함수 변경으로 인해 함수 앱이 다시 시작될 때 및 함수 앱이 확장될 때에도 런타임이 시작됩니다. 주의해서 사용합니다.runOnStartup은 특히 프로덕션 환경에서 true로 설정되는 경우가 거의 없습니다.
useMonitor true 또는 false로 설정하여 일정을 모니터링해야 하는지를 나타냅니다. 일정 모니터링은 일정 발생을 유지하여 함수 앱 인스턴스가 다시 시작하는 경우에도 일정을 올바르게 유지하도록 지원합니다. 명시적으로 설정하지 않는 경우 되풀이 간격이 1분을 넘는 큰 일정에서 기본값은 true입니다. 분당 한 번 넘게 트리거되는 일정에서 기본값은 false입니다.

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

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

로컬에서 개발하는 경우 Values 컬렉션의 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
}
{
    "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 * * * * 매시간 5분마다 한 번씩
모든 값(*) 0 * 5 * * * 5시간 동안 매분마다
범위(- 연산자) 5-7 * * * * * 분당 3회 - 매일 매시간 1분마다 초 5~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 * * * 1시간마다 오전 9시부터 오후 5시까지
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:00을 참조합니다.

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

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

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

참고 항목

WEBSITE_TIME_ZONETZ는 현재, 소비 플랜의 Linux에서 실행하는 것이 지원되지 않습니다. 이 경우 WEBSITE_TIME_ZONE 또는 TZ를 설정하면 SSL 관련 문제가 생성되고 메트릭이 앱에 대해 작동하지 않을 수 있습니다.

예를 들어 미국 동부 표준시(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 각 함수 호출 사이의 시간 간격을 지정합니다. 지정된 간격보다 오래 실행한 후 함수가 완료되면 타이머는 즉시 함수를 다시 호출합니다.

문자열 TimeSpan 로 표현되는 형식은 24보다 작은 경우 hh 입니다hh:mm:ss. 처음 두 자리가 24 이상인 경우 형식은 dd:hh:mm입니다. 다음 몇 가지 예를 참조하세요.

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

확장

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

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

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

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

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

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

다시 시도 동작

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

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

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

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

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

문제 해결

타이머 트리거가 예상대로 작동하지 않을 때 수행할 작업에 대한 자세한 내용은 타이머 트리거 함수가 실행되지 않는 문제를 조사하고 보고하는 방법을 참조하세요.

다음 단계