안정적인 Azure Functions에 대한 모범 사례

Azure Functions는 Azure, 타사 서비스, 온-프레미스 시스템에서 발생하는 이벤트에 의해 트리거되는 코드를 구현하는 기능으로 기존 Azure App Service 애플리케이션 플랫폼을 확장하는 이벤트 기반 주문형 컴퓨팅 환경입니다. 함수를 사용하면 데이터 원본 또는 메시징 솔루션에 연결하여 솔루션을 빌드할 수 있으므로 이벤트를 더 쉽게 처리하고 대응할 수 있습니다. 함수는 많은 통합 구성 요소와 복잡한 Azure 데이터 센터에서 실행됩니다. 호스트된 클라우드 환경에서는 VM이 때때로 다시 시작되거나 이동할 수 있으며 시스템 업그레이드가 발생할 것으로 예상됩니다. 또한 함수 앱은 외부 API, Azure 서비스, 기타 데이터베이스에 종속되어 주기적인 신뢰성이 떨어지기 쉽습니다.

이 문서에서는 클라우드 기반 환경에서 정상 상태로 유지되고 성능이 좋은 효율적인 함수 앱을 디자인하고 배포하기 위한 몇 가지 모범 사례를 자세히 설명합니다.

올바른 호스팅 플랜 선택

Azure에서 함수 앱을 만들 때는 앱의 호스팅 계획을 선택해야 합니다. 선택한 플랜은 성능, 안정성, 비용에 영향을 줍니다. Functions에 사용할 수 있는 세 가지 기본 호스팅 플랜이 있습니다.

Linux 또는 Windows를 실행하는 경우 모든 호스팅 플랜을 GA(일반 공급)할 수 있습니다.

App Service 플랫폼의 컨텍스트에서 함수를 동적으로 호스트하는 데 사용되는 Premium 플랜은 EP(Elastic Premium Plan)입니다. Premium이라는 다른 전용(App Service) 플랜이 있습니다. 자세한 내용은 Premium 플랜 문서를 참조하세요.

선택한 호스팅 플랜에 따라 다음 동작이 결정됩니다.

  • 수요에 따라 함수 앱을 스케일링하는 방법 및 인스턴스 할당 관리 방법입니다.
  • 각 함수 앱 인스턴스에 사용 가능한 리소스
  • Azure Virtual Network 연결 등의 고급 기능 지원

올바른 호스팅 플랜을 선택하는 방법과 플랜 간의 자세한 비교에 대한 자세한 내용은 Azure Functions 호스팅 옵션을 참조하세요.

함수 앱을 만들 때 올바른 플랜을 선택하는 것이 중요합니다. Functions는 주로 Consumption 및 Elastic Premium 플랜 간에 호스팅 플랜을 전환하는 제한된 기능을 제공합니다. 자세한 내용은 마이그레이션 계획을 참조하세요.

스토리지를 올바르게 구성

Functions를 사용하려면 스토리지 계정을 함수 앱과 연결해야 합니다. 스토리지 계정 연결은 Functions 호스트에서 트리거 관리 및 함수 실행 로깅과 같은 작업에 사용됩니다. 함수 앱을 동적으로 스케일링할 때도 사용됩니다. 자세한 내용은 Azure Functions에 대한 스토리지 고려 사항을 참조하세요.

함수 앱에서 잘못 구성된 파일 시스템 또는 스토리지 계정은 함수의 성능 및 가용성에 영향을 줄 수 있습니다. 잘못 구성된 스토리지 계정 문제 해결에 대한 도움말은 스토리지 문제 해결 문서를 참조하세요.

스토리지 연결 설정

동적으로 스케일링하는 함수 앱은 스토리지 계정의 Azure Files 엔드포인트 또는 스케일 아웃 인스턴스와 연결된 파일 서버에서 실행할 수 있습니다. 이 동작은 다음 애플리케이션 설정에 의해 제어됩니다.

이러한 설정은 Premium 플랜 또는 Windows의 Consumption 플랜에서 실행하는 경우에만 지원됩니다.

