Azure 작업자 역할에 OWIN 호스트하기
- 본 번역문서의 원문은 Host OWIN in an Azure Worker Role www.asp.net 입니다.
본문에서는 OWIN 응용 프로그램을 Microsoft Azure 작업자 역할(Microsoft Azure Worker Role)에서 자체 호스트 하는 방법을 살펴봅니다. OWIN(Open Web Interface for .NET)은 .NET 웹 서버와 웹 응용 프로그램 사이의 추상화를 정의합니다. OWIN은 웹 응용 프로그램을 서버로부터 분리함으로써, 웹 응용 프로그램을 Azure Worker Role 같은 IIS 외부의 별도 프로세스에서 자체 호스트 하기에 이상적인 구조를 만들어줍니다.
본 자습서에서 여러분은 예제 코드를 통해서 실제로 OWIN 응용 프로그램을 Microsoft Azure 작업자 역할에서 자체 호스트 하는 방법을 배워보게 될 것입니다. Microsoft Azure 작업자 역할에 대한 보다 자세한 정보는 Azure Execution Models 문서를 참고하시기 바랍니다.
본문에 사용된 소프트웨어들의 버전
Microsoft Azure Project 생성하기
먼저 관리자 권한으로 Visual Studio를 실행합니다. 로컬에서 Azure Compute Emulator를 이용해서 응용 프로그램을 디버깅하려면 관리자 권한이 필요하기 때문입니다.
그리고 파일(File) 메뉴에서 새로 만들기(New)를 선택한 다음, 다시 프로젝트(Project)를 선택합니다. 새 프로젝트(New Project) 대화 상자가 나타나면 좌측의 설치된 템플릿(Installed Templates)에서 Visual C# 하위의 Cloud를 선택한 다음, Azure 클라우드 서비스(Azure Cloud Service) 템플릿을 선택합니다. 프로젝트 이름을 "AzureApp"로 지정하고 확인(OK) 버튼을 클릭합니다.
잠시 후, 새 Microsoft Azure 클라우드 서비스(New Microsoft Azure Cloud Service) 대화 상자가 나타나면 작업자 역할(Worker Role)을 마우스로 더블 클릭합니다. 기본으로 지정된 이름("WorkerRole1")을 그대로 남겨 두고, 확인(OK) 버튼을 클릭합니다. 그러면 솔루션에 작업자 역할이 추가됩니다.
여기까지 작업을 마쳤다면 다음과 같은 두 가지 프로젝트들이 포함된 솔루션이 구성되었을 것입니다:
- "AzureApp" 프로젝트는 Azure 응용 프로그램의 역할과 구성을 정의합니다.
- "WorkerRole1" 프로젝트에는 작업자 역할의 코드를 작성하게 됩니다.
본 자습서에서는 간단하게 한 가지 역할만 사용하고 있지만, 일반적으로 Azure 응용 프로그램은 여러 가지 역할을 포함할 수 있습니다.
OWIN Self-Host 패키지 추가하기
계속해서 이번에는 도구(Tools) 메뉴에서 NuGet 패키지 관리자(Library Package Manager)를 선택한 다음, 패키지 관리자 콘솔(Package Manager Console)을 선택합니다. 그리고 패키지 관리자 콘솔(Package Manager Console) 창이 나타나면 다음 명령을 입력합니다:
Install-Package Microsoft.Owin.SelfHost
HTTP 끝점(Endpoint) 추가하기
다시 솔루션 탐색기에서 AzureApp 프로젝트의 노드들을 확장하고, 역할(Roles) 노드 하위의 WorkerRole1 노드를 마우스 오른쪽 버튼으로 클릭한 다음, 속성(Properties)을 선택합니다.
끝점(Endpoints) 탭을 선택하고 끝점 추가(Add Endpoint) 버튼을 클릭해서 새로운 끝점을 추가합니다.
그리고 새로 추가된 끝점의 프로토콜(Protocol) 드랍다운 리스트에서 "http"를 선택합니다. 공용 포트(Public Port)와 개인 포트(Private Port)는 모두 80번으로 지정합니다. 이 포트 번호들은 서로 달라도 무방한데, 공용 포트는 클라이언트들이 역할에 전송한 요청을 수신할 때 사용되는 포트 번호입니다.
OWIN 시작 클래스(Startup Class) 생성하기
마우스 오른쪽 버튼으로 솔루션 탐색기에서 WorkerRole1 프로젝트를 클릭한 다음, 추가(Add), 클래스(Class)를 차례대로 선택해서 새로운 클래스를 추가합니다.
이때 클래스의 이름은 Startup
으로 지정합니다.
자동으로 생성된 기본 코드를 다음의 코드로 대체합니다:
using Owin; namespace WorkerRole1 { public class Startup { public void Configuration(IAppBuilder app) { app.UseWelcomePage("/"); } } }
이 예제 코드에 사용된 UseWelcomePage
확장 메서드는 사이트가 정상적으로 동작하는지를 가늠할 수 있게 해주는 간단한 HTML 페이지를 응용 프로그램에 추가해줍니다.
OWIN 호스트 시작하기
이번에는 WorkerRole.cs 파일을 엽니다. 이 클래스에는 작업자 역할이 시작되거나 중지될 때 실행되는 코드가 정의되어 있습니다.
먼저 다음과 같은 using 구문을 추가합니다:
using Microsoft.Owin.Hosting;
그리고 WorkerRole
클래스에 IDisposable 형식의 멤버를 추가합니다:
public class WorkerRole : RoleEntryPoint
{
private IDisposable _app = null;
// ....
}
또한 다음과 같이 OnStart
메서드에 호스트를 시작하기 위한 코드를 추가합니다:
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
// New code:
var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
string baseUri = String.Format("{0}://{1}", endpoint.Protocol, endpoint.IPEndpoint);
Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), "Information");
_app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
return base.OnStart();
}
이 메서드의 코드에 사용된 WebApp.Start 메서드는 OWIN 호스트를 시작해줍니다.
그리고 이 메서드에는 Startup
클래스의 이름이 형식 매개변수로 전달되는데, 그러면 규약에 따라 호스트가 이 클래스의 Configure
메서드를 호출하게 됩니다.
마지막으로 _app 인스턴스를 안전하게 제거하기 위해서 OnStop
메서드를 재정의합니다:
public override void OnStop()
{
if (_app != null)
{
_app.Dispose();
}
base.OnStop();
}
지금까지 설명한 작업들이 모두 반영된 WorkerRole.cs 파일의 완전한 코드는 다음과 같습니다:
using Microsoft.Owin.Hosting;
using Microsoft.WindowsAzure.ServiceRuntime;
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;
namespace WorkerRole1
{
public class WorkerRole : RoleEntryPoint
{
private IDisposable _app = null;
public override void Run()
{
Trace.TraceInformation("WorkerRole entry point called", "Information");
while (true)
{
Thread.Sleep(10000);
Trace.TraceInformation("Working", "Information");
}
}
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
string baseUri = String.Format("{0}://{1}", endpoint.Protocol, endpoint.IPEndpoint);
Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), "Information");
_app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
return base.OnStart();
}
public override void OnStop()
{
if (_app != null)
{
_app.Dispose();
}
base.OnStop();
}
}
}
이제 솔루션을 빌드하고 F5 키를 눌러서 Azure Compute Emulator를 이용해서 응용 프로그램을 로컬에서 실행해봅니다. 여러분의 방화벽 설정 상태에 따라, emulator가 방화벽을 통과할 수 있도록 허용해야 할 수도 있습니다.
참고로 Compute Emulator는 끝점에 로컬 IP 주소를 할당하는데, Compute Emulator의 UI를 살펴보면 IP 주소를 확인할 수 있습니다. 작업 표시줄의 알림 영역에서 Compute Emulator 아이콘을 마우스 오른쪽 버튼으로 클릭한 다음, Show Compute Emulator UI를 선택합니다.
그런 다음, Service Deployments 노드 하위에 존재하는 deployment[id] 노드 하위의 Service Details 노드를 선택해보면 IP 주소를 확인할 수 있습니다.
이제 웹 브라우저를 실행하고 http://127.0.0.1:80
과 같이 http://address 로 이동해봅니다.
(address 부분에는 Compute Emulator에 의해서 할당된 IP 주소를 입력합니다.)
그러면 다음과 같은 OWIN 환영 페이지가 나타날 것입니다:
Azure에 배포하기
이번 절의 과정을 직접 따라 해보려면 Azure 계정이 필요합니다. 만약 계정이 없더라도 약간의 시간만 투자하면 테스트에 충분한 1개월 무료 평가판 계정을 사용할 수 있습니다. 더 자세한 정보는 Azure 무료 평가판 소개 페이지를 참고하시기 바랍니다.
다시 솔루션 탐색기에서 AzureApp 프로젝트를 마우스 오른쪽 버튼으로 클릭하고, 게시(Publish)를 선택합니다.
만약 Azure 계정에 로그인하지 않은 상태라면 먼저 로그인(Sign In) 버튼을 클릭하고 지시에 따릅니다.
로그인을 마쳤다면, 사용할 구독을 선택하고 다음(Next) 버튼을 클릭합니다.
새로 만들 클라우드 서비스의 이름을 입력하고 지역 또는 선호도 그룹을 선택한 다음, 만들기(Create) 버튼을 클릭합니다.
마지막으로 게시(Publish) 버튼을 클릭합니다.
그러면 Microsoft Azure 활동 로그(Azure Activity Log) 창에 배포가 진행되는 상황이 나타날 것입니다.
잠시 후, 응용 프로그램의 배포가 완료되면 웹 브라우저에서 http://[appname].cloudapp.net/
URL로 이동하여 결과를 확인할 수 있습니다.
여기서 appname 부분에는 방금 입력했던 클라우드 서비스의 이름을 입력하면 됩니다.
추가 자료
이 기사는 2014년 4월 11일에 최초 작성되었습니다.
- Katana 프로젝트 2015-07-13 08:00
- OWIN 및 Katana 시작하기 2015-07-20 08:00
- OWIN 시작 클래스 감지방식 2015-07-27 08:00
- Katana에서 Windows 인증 사용하기 2015-08-03 08:00
- IIS 통합 파이프라인과 OWIN 미들웨어 2015-08-10 08:00
- Azure 작업자 역할에 OWIN 호스트하기 2015-08-17 08:00
- OWIN OAuth 2.0 권한 부여 서버 2015-09-07 08:00