Azure Functions 및 .NET 솔루션을 사용하여 서버리스 애플리케이션 구축
게시 됨: 2023-09-21서버리스 컴퓨팅은 개발자가 서버에 대해 생각하지 않고도 애플리케이션과 서비스를 구축하고 실행할 수 있도록 하는 클라우드 실행 모델입니다. 서버리스를 사용하면 애플리케이션은 서버 실행 유지에 의존하지 않습니다. 클라우드 공급자는 서버 할당 및 프로비저닝을 동적으로 관리합니다. 이를 통해 개발자는 서버 관리보다는 비즈니스 로직 코딩에 집중할 수 있습니다.
Microsoft Azure Functions는 서버를 프로비저닝하거나 관리할 필요 없이 웹 엔드포인트 및 백그라운드 처리 작업을 구축하고 호스팅하기 위한 서버리스 컴퓨팅 서비스입니다. Azure Functions를 사용하면 인프라를 명시적으로 프로비저닝하거나 관리할 필요 없이 이벤트에 대한 응답으로 주문형 코드를 실행할 수 있습니다. 이 블로그 게시물에서는 ASP.NET 개발 서비스 활용을 포함하여 .NET 솔루션을 사용하여 Azure Functions로 서버리스 애플리케이션을 구축하는 방법을 살펴보겠습니다.
애저 펑션이란 무엇인가요?
Azure Functions를 사용하면 인프라를 배포하거나 관리하지 않고도 클라우드에서 코드를 실행할 수 있습니다. Functions를 사용하면 서버 관리에 대한 걱정 없이 당면한 문제에 필요한 코드만 작성할 수 있습니다. Azure는 모든 인프라와 서버를 관리합니다.
Azure Functions의 몇 가지 주요 측면과 이점은 다음과 같습니다.
- 이벤트 기반: 함수는 여러 Azure 및 타사 서비스의 이벤트에 의해 트리거됩니다. 여기에는 HTTP 요청, 타이머, 대기열, 서버리스 API 등이 포함됩니다. 이러한 이벤트에 대한 응답으로 코드를 실행할 수 있습니다.
- 자동 크기 조정: Azure는 들어오는 요청 속도와 처리 부하에 따라 자동으로 기능을 관리하고 크기를 조정합니다. 서버를 수동으로 프로비저닝하고 확장할 필요가 없습니다.
- 실행당 지불: 코드를 실행하는 데 필요한 컴퓨팅 리소스에 대해서만 비용을 지불합니다. 기능이 실행되지 않을 때는 유휴 요금이 부과되지 않습니다.
- 다중 언어: 함수는 C#, JavaScript, Python, PowerShell, Java 등을 지원합니다. 원하는 언어로 기능을 개발할 수 있습니다.
- 서버리스 환경: Functions를 사용하면 코드 작성에 집중하고 Azure에서 모든 서버 프로비저닝, 구성 및 관리를 처리하도록 할 수 있습니다. 진정한 서버리스 경험을 얻을 수 있습니다.
로컬에서 .NET 함수 개발
.NET 함수를 로컬로 개발하려면 로컬과 Azure 모두에서 Azure Functions를 개발, 테스트 및 배포하기 위한 명령줄 인터페이스인 Azure Functions Core Tools가 필요합니다.
개발 환경을 설정하려면:
- .NET Core SDK 최신 버전 설치
- dotnet tool install -g Microsoft.Azure.WebJobs.Script.WebHost를 사용하여 Azure Functions Core Tools 설치
- 함수 앱 프로젝트용 디렉터리를 만들고 func init를 실행합니다.
- 그러면 함수 템플릿이 포함된 샘플 함수 프로젝트가 스캐폴드됩니다.
이제 func CLI를 사용하여 함수 코드를 추가하고, 로컬로 테스트하고, Azure에 게시할 수 있습니다. HTTP에 의해 트리거되는 C# 함수에 대한 run.csx 파일을 추가합니다.
소스 {csharp}
복사
#r “뉴턴소프트.Json”
Microsoft.AspNetCore.Mvc 사용;
Microsoft.Extensions.Primitives 사용;
Newtonsoft.Json 사용;
System.Net 사용;
System.Threading.Tasks 사용;
공용 정적 비동기 작업<IActionResult> 실행(HttpRequest req, ILogger 로그)
{
log.LogInformation("C# HTTP 트리거 함수가 요청을 처리했습니다.");
문자열 이름 = req.Query[“이름”];
string requestBody = 새 StreamReader(req.Body).ReadToEndAsync()를 기다립니다.
동적 데이터 = JsonConvert.DeserializeObject(requestBody);
이름 = 이름 ?? 데이터?.이름;
반환 이름 != null
? (ActionResult)new OkObjectResult($”안녕하세요, {name}”)
: new BadRequestObjectResult(“쿼리 문자열이나 요청 본문에 이름을 전달하세요.”);
}
localhost에서 함수 게이트웨이를 시작하는 func host start를 실행하여 로컬에서 테스트합니다. 이제 http://localhost:7071/api/HttpExample?name=John으로 Postman이나 브라우저를 사용하여 이를 트리거할 수 있습니다.
Azure Functions 트리거 및 바인딩 선택
Azure Functions는 트리거 및 바인딩이라고 하는 다양한 이벤트 소스와 대상을 지원합니다. 사용 사례에 따라 올바른 트리거와 바인딩을 선택하는 것이 중요합니다.
Functions의 몇 가지 일반적인 트리거는 다음과 같습니다.
- HTTP 트리거: REST API 및 웹 엔드포인트 구축용입니다. 코드는 HTTP 요청에 의해 트리거됩니다.
- 타이머 트리거: 일정에 따라(예: 5분마다) 실행되는 예약된 작업용입니다.
- 큐 트리거: 스토리지 큐의 메시지를 처리하는 데 사용됩니다.
- Blob 트리거: Azure Blob Storage의 새 Blob 또는 업데이트된 Blob에 반응합니다.
바인딩을 사용하면 함수가 외부 데이터 저장소 및 서비스와 상호 작용할 수 있습니다. 일반적인 바인딩에는 다음이 포함됩니다.
- 스토리지 큐: 스토리지 큐에 메시지를 출력합니다.
- Blob Storage: Azure Blob Storage에서 읽고 쓰는 데 사용됩니다.
- Cosmos DB: Azure Cosmos DB 데이터베이스 서비스에서 문서를 쿼리하고 수정하는 데 사용됩니다.
- Service Bus: Azure Service Bus 큐 및 항목의 메시지를 처리합니다.
올바른 트리거와 바인딩을 선택하면 다양한 기능을 데이터 및 서비스와 통합하여 엔드투엔드 솔루션을 구축하는 데 도움이 됩니다.
지속성 함수 사용
지속성 함수를 사용하면 오류가 발생하거나 다시 시작하는 경우에도 일련의 작업을 안정적으로 수행할 수 있는 상태 저장 함수를 작성할 수 있습니다. 이를 통해 장기 실행 워크플로를 상태 시스템으로 구성할 수 있습니다.
예를 들어 다음으로 구성된 지속성 함수를 사용하여 워크플로를 구축할 수 있습니다.
- 오케스트레이터 기능: 활동 기능의 실행을 적절한 순서로 조정하는 상태 시스템 역할을 합니다.
- 활동 기능: 오케스트레이터 기능에서 호출할 수 있는 작은 독립 작업 단위입니다.
지속성 함수를 사용하면 다음과 같은 이점이 있습니다.
- 안정적인 재시도: 내구성 있는 함수는 활동 기능이 실패할 경우 자동으로 재시도합니다.
- 비동기 호출: 오케스트레이터 함수는 활동 함수를 비동기적으로 실행하고 완료될 때까지 기다릴 수 있습니다.
- 체크포인트: 상태가 지속적으로 체크포인트되므로 앱이 다시 시작되거나 오류가 발생한 후에도 워크플로를 복원할 수 있습니다.
두 가지 활동을 조정하는 간단한 워크플로를 살펴보겠습니다.
소스 {csharp}
복사
[함수이름(“오케스트레이터”)]
공개 정적 비동기 작업 RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext 컨텍스트)
{
var 출력1 = wait context.CallActivityAsync<string>(“DotNetActivity”, “Hello”);
var 출력2 = context.CallActivityAsync<string>(“DotNetActivity”, 출력1)을 기다립니다.
// 결과 반환
출력2를 반환합니다.
}
[함수이름(“DotNetActivity”)]
공개 정적 작업<문자열> 실행(
[ActivityTrigger] 문자열 입력,
ILogger 로그)
{
log.LogInformation($”DotNetActivity 함수 처리됨: {input}”);
return Task.FromResult(input.ToUpper());
}
지속성 함수를 사용하면 복잡한 프로세스를 안정적인 워크플로로 나눌 수 있습니다.
Azure Functions 개발 모범 사례
Azure Functions 개발을 위해 따라야 할 몇 가지 모범 사례는 다음과 같습니다.
- 종속성 주입 사용: 더 나은 테스트 가능성을 위해 종속성 서비스를 함수에 주입합니다.
- 장기 실행 프로세스 방지: 함수는 작은 처리 장치에서 코드를 실행하기 위한 것입니다. 코드 실행을 짧게 유지하세요.
- 불변 데이터 유형 사용: 함수는 상태 비저장이므로 문제를 일으킬 수 있는 가변 유형/부작용을 피하세요.
- 중앙 집중식 오류 처리: 어디에서나 오류를 개별적으로 처리하는 대신 일반적인 오류 처리 논리를 추가합니다.
- 구조화된 로깅: 표준화된 로깅은 디버깅, 모니터링 및 감사 추적에 도움이 됩니다.
- 제한 및 재시도: 지수 백오프로 재시도를 구현하여 제한 오류를 처리합니다.
- 버전 관리: 강력한 버전 트리거, 바인딩 및 입력/출력을 통해 주요 변경 사항을 방지합니다.
- 모니터링 및 계측: 로깅, 모니터링 성능 및 사용량 분석을 위해 Application Insights와 같은 도구를 사용합니다.
- 컨텍스트 바인딩 사용: 추가 종속성 없이 앱 설정과 같은 항목에 액세스하기 위해 컨텍스트 바인딩을 활용합니다.
이러한 모범 사례를 따르면 Azure Functions를 사용하여 강력하고 안정적이며 확장 가능한 서버리스 애플리케이션을 구축하는 데 도움이 됩니다.
Azure에 함수 배포
함수가 준비되면 Azure CLI, PowerShell, Visual Studio를 통해 또는 Azure Functions 핵심 도구 CLI에서 직접 Azure에 배포할 수 있습니다.
복사
func azure functionapp 게시 <function-app-name>
그러면 함수 프로젝트 폴더가 Azure 함수 앱에 게시됩니다. Azure에 함수를 배포할 때 얻을 수 있는 몇 가지 주요 이점은 다음과 같습니다.
- 자동 확장 – 들어오는 요청 볼륨 또는 시간 트리거를 기준으로 기능이 확장됩니다.
- 고가용성 – 데이터 센터 전체의 여러 인스턴스가 고가용성을 제공합니다.
- 모니터링 및 로깅 – Application Insights와 같은 도구를 사용하여 성능, 오류 등을 모니터링합니다.
- 서버리스 플랫폼 – 프로비저닝/관리할 서버가 없습니다. 코드에만 집중하세요.
- 지속적인 배포 – 코드 변경 시 자동화된 배포를 위해 CI/CD 파이프라인을 사용합니다.
Azure는 모든 인프라를 처리하고 유휴 비용을 방지하며 서버리스 애플리케이션을 대규모로 안정적으로 실행할 수 있는 완전한 서버리스 플랫폼을 제공합니다.
결론
Azure Functions를 사용한 서버리스 컴퓨팅을 통해 개발자는 모든 인프라 및 운영 관리를 Azure로 오프로드하면서 비즈니스 논리에 집중할 수 있습니다. ASP.NET Core 개발자 채용 옵션을 포함한 기본 .NET 개발 지원을 통해 C#에서 강력한 서버리스 솔루션을 쉽게 구축할 수 있습니다. 트리거, 바인딩 및 지속성 함수를 통해 개발자는 엔드투엔드 이벤트 기반 아키텍처 및 워크플로를 상태 비저장 및 상태 저장 기능으로 구축할 수 있습니다. 모범 사례와 결합된 Azure Functions를 사용하면 단순성과 규모로 서버리스 애플리케이션을 클라우드에 구축하고 배포할 수 있습니다.