Azure Portal에서 또는 Azure CLI나 Azure PowerShell을 사용하여 함수 앱을 만들 때 필요한 경우 함수 앱에 대해 이러한 설정이 만들어집니다. ARM 템플릿(Azure Resource Manager 템플릿)에서 리소스를 만들 때 템플릿에 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING도 포함해야 합니다.

ARM 템플릿을 사용하는 첫 번째 배포에서는 생성되는 WEBSITE_CONTENTSHARE를 포함하지 마세요.

다음 ARM 템플릿 예제를 사용하여 이러한 설정을 올바르게 구성할 수 있습니다.

Storage 계정 구성

함수 앱을 만들 때 Blob, Queue 및 Table 스토리지를 지원하는 범용 Azure Storage 계정을 만들거나 해당 계정에 연결해야 합니다. Functions는 트리거 관리 및 함수 실행 기록 등의 작업에 Azure Storage를 사용합니다. 함수 앱의 스토리지 계정 연결 문자열은 AzureWebJobsStorageWEBSITE_CONTENTAZUREFILECONNECTIONSTRING 애플리케이션 설정에서 찾을 수 있습니다.

이 스토리지 계정을 만들 때 다음 사항을 고려해야 합니다.

  • 대기 시간을 줄이려면 함수 앱과 동일한 지역에 스토리지 계정을 만듭니다.

  • 프로덕션 성능을 향상시키려면 각 함수 앱에 대해 별도의 스토리지 계정을 사용하세요. Durable Functions 및 Event Hub 트리거 함수의 경우 특히 그렇습니다.

  • Event Hub 트리거 함수의 경우 Data Lake Storage를 사용하도록 설정된 계정을 사용하지 마세요.

대용량 데이터 세트 처리

Linux에서 실행하는 경우 파일 공유를 탑재하여 추가 스토리지를 추가할 수 있습니다. 공유 탑재는 함수가 대규모 기존 데이터 집합을 처리하는 편리한 방법입니다. 자세한 내용은 파일 공유 탑재를 참조하세요.

함수 구성

솔루션의 일부로 여러 함수를 개발하고 게시할 수 있습니다. 이러한 함수는 대개 단일 함수 앱으로 결합되지만 별도의 함수 앱에서 실행할 수도 있습니다. 프리미엄 및 전용(App Service) 호스팅 플랜에서 여러 함수 앱이 동일한 플랜으로 실행되어 동일한 리소스를 공유할 수도 있습니다. 함수 및 함수 앱을 그룹화하는 방법은 전체 솔루션의 성능, 스케일링, 구성, 배포, 보안에 영향을 줄 수 있습니다.

Consumption 및 Premium 플랜의 경우 함수 앱의 모든 함수가 동적으로 함께 스케일링됩니다.

함수를 구성하는 방법에 대한 자세한 내용은 함수 조직 모범 사례를 참조하세요.

배포 최적화

함수 앱을 배포할 때는 Azure에서 함수에 대한 배포 단위가 함수 앱이라는 점을 명심해야 합니다. 함수 앱의 모든 함수는 일반적으로 동일한 배포 패키지에서 동시에 배포됩니다.

성공적인 배포를 위해 다음 옵션을 고려합니다.

  • 배포 패키지에서 함수를 실행합니다. 패키지 접근 방식에서 이 실행을 통해 다음과 같은 이점이 제공됩니다.

    • 파일 복사 잠금 문제의 위험을 줄여줍니다.
    • 다시 시작을 트리거하는 프로덕션 앱에 직접 배포할 수 있습니다.
    • 패키지의 모든 파일을 앱에서 사용할 수 있습니다.
    • ARM 템플릿 배포의 성능을 향상시킵니다.
    • 특히 대규모 npm 패키지 트리가 있는 JavaScript 함수의 경우 콜드 부팅 시간을 줄일 수 있습니다.
  • 지속적인 배포를 사용하여 배포를 소스 제어 솔루션에 연결하는 것이 좋습니다. 지속적인 배포를 사용하면 배포 패키지에서 실행할 수도 있습니다.

  • Premium 플랜 호스팅의 경우 새 인스턴스가 추가되면 대기 시간을 줄이기 위해 준비 트리거를 추가하는 것이 좋습니다. 자세한 내용은 Azure Functions 준비 트리거를 참조하세요.

  • 배포 가동 중지 시간을 최소화하고 배포를 롤백하려면 배포 슬롯을 사용하는 것이 좋습니다. 자세한 내용은 Azure Functions 배포 슬롯을 참조하세요.

