Microsoft AZ-204: Azure Functions 및 Serverless 컴퓨팅 — 학습 가이드
다음의 일부입니다: Microsoft Azure Developer Associate AZ-204 — 학습 가이드. 검증된 답안으로 연습하기: Microsoft 시험 허브, 또는 다음에서 시간 제한 모의고사 풀기: ExamRoll.io.
개요
Azure Functions는 이벤트 기반의 단기 실행 워크로드에 최적화된 서버리스 컴퓨팅 서비스입니다. 인프라를 추상화하여 개발자는 HTTP 엔드포인트, 큐, Blob, 데이터 변경 피드, 스트리밍 서비스의 이벤트에 응답하는 코드에만 집중할 수 있습니다. 스케일링, 가격 책정, 콜드 스타트(cold-start) 동작을 결정하는 호스팅 계획을 선택하고, 선언적 바인딩을 사용하여 코드를 트리거 및 데이터 소스에 바인딩하며, 선택적으로 Durable Functions를 사용하여 장기 실행되는 안정적인 워크플로를 구성할 수 있습니다. 견고한 구성, 반복 가능한 배포, Application Insights를 통한 심층적인 관찰 가능성은 프로덕션 수준의 시스템을 위한 플랫폼을 완성합니다.
호스팅 계획, 스케일링, 콜드 스타트
호스팅 계획 선택은 실행 특성과 비용을 결정합니다.
소비 계획(Consumption plan):
- 스케일링 및 가격: 실행 횟수와 리소스 소비량에 따라 지불합니다. 플랫폼은 이벤트에 따라 자동으로 스케일 아웃됩니다. 유휴 상태일 때 인스턴스 수는 0으로 조정됩니다.
- 실행 제한: 함수 시간 제한은 비-HTTP 함수의 경우 최대 10분까지 구성할 수 있습니다. HTTP 함수는 클라이언트 연결 때문에 실제적인 시간 제한이 더 짧습니다.
- 콜드 스타트: 유휴 기간 후 또는 새 인스턴스가 초기화되는 스케일 아웃 시에 콜드 스타트가 발생합니다. 시작 시간은 언어, 종속성, 앱 크기에 따라 다릅니다.
- 네트워킹/기능: 기본적으로 퍼블릭 네트워킹을 지원합니다. Premium에 비해 기능 세트가 제한적입니다(예: VNET 통합 없음). 배포 슬롯을 사용할 수 없습니다.
프리미엄 계획(Premium plan):
- 스케일링 및 가격: 이벤트에 따라 스케일링되지만, 콜드 스타트를 제거하기 위해 “미리 준비된(pre-warmed)” 인스턴스를 유지합니다. 활성 및 미리 준비된 인스턴스에 할당된 코어 초 및 메모리 기준으로 요금이 청구됩니다.
- 실행 제한: 실질적으로 실행 시간이 무제한입니다(HTTP 클라이언트 제약 조건에 따름). 지연 시간에 민감하거나 부하가 큰 워크로드에 권장됩니다.
- 콜드 스타트 완화: 미리 준비된 인스턴스가 런타임을 항상 활성 상태로 유지합니다. 계획당 미리 준비된 인스턴스 수를 제어하여 버스트(burst) 상황에서 예측 가능한 지연 시간을 제공합니다.
- 네트워킹/기능: VNET 통합, 프라이빗 엔드포인트, 더 큰 인스턴스 크기 및 배포 슬롯을 지원합니다.
전용(App Service) 계획(Dedicated (App Service) plan):
- 스케일링 및 가격: 프로비저닝된 App Service 인스턴스에서 수동 또는 자동 스케일링 규칙에 따라 실행됩니다. 사용량과 관계없이 기본 App Service 계획에 대해 비용을 지불합니다.
- 실행 제한: 백그라운드 실행에 대해 플랫폼이 부과하는 시간 제한이 없습니다. 이미 여분의 App Service 용량이 있거나 일관된 성능이 필요할 때 이상적입니다.
- 콜드 스타트 완화: Always On을 활성화하여 앱을 계속 로드된 상태로 유지합니다. 0으로 스케일링되지 않으며 인스턴스는 항상 준비된 상태로 유지됩니다.
비용에 최적화된 산발적인 워크로드에는 소비 계획을, 낮은 지연 시간과 VNET이 필요한 경우에는 프리미엄 계획을, 기존 App Service 용량과 통합하거나 완전한 제어가 필요할 때는 전용 계획을 선택하십시오. 초저지연 시간이 필요하다면, 미리 준비된 인스턴스가 있는 프리미엄 계획이나 Always On이 설정된 전용 계획이 콜드 스타트를 줄여줍니다. 종속성을 줄이고, 패키지에서 실행(run-from-package)하며, 클라이언트를 지연 초기화(lazily initializing)하여 콜드 스타트 영향을 더욱 최소화할 수 있습니다.
트리거와 바인딩
함수는 트리거에 의해 활성화되고 바인딩을 통해 데이터와 상호 작용합니다. 트리거는 함수가 어떻게 그리고 언제 실행될지를 정의합니다. 바인딩은 명령형 SDK 코드 없이 선언적으로 외부 서비스에 연결하여 입/출력을 처리합니다.
일반적인 트리거:
- HTTP 트리거: REST 스타일 API 또는 웹훅을 위한 엔드포인트를 노출합니다. 인증 수준에는 Anonymous, Function, Admin이 있으며, 키 또는 플랫폼 인증을 통해 적용됩니다. 장기 실행 작업에 대해서는 멱등성(idempotency)과 타임아웃을 고려하고, 필요 시 큐나 Durable Functions로 작업을 오프로드합니다.
- 타이머 트리거: CRON 기반 스케줄은 앱(타이머)당 단일 인스턴스에서 실행됩니다. 시간대 구성과 함께 NCRONTAB 표현식을 사용합니다. 유지보수, 폴링, 정리 작업에 이상적입니다.
- Azure Storage 큐 트리거: 큐의 메시지에 응답합니다. 디큐(dequeue) 횟수 임계값을 초과하면 -poison 큐를 통해 포이즌 메시지(poison message) 처리를 지원합니다. host.json을 통해 배치 크기, 표시 제한 시간, 동시성을 구성합니다.
- Azure Blob Storage 트리거: 폴링과 Event Grid 알림의 조합을 사용하여 Blob 생성/업데이트 이벤트에 반응합니다. 경로 패턴을 사용하여 컨테이너와 접두사의 범위를 지정합니다. 대용량 Blob 업로드 시 최종적 일관성(eventual consistency)과 재시도 동작을 이해해야 합니다.
- Azure Event Hubs 트리거: 체크포인팅(checkpointing)을 통해 높은 처리량의 이벤트 스트림을 소비합니다. 처리량을 위해 파티션 동시성, 배치 크기, 프리페치(prefetch)를 구성합니다. 파티션별 순서가 보장되는 원격 측정 및 스트림 처리에 적합합니다.
- Azure Service Bus 트리거: 큐 또는 토픽 구독을 지원합니다. maxConcurrentCalls, 프리페치, 자동 완성 동작을 구성합니다. 배달 시도 횟수를 초과한 메시지는 나중에 검사할 수 있도록 데드-레터 큐(dead-letter queue)에 수집됩니다.
- Azure Cosmos DB 트리거: 변경 피드(change feed)를 수신하여 삽입 및 업데이트를 감지합니다. 물리적 파티션 수에 따라 확장되므로 충분한 RU를 프로비저닝해야 합니다. 임대 컬렉션(leases collection)을 사용하여 여러 인스턴스에 걸쳐 스케일 아웃을 조정합니다.
바인딩:
- 입력 바인딩: 함수에 데이터를 제공합니다 (예: Blob 콘텐츠, 테이블 엔터티, Cosmos DB 문서, 큐 메시지 메타데이터). .NET에서는 [BlobInput] 같은 어트리뷰트나 function.json이 바인딩을 정의하고, 다른 언어에서는 구성이 선언적입니다.
- 출력 바인딩: SDK 없이 데이터를 씁니다 (예: 메시지 인큐, Blob 생성, Event Hub/Service Bus로 전송, Cosmos DB에 쓰기). 함수는 여러 출력 바인딩을 가질 수 있거나 함수 시그니처에서 단일 출력을 반환할 수 있습니다.
- 바인딩 표현식: {queueTrigger}, {rand-guid}, 환경 기반 앱 설정과 같은 플레이스홀더를 사용하여 연결 정보와 경로를 매개변수화합니다. 연결 속성은 애플리케이션 설정 이름을 참조하여, 키 순환 및 시크릿 관리를 가능하게 합니다. 지원되는 경우 관리 ID를 사용한 ID 기반 연결을 선호하여 시크릿을 코드에 포함하지 않도록 합니다.
- 동시성 및 배치: host.json에서 확장(queues, serviceBus, eventHub)별로 동시성 및 배치 크기를 제어하여 처리량과 메모리 사용량을 조정합니다. 포이즌/데드-레터 처리를 검증하여 실패가 표면화되도록 합니다.
멱등성, 역압(backpressure), 장애 격리를 위해 트리거와 바인딩을 설계해야 합니다. 최소 한 번 이상 전달(at-least-once delivery)을 보장하는 소스(큐, Event Hubs, Service Bus)의 경우, 함수를 멱등성을 가지며 재시도에 탄력적으로 작성해야 합니다.
Durable Functions: 신뢰할 수 있는 오케스트레이션 패턴
Durable Functions는 내구성 있는 작업 프레임워크(durable task framework)를 사용하여 장기 실행 워크플로우를 위한 상태 저장(stateful) 및 신뢰할 수 있는 오케스트레이션을 제공함으로써 Azure Functions를 확장합니다.
함수 유형:
- 오케스트레이터 함수: 결정론적(deterministic) 구조를 사용하여 코드에 워크플로우 로직을 기술합니다. 오케스트레이터는 이벤트 발생 시 상태를 재생(replay)하며, 적절한 헬퍼 없이는 비결정론적 API(DateTime.Now, random, 네트워크 호출) 사용을 피해야 합니다. Durable 오케스트레이션 클라이언트 API를 사용하여 인스턴스를 시작, 쿼리, 관리합니다.
- 액티비티 함수: 외부 API 호출, CPU 집약적 작업 수행, IO 작업과 같은 개별 작업 단위를 실행합니다. 액티비티는 재시도 가능하며 독립적으로 확장할 수 있습니다.
- 엔터티 함수: 작고 일관된 상태와 작업을 가진 내구성 있고 주소 지정이 가능한 엔터티를 제공합니다 (예: 카운터, 장치 상태). 엔터티는 직렬화된 작업을 단일 스레드 일관성으로 처리합니다.
패턴:
- 함수 체이닝: 정의된 순서(A → B → C)로 액티비티를 순차적으로 실행하고, 결과를 다음 액티비티로 전달합니다. 의존성이 있는 파이프라인에 유용합니다.
- 팬아웃/팬인: 여러 액티비티를 병렬로 시작하고 결과를 집계합니다. 오케스트레이터는 Task.WhenAll과 유사한 시맨틱으로 조정합니다. 독립적인 작업의 병렬 처리에 사용합니다.
- 인간 상호작용 (외부 이벤트): WaitForExternalEvent를 사용하여 타임아웃 및 에스컬레이션과 함께 외부 입력(예: 승인)을 기다립니다. 내구성 있는 타이머와 결합하여 SLA 및 보상 로직을 구현합니다.
- 비동기 HTTP API: 오케스트레이션을 시작하고 상태/쿼리 URL과 함께 202 Accepted를 반환합니다. 클라이언트는 최종 결과나 상태를 얻기 위해 Durable 클라이언트 바인딩에 의해 노출된 상태 엔드포인트를 폴링합니다.
- 모니터: 조건이 충족될 때까지 엔드포인트를 폴링하는 것과 같이, 스케줄에 따라 실행되는 반복적인 체크포인트입니다. 내구성 있는 타이머를 사용하여 컴퓨팅 리소스를 점유하는 것을 방지합니다.
- 애그리게이터/엔터티: 전체 워크플로우 없이 세분화된 조정을 위해 엔터티 함수를 사용하여 로직 옆에 작은 상태를 저장합니다.
Durable Functions는 액티비티의 최소 한 번 이상 실행(at-least-once execution)과 오케스트레이터 상태의 정확히 한 번 진행(exactly-once progression)을 보장합니다. 상태를 스토리지(기본값은 Azure Storage)에 영속화하므로, 스토리지 계정이 처리량 및 안정성 요구 사항을 충족하는지 확인해야 합니다. 일시적인 장애에 대해서는 사용자 지정 재시도 정책을 사용하고, 외부 상호작용을 위해서는 이벤트를 발생시킵니다. 매우 긴 프로세스의 경우, 내장된 내구성을 통해 Durable 오케스트레이션은 수일에서 수개월 동안 실행될 수 있습니다.
구성, 배포 및 관찰성
함수 앱 구성은 계층적 구조를 가지며, 환경을 인식합니다.
- host.json: 런타임 및 확장 동작을 제어합니다. 로깅(샘플링, 로그 수준), functionTimeout, 확장 설정(배치 크기, 동시성, 프리페치), JSON 스키마 버전을 구성합니다. host.json은 소스 제어에 보관하세요.
- local.settings.json: 연결 문자열 및 앱 설정을 포함한 로컬 개발 설정입니다. Azure에 배포되지 않습니다. 비밀을 적절히 처리하고, 공개 리포지토리에서 제외하며, 로컬 개발 시에는 user-secrets 또는 환경 주입을 사용하세요.
- 애플리케이션 설정: 함수 앱(App Service) 구성에 저장됩니다. 중요한 설정으로는 AzureWebJobsStorage(트리거, 로그, 체크포인트에서 사용하는 스토리지 계정용), 확장별 연결 문자열, 그리고 모든 사용자 지정 구성이 있습니다. 비밀은 교환(swap)되지 않도록 슬롯 설정으로 표시하세요. 비밀을 평문으로 저장하지 않으려면 관리 ID와 함께 Key Vault 참조를 사용하세요.
배포 옵션:
- Zip 배포(Zip Deploy): 빌드된 아티팩트의 ZIP 파일을 앱에 업로드합니다. CI/CD에 빠르고 간단합니다.
undefined
또는 zipdeploy API를 사용합니다. 콘텐츠 디렉터리에 파일을 씁니다.
- Run-From-Package:
undefined
를 패키지 URL(또는 최신 버전을 위해 1)로 설정합니다. 런타임이 패키지를 읽기 전용으로 마운트하여 콜드 스타트를 개선하고 배포 중 파일 잠금 문제를 제거합니다. 재현 가능한 롤백을 위해 SAS URL과 함께 Blob Storage에 패키지를 저장하세요.
- 배포 슬롯: 스테이징 및 프로덕션 슬롯을 통해 웜업(warmup)과 함께 무중단 교환(swap)이 가능합니다. 슬롯은 Premium 및 Dedicated 플랜에서 지원됩니다. 환경 간 유출을 방지하기 위해 비밀 및 엔드포인트에 대해 슬롯별 설정(슬롯 설정 플래그)을 구성하세요. 트래픽이 이동하기 전에 확장 및 바인딩을 검증하기 위해 사전 교환(preSwap) 웜업을 사용하세요.
Application Insights를 사용한 모니터링:
- 호출 로그: 각 함수 호출은 Requests, Traces, Exceptions, Dependencies를 포함한 구조화된 원격 측정 데이터를 내보냅니다. 구조화된 로그를 위해 ILogger(또는 동등한 것)를 사용하세요. Operation 및 상관 관계 ID는 여러 서비스에 걸친 활동과 종속성을 연결합니다.
- 라이브 메트릭(Live Metrics): 샘플링 없이 처리량, 실패, 지연 시간을 실시간으로 볼 수 있습니다. 배포, 스케일링, 핫 패스를 관찰하는 데 유용합니다. 함수 이름으로 필터링하여 문제를 격리하세요.
- 실패 및 안정성: Exceptions, 실패한 Requests, 종속성 실패를 검사합니다. 실패율, FunctionExecutionCount 이상, DLQ/포이즌 큐 증가에 대한 경고를 구성하세요. Storage Queue 트리거의 경우 -poison 큐를 모니터링하고, Service Bus/Event Hubs의 경우 데드 레터 및 체크포인트 상태를 모니터링하세요. 일시적인 오류의 영향을 줄이기 위해 host.json의 재시도 정책 및 백오프를 조정하세요.
- 분산 추적: W3C 추적 헤더를 활성화하여 HTTP 및 메시징을 통해 상관 관계를 전파합니다. Durable Functions의 경우, 프레임워크가 오케스트레이션 및 액티비티 원격 측정 데이터를 연결하여 엔드투엔드 진단을 돕습니다. 비용과 충실도의 균형을 맞추기 위해 샘플링을 조정하세요.
배포 자동화(GitHub Actions/Azure Pipelines), HTTP 엔드포인트용 상태 프로브, 자동 스케일링을 고려한 튜닝을 통해 함수를 운영하세요. 패키지를 가볍게 유지하고, 클라이언트(예: HttpClient, Service Bus 클라이언트)를 정적 싱글톤으로 캐시하며, 런타임 실패를 방지하기 위해 바인딩 연결 설정이 시작 시에 확인되는지 검증하세요.
실제 문제 시나리오
Contoso Retail은 고객이 장바구니에 상품을 추가할 때 실시간으로 할인을 적용하는 프로모션 서비스를 출시합니다. 백엔드는 변동성이 큰 트래픽에 낮은 지연 시간으로 응답하고, 서드파티 가격 책정 API를 호출하며, Cosmos DB 장바구니 문서를 업데이트해야 합니다. 운영팀은 무중단 배포와 실패에 대한 깊은 가시성을 원합니다.
- 호스팅 계획 선택 및 앱 구조화
- 사전 준비된 인스턴스 2개와 VNET 통합이 포함된 Azure Functions Premium 플랜을 사용합니다. Premium 플랜은 지연 시간에 민감한 장바구니 상호 작용의 콜드 스타트를 제거하고, VNET의 NAT 또는 방화벽을 통해 서드파티 API로의 아웃바운드 트래픽을 보호합니다.
- 장바구니 엔드포인트를 위한 HTTP 트리거 함수와 할인 검색 및 장바구니 업데이트를 조정하기 위한 Durable Functions 오케스트레이터를 포함하는 단일 함수 앱을 생성합니다.
- 안정성 및 병렬 처리를 위한 Durable 오케스트레이션 구현
- 오케스트레이터 함수: 입력을 검증하고, 액티비티 함수를 통해 각 장바구니 품목의 할인을 병렬로 가져오도록 팬아웃(fan out)한 다음, 최적의 가격을 집계하기 위해 팬인(fan in)하는 단계를 연결합니다. Durable 오케스트레이션은 결정론적 제어 흐름과 재시작에 대한 복원력을 보장합니다.
- 액티비티 함수: 한 액티비티는 재시도 정책을 사용하여 서드파티 API를 호출하고, 다른 액티비티는 출력 바인딩을 통해 Cosmos DB의 장바구니를 업데이트합니다. 액티비티는 외부 IO를 캡슐화하며 오케스트레이터 로직을 복제하지 않고 독립적으로 재시도할 수 있습니다.
- 단순성을 위한 트리거 및 바인딩 구성
- 웹 프런트엔드로부터 서명된 요청을 받기 위해 Function 인증이 포함된 HTTP 트리거를 사용합니다. 장시간 실행되는 장바구니의 경우 상태 URL과 함께 202를 반환하고, 빠른 경로의 경우 200을 반환합니다.
- 장바구니 문서를 업서트(upsert)하기 위해 액티비티에 Cosmos DB 출력 바인딩을 사용합니다. 바인딩 표현식은 HTTP 페이로드의 cartId를 사용하여 올바른 파티션 키를 대상으로 합니다.
- Cosmos DB 및 Key Vault 참조에 관리 ID 및 ID 기반 연결을 사용하여 앱 설정에서 비밀을 제거합니다.
- 구성 및 배포 최적화
- host.json은 functionTimeout을 무제한(Premium)으로 설정하고 서비스 메시에 친화적인 HTTP 시간 초과를 구성합니다. 로깅 수준은 프로덕션 환경에서 Information으로 조정되고, 비용 제어를 위해 샘플은 20%로 설정됩니다.
- 버전이 지정된 Blob 컨테이너에 저장된 패키지와 함께 run-from-package를 사용합니다. CI를 통해
undefined
로 배포하고, 스테이징 슬롯을 통해 프로덕션으로 교환하여 무중단 릴리스를 수행합니다. 환경 간 유출을 방지하기 위해 연결 문자열과 API 엔드포인트를 슬롯 설정으로 표시합니다.
- 모니터링 및 운영
- Application Insights와 Live Metrics를 활성화하여 릴리스 중 처리량과 지연 시간을 관찰합니다. HTTP 5xx, 가격 책정 API에 대한 종속성 실패율, Durable 함수 실패 오케스트레이션 증가에 대한 경고를 구성합니다.
- 분산 추적을 사용하여 HTTP 요청을 Durable 오케스트레이션 및 액티비티 종속성과 연관시켜, 간헐적인 서드파티 문제에 대한 근본 원인 분석을 신속하게 처리합니다.
이러한 선택을 한 이유:
- 사전 준비된 인스턴스가 있는 Premium 플랜은 일관되게 낮은 지연 시간을 보장하고 보안된 송신을 위한 VNET 통합을 지원합니다.
- Durable Functions는 외부 API 호출에 대한 자동 상태 및 재시도 관리를 통해 신뢰할 수 있는 체이닝 및 팬아웃/팬인을 제공합니다.
- 바인딩은 상용구 코드를 줄이고 Cosmos DB에 대한 일관되고 선언적인 데이터 액세스를 강제합니다.
- Run-from-package와 슬롯은 파일 잠금 문제나 다운타임 없이 반복 가능하고 원자적인 배포를 제공합니다.
- Application Insights는 운영 SLA에 맞춰 실시간 관찰성, 상관 관계 분석 및 경고 기능을 제공합니다.
← Azure App Service 및 Web Apps · 모든 도메인 · Azure Storage 및 Blob Storage →
이 문제 연습하기 → · ExamRoll.io에서 시간 제한 연습 →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
시험 합격하기 →