이 문서에서는 Azure Developer CLI(azd)를 사용하여 Azure Functions에서 예약된 작업을 실행하는 타이머 트리거 함수를 만듭니다. 코드를 로컬로 확인한 후 Azure Functions의 Flex Consumption 계획에서 실행하는 새 서버리스 함수 앱에 배포합니다.
프로젝트 원본은 함수 앱 및 관련 리소스를 만들고 Azure에 코드를 배포하는 데 사용합니다 azd . 이 배포는 안전하고 확장성 있는 Azure Functions 배포에 대한 최신 모범 사례를 따릅니다.
기본적으로 Flex Consumption 계획은 사용량 기준 청구 모델을 따릅니다. 즉, 이 문서를 완료할 때 Azure 계정에서 몇 USD 센트 이하의 비용만 발생합니다.
중요합니다
예약된 작업 실행은 모든 언어에서 지원되지만 이 빠른 시작 시나리오에는 현재 C#, Python 및 TypeScript에 대한 예제만 있습니다. 이 빠른 시작을 완료하려면 문서 맨 위에서 지원되는 언어 중 하나를 선택합니다.
필수 조건
- Node.js 22 이상
활성 구독이 있는 Azure 계정. 무료로 계정을 만듭니다.
프로젝트 시작
이 azd init 명령을 사용하여 템플릿에서 로컬 Azure Functions 코드 프로젝트를 만듭니다.
로컬 터미널이나 명령 프롬프트에서 빈 폴더에서 이
azd init명령을 실행합니다.azd init --template functions-quickstart-dotnet-azd-timer -e scheduled-dotnet이 명령은 템플릿 리포지토리에서 프로젝트 파일을 끌어와 현재 폴더에서 프로젝트를 초기화합니다.
-e플래그는 현재 환경의 이름을 설정합니다. 환경에서azd는 앱에 대한 고유한 배포 컨텍스트를 유지 관리하며 둘 이상을 정의할 수 있습니다. 환경 이름은 Azure에서 만든 리소스 그룹의 이름에도 사용됩니다.다음 명령을 실행하여 앱 폴더로 이동합니다.
cd src폴더에 이 JSON 데이터가 포함된
src이라는 이름의 파일을 만듭니다.{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "TIMER_SCHEDULE": "*/30 * * * * *" } }이 파일은 로컬에서 실행할 때 필요합니다.
로컬 터미널이나 명령 프롬프트에서 빈 폴더에서 이
azd init명령을 실행합니다.azd init --template functions-quickstart-typescript-azd-timer -e scheduled-ts이 명령은 템플릿 리포지토리에서 프로젝트 파일을 끌어와 현재 폴더에서 프로젝트를 초기화합니다.
-e플래그는 현재 환경의 이름을 설정합니다. 환경에서azd는 앱에 대한 고유한 배포 컨텍스트를 유지 관리하며 둘 이상을 정의할 수 있습니다. 환경 이름은 Azure에서 만든 리소스 그룹의 이름에도 사용됩니다.폴더에 이 JSON 데이터가 포함된
src이라는 이름의 파일을 만듭니다.{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node", "TIMER_SCHEDULE": "*/30 * * * * *" } }이 파일은 로컬에서 실행할 때 필요합니다.
로컬 터미널이나 명령 프롬프트에서 빈 폴더에서 이
azd init명령을 실행합니다.azd init --template functions-quickstart-python-azd-timer -e scheduled-py이 명령은 템플릿 리포지토리에서 프로젝트 파일을 끌어와 현재 폴더에서 프로젝트를 초기화합니다.
-e플래그는 현재 환경의 이름을 설정합니다. 환경에서azd는 앱에 대한 고유한 배포 컨텍스트를 유지 관리하며 둘 이상을 정의할 수 있습니다. 환경 이름은 Azure에서 만든 리소스 그룹의 이름에도 사용됩니다.폴더에 이 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에서 Linux 배포판에 venv 패키지를 설치하지 않는 경우 다음 명령을 실행합니다.
sudo apt-get install python3-venv
로컬 환경에서 실행
터미널이나 명령 프롬프트의 앱 폴더에서 이 명령을 실행합니다.
func start
터미널이나 명령 프롬프트의 앱 폴더에서 이 명령을 실행합니다.
npm install npm start
Functions 호스트가 로컬 프로젝트 폴더에서 시작되면 타이머 트리거 함수에 대한 정보를 터미널 출력에 씁니다. 코드에 정의된 일정에 따라 타이머 트리거 함수가 실행되는 것을 볼 수 있습니다.
기본 일정은 30초마다 실행되는 일정입니다
*/30 * * * * *.완료되면 터미널 창에서 Ctrl+C를 눌러
func.exe호스트 프로세스를 중지합니다.
-
deactivate를 실행하여 가상 환경을 종료합니다.
코드 검토(선택 사항)
타이머 트리거 함수를 정의하는 코드를 검토할 수 있습니다.
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 명령을 사용하여 코드를 Flex Consumption 플랜의 Azure 내의 새로운 함수 앱에 배포하도록 구성됩니다.
팁 (조언)
이 프로젝트에는 azd가 모범 사례를 따르는 Flex 사용량 플랜에 대한 안전한 배포를 만드는 데 사용하는 Bicep 파일 집합이 포함되어 있습니다.
azd가 Azure에서 필요한 Azure 리소스를 만들고 코드 프로젝트를 새 함수 앱에 배포하려면 이 명령을 실행합니다.azd up루트 폴더에는
azure.yaml에 필요한azd정의 파일이 포함되어 있습니다.아직 로그인하지 않은 경우 Azure 계정으로 인증하라는 메시지가 표시됩니다.
메시지가 표시되면 다음과 같은 필수 배포 매개 변수를 제공합니다.
매개 변수 Description Azure 구독 리소스가 만들어지는 구독. Azure 위치 새 Azure 리소스가 포함된 리소스 그룹을 만들 Azure 지역입니다. 현재 Flex 사용량 플랜을 지원하는 지역만 표시됩니다. azd up명령은 이러한 프롬프트에 대한 응답을 Bicep 구성 파일과 함께 사용하여 이러한 배포 작업을 완료합니다.다음과 같은 필수 Azure 리소스를 만들고 구성합니다(
azd provision과 동등):- 플렉스 사용량 플랜 및 함수 앱
- Azure Storage(필수) 및 Application Insights(권장)
- 사용자의 계정에 대한 액세스 정책 및 역할
- 관리 ID를 사용한 서비스 간 연결(저장된 연결 문자열 대신)
- 함수 앱과 다른 Azure 리소스를 모두 안전하게 실행하기 위한 가상 네트워크
코드를 패키지하여 배포 컨테이너(
azd deploy와 동등)에 배포합니다. 그러면 앱이 시작되어 배포된 패키지에서 실행됩니다.
명령이 성공적으로 완료되면, 만든 리소스에 대한 링크가 표시됩니다.
배포 확인
배포가 완료되면 타이머 트리거 함수가 일정에 따라 Azure에서 자동으로 실행하기 시작합니다.
Azure Portal에서 새 함수 앱으로 이동합니다.
왼쪽 메뉴에서 로그 스트림 을 선택하여 함수 실행을 실시간으로 모니터링합니다.
일정에 따라 실행되는 타이머 트리거 함수를 보여 주는 로그 항목이 표시됩니다.
코드 다시 배포
필요에 따라 Azure 리소스를 프로비전하고 함수 앱에 코드 업데이트를 배포하기 위해 azd up 명령을 여러 번 실행합니다.
비고
배포된 코드 파일은 항상 최신 배포 패키지로 덮어쓰여집니다.
azd 프롬프트에 대한 초기 응답과 azd에서 생성된 모든 환경 변수는 명명된 환경에 로컬로 저장됩니다.
azd env get-values 명령을 사용하여 Azure 리소스를 만들 때 사용된 환경의 모든 변수를 검토합니다.
자원을 정리하세요
함수 앱 및 관련 리소스 작업을 마쳤으면 이 명령을 사용하여 Azure에서 함수 앱 및 관련 리소스를 삭제하고 추가 비용이 발생하지 않도록 합니다.
azd down --no-prompt
비고
--no-prompt 옵션은 사용자의 확인 없이 azd에게 리소스 그룹을 삭제하도록 지시합니다.
이 명령은 로컬 코드 프로젝트에는 영향을 미치지 않습니다.