강력한 함수 쓰기

함수의 일반적인 성능 및 가용성에 도움이 되는 함수 코드를 작성할 때 수행할 수 있는 몇 가지 디자인 원칙이 있습니다. 이러한 원칙에는 다음이 포함됩니다.

일시적인 오류는 클라우드 컴퓨팅에서 일반적이므로 클라우드 기반 리소스에 액세스할 때 재시도 패턴을 사용해야 합니다. 많은 트리거 및 바인딩은 이미 재시도를 구현합니다.

보안을 위해 설계

보안은 계획 단계에서 가장 잘 고려되며 함수를 사용할 준비가 된 후에는 고려되지 않습니다. 함수를 안전하게 개발하고 배포하는 방법을 알아보려면 Azure Functions 보안을 참조하세요.

동시성 고려

들어오는 이벤트의 결과로 함수 앱에 수요가 증가하면 Consumption 및 Premium 플랜에서 실행되는 함수 앱이 스케일 아웃됩니다. 함수 앱이 로드에 응답하는 방법과 들어오는 이벤트를 처리하도록 트리거를 구성하는 방법을 이해하는 것이 중요합니다. 일반적인 개요는 Azure Functions에서 이벤트 기반 스케일링을 참조하세요.

전용(App Service) 플랜을 사용하려면 함수 앱을 스케일 아웃하기 위해 제공해야 합니다.

작업자 프로세스 수

경우에 따라 스케일 아웃하기 전에 인스턴스에서 언어 작업자 프로세스라고 하는 여러 프로세스를 만들어 부하를 처리하는 것이 더 효율적입니다. 허용되는 최대 언어 작업자 프로세스 수는 FUNCTIONS_WORKER_PROCESS_COUNT 설정에 의해 제어됩니다. 이 설정의 기본값은 1이며, 이는 여러 프로세스가 사용되지 않음을 의미합니다. 최대 프로세스 수에 도달하면 함수 앱이 부하를 처리하기 위해 더 많은 인스턴스로 스케일 아웃됩니다. 이 설정은 호스트 프로세스에서 실행되는 C# 클래스 라이브러리 함수에는 적용되지 않습니다.

Premium 플랜 또는 전용(App Service) 플랜에서 FUNCTIONS_WORKER_PROCESS_COUNT를 사용하는 경우 플랜에서 제공하는 코어 수를 염두에 두어야 합니다. 예를 들어 Premium 플랜 EP2는 두 개의 코어를 제공하므로 2 값으로 시작하고 필요에 따라 최댓값까지 2씩 늘려야 합니다.

트리거 구성

처리량 및 스케일링을 계획할 때 다양한 유형의 트리거가 이벤트를 처리하는 방법을 이해하는 것이 중요합니다. 일부 트리거를 사용하면 일괄 처리 동작을 제어하고 동시성을 관리할 수 있습니다. 이러한 옵션의 값을 조정하면 호출된 함수의 요구에 맞게 각 인스턴스의 크기를 조정할 수 있습니다. 이러한 구성 옵션은 함수 앱의 모든 트리거에 적용되며 앱의 host.json 파일에서 유지 관리됩니다. 설정 세부 정보는 특정 트리거 참조의 구성 섹션을 참조하세요.

Functions에서 메시지 스트림을 처리하는 방법에 대한 자세한 내용은 Azure Functions 신뢰할 수 있는 이벤트 처리를 참조하세요.

