Cloud Service 레시피 – Windows Azure Cloud Service 프로젝트 안에서 실행 환경을 구분하는 방법

안녕하세요. Windows Azure MVP 남정현입니다.

Windows Azure Cloud Service에서 실행되는 응용프로그램을 개발하는 과정에서 자주 필요성을 느끼게 되는 기능 중 하나는 지금 코드가 호스팅되는 위치가 실제 Windows Azure 데이터 센터 내인지, 에뮬레이터 내인지, 아니면 일반적인 서버 환경인지를 알고자하는 경우입니다. 이러한 위치 구분이 필요한 이유는 바로 코드 재사용성을 위해서인데, 정확하게 구분하기가 쉽지 않은 점이 있습니다.

여기에 대한 다양한 방법과 Workaround가 존재하지만 추천할만한 코드 Snippet이 있어서 글로 정리하여 올려봅니다.

RoleEnvironment.IsAvailable 속성

실제 Windows Azure Cloud Service 환경이거나 에뮬레이터 환경에서 실행되는 경우를 알아낼 수 있는 방법입니다. 이 방법은 Windows Azure 런타임을 사용할 수 있는지 없는지에 대한 구분으로 활용할 수 있고, 에뮬레이터인지 아닌지는 구분할 수 없습니다.

사용 예시

public static bool EnsureRunningInAzureOrDevFabric()
{
    return RoleEnvironment.IsAvailable;
}

RoleEnvironment.DeploymentId 속성

실제 Windows Azure Cloud Service 상에 패키지를 Deploy해서 실행 중인 경우 이 속성에 Guid 값이 부여되므로 .NET Framework FCL이 제공하는 System.Guid.Parse 정적 메서드를 사용하여 Guid로 파싱할 수 있습니다. 파싱에 성공한다면 실제 환경, 그렇지 않다면 에뮬레이터 환경으로 구분할 수 있습니다.

사용 예시

public static bool EnsureRunningInAzure()
{
    Guid guidId;
    return (RoleEnvironment.IsAvailable &&
        Guid.TryParse(RoleEnvironment.DeploymentId, out guidId));
}

한 번만 조회하기

최대한의 효율성을 기하기 위하여, 단순 작업이지만 같은 작업을 여러번 수행할 필요가 없겠지요. 논리적으로 생각해보면, 이와 같은 사항이 코드를 실행하는 실행 시점에서 변경될 일은 2013년 현재의 Windows Azure 플랫폼 스펙으로 볼 때에는 없습니다. 클라우드 서비스가 아닌 환경으로 실행 중인 가상 컴퓨터가 별도 VM으로 분리 이동하는 기능은 제공되지 않으며, 일반적으로 개발자 환경과 실제 데이터센터 환경 사이에 실시간으로 VM을 주고 받을 일 또한 없습니다. 따라서 위의 메서드에 대한 호출 결과를 정적 생성자를 호출하는 시점에만 부르거나 Lazy Initialization으로 다루더라도 전혀 기능에 이상이 없을 것입니다.

유틸리티 클래스로 만들기

아래의 소스 코드는 http://stackoverflow.com/questions/6160947/how-can-i-determine-if-i-am-running-locally-on-my-pc-or-on-the-cloud 에서 발췌한 것임을 밝혀둡니다.

using Microsoft.WindowsAzure.ServiceRuntime;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Sample

{

    public static class CloudEnvironment

    {

        private static bool m_IsRunningAzure = GetIsRunningInAzure();

        private static bool GetIsRunningInAzure()

        {

            Guid guidId;

            if (RoleEnvironment.IsAvailable &&

                Guid.TryParse(RoleEnvironment.DeploymentId, out guidId))

                return true;

            return false;

        }

        public static bool IsRunningInAzure()

        {

            return m_IsRunningAzure;

        }

        private static bool m_IsRunningAzureOrDevFabric = GetIsRunningInAzureOrDevFabric();

        private static bool GetIsRunningInAzureOrDevFabric()

        {

            return RoleEnvironment.IsAvailable;

        }

        public static bool IsRunningInAzureOrDevFabric()

        {

            return m_IsRunningAzureOrDevFabric;

        }

    }

}

댓글 남기기