Windows Azure + Tomcat 작업담 #1: Startup Task에 관하여

이번 Windows Azure SDK v1.3에서 가장 많이 좋아진 부분이 있다고 한다면 역시 StartupTask에 관한 것과 관리자 모드의 허용입니다. 이전 v1.2까지만 하더라도 네이티브 코드는 허용하면서도 관리자 권한을 허용하지 않았기 때문에 클라우드 컴퓨팅에서 원하는 소프트웨어나 컴포넌트를 자유롭게 사용할 수 없다는 큰 문제가 있었습니다만 이러한 제약이 사라진 것이지요. 아래의 XML 구문을 살펴보도록 하겠습니다.

<Startup>
  <Task commandLine=”Register.cmd” executionContext=”elevated” taskType=”simple” />
</Startup>

위의 XML 구문은 클라우드 서비스 정의 파일 (CSDEF)의 내용 중 일부를 발췌한 것입니다. commandLine에 들어가는 것이 시작 과정에서 호출할 외부 응용프로그램 파일의 이름에 관한 것이고, executionContext는 권한 상승 필요 여부에 관한 것이며, taskType은 작업을 처리할 방법에 관한 설정입니다.

commandLine 속성: Worker Role의 경우 프로젝트 출력 디렉터리와 경로가 같습니다. 그러나 Web Role의 경우 프로젝트 출력 디렉터리 아래의 Bin 디렉터리를 기준으로 파일을 찾게 됩니다. Web Role의 경우 이러한 동작은 ASP.NET 응용프로그램의 보안 상 이슈와 맞물리는 것으로, Bin 디렉터리 아래의 파일 내용은 ASP.NET 차원에서 보호되고 외부로부터의 요청이 거부된다는 특성을 이용하는 것임을 숙지하시면 편리합니다.

executionContext 속성: 이 속성이 이번 SDK 업데이트에 있어서 백미라고 하는 관리자 모드에 관한 것입니다. limited로 설정하면 기존의 RoleEntry 클래스에서 사용했던 것과 마찬가지의 제한된 동작을 수행하게 되는 것이고, elevated로 설정하면 관리자 권한 위임을 받아서 동작하는 것입니다. 소프트웨어를 설치하거나, 응용프로그램 디렉터리에 추가적인 파일 액세스가 필요한 경우 elevated 속성을 지정하여 작업을 수행할 수 있습니다.

taskType 속성: 이 속성은 실행하려는 작업의 구체적인 형태를 정의하는 것입니다. 기본적으로 이 속성은 지정하지 않을 경우 자동으로 simple 값을 사용하는데, 이것은 해당 작업에 관련된 프로세스의 실행이 끝날 때까지 Agent의 실행을 중단한다는 의미입니다. 대부분 Task Type으로 지정하는 작업들은 사전 요구 사항 (Prerequisites)을 만족시키기 위한 활동들이기 때문에 이 설정이 기본값이 됩니다. 그 외에 foreground와 background는 해당 작업에 관련된 프로세스의 실행 완료 여부와는 관계없이 작업을 진행하는 것이지만, foreground는 우리가 잘 아는 대로 %comspec% 환경 변수와 연결된 명령줄 인터프리터를 Foreground Application으로 실행하고, background는 데스크 탑 윈도에 드러나지 않게 Background Application으로 실행하는 것입니다. 실제 클라우드 환경에서 foreground나 background는 큰 차이가 없습니다.

간혹 taskType을 Simple Mode와 Foreground를 놓고 잘못 이해할 수 있는데 결과가 상당히 다릅니다. 예를 들어, Simple Mode를 이용하여 어떤 파일의 압축을 풀려고 시도하면 Simple Mode는 압축이 모두 풀릴 때까지 대기 상태에 있으므로 진입점 DLL에서 압축이 풀린 디렉터리로의 접근이 완전하게 의미를 가지지만, Foreground의 경우 (Background 역시 마찬가지입니다) 한창 압축이 풀리는 시점에서 진입점 DLL의 액세스가 발생하므로 어떤 때에는 찾는 파일이 있을 수도 있고 또 어떤 때에는 찾는 파일이 없을 수도 있는 이상한 현상이 발생합니다. 이러한 문제에 빠지게 되면 설정을 다시 검토해 보기 전까지는 문제 진단이 쉽지 않을 수 있으므로 주의해야 겠습니다.

댓글 남기기