연결 계획

Consumption 플랜에서 실행되는 함수 앱에는 연결 제한이 적용됩니다. 이러한 제한은 인스턴스별로 적용됩니다. 이러한 제한과 일반적인 모범 사례로 인해 함수 코드에서 아웃바운드 연결을 최적화해야 합니다. 자세한 내용은 Azure Functions에서 연결 관리를 참조하세요.

언어별 고려 사항

선택한 언어의 경우 다음 고려 사항에 유의하세요.

가용성 최대화

콜드 스타트는 서버리스 아키텍처에 대한 주요 고려 사항입니다. 자세한 내용은 콜드 스타트를 참조하세요. 콜드 스타트가 시나리오에 대한 우려인 경우 서버리스 콜드 스타트 이해 후 심층 분석을 찾을 수 있습니다.

Premium 플랜은 동적 스케일링을 유지하면서 콜드 스타트를 줄이기 위한 권장 플랜입니다. 다음 지침을 사용하여 콜드 스타트를 줄이고 세 가지 호스팅 플랜 모두의 가용성을 향상시킬 수 있습니다.

계획 지침
프리미엄 계획 함수 앱에서 준비 트리거 구현
Always-Ready 인스턴스 및 최대 버스트 제한에 대한 값 설정
가상 네트워크에서 HTTP가 아닌 트리거를 사용할 때 가상 네트워크 트리거 지원 사용
전용 플랜 Azure App Service 상태 검사를 사용하도록 설정된 두 개 이상의 인스턴스에서 실행
자동 스케일링 구현
사용 계획 • 함수 앱의 스케일링 방식에 인위적으로 제한을 두지 않도록 싱글톤 패턴 및 바인딩과 트리거에 대한 동시성 설정을 검토합니다.
스케일 아웃을 제한할 수 있는 functionAppScaleLimit 설정 검토
• 개발 및 테스트 중에 설정된 일일 사용 할당량(GB-초) 제한을 확인합니다. 프로덕션 환경에서 이 제한을 제거하는 것이 좋습니다.

효과적으로 모니터링

Azure Functions는 Azure Application Insights와의 기본 제공 통합을 제공하여 코드에서 작성된 함수 실행 및 추적을 모니터링합니다. 자세히 알아보려면 Azure Functions 모니터링을 참조하세요. 또한 Azure Monitor는 함수 앱 자체의 상태를 모니터링하기 위한 기능을 제공합니다. 자세한 내용은 Azure Monitor를 사용하여 모니터링을 참조하세요.

Application Insights 통합을 사용하여 함수를 모니터링할 때 다음 사항을 고려해야 합니다.

  • AzureWebJobsDashboard 애플리케이션 설정이 제거되었는지 확인합니다. 이 설정은 이전 버전의 Functions에서 지원되었습니다. 존재하는 경우 AzureWebJobsDashboard를 제거하면 함수의 성능이 향상됩니다.

  • Application Insights 로그를 검토합니다. 찾을 것으로 예상되는 데이터가 누락된 경우 모니터링 시나리오를 더 잘 캡처하도록 샘플링 설정을 조정하는 것이 좋습니다. 이 excludedTypes 설정을 사용하여 샘플링에서 특정 형식(예: Request 또는 Exception)을 제외할 수 있습니다. 자세한 내용은 샘플링 구성을 참조하세요.

또한 Azure Functions를 사용하면 시스템 생성 및 사용자 생성 로그를 Azure Monitor 로그로 전송할 수 있습니다. Azure Monitor 로그 통합은 현재 미리 보기 상태입니다.

중복성 빌드

비즈니스 요구 사항에 따라 데이터 센터 가동 중단 시에도 항상 함수를 사용할 수 있어야 할 수 있습니다. 다중 지역 접근 방식을 사용하여 중요한 함수를 항상 실행하는 방법을 알아보려면 Azure Functions 지리적 재해 복구 및 고가용성을 참조하세요.

다음 단계

함수 앱 관리