Get-AzureWebsite 명령 버그

Azure PowerShell 명령을 사용하다보면 다음 오류를 만날 수 있습니다.

System.ArgumentException: Requested value 'VS2015' was not found.

이것은 Azure Web Apps 혹은 Azure PowerShell의 버그로 보입니다. 이 포스트는 왜 이 오류가 발생하는지와 우회하는 방법을 설명합니다.

envicase의 API는 Microsoft Azure의 웹 서비스를 위한 PaaS(Platform as a Service)인 Web Apps에 호스팅됩니다. 배포는 지속 배포(Continuous Deployment) 프로세스의 자동화된 PowerShell 명령을 통해 수행됩니다. 서버측 환경은 내부적으로 사용하는 개발 환경과 운영 환경으로 나뉘고 운영 환경의 API 인스턴스는 Blue-Green 배포와 A/B 테스팅을 위해 production 슬롯과 staging 슬롯으로 구성됩니다.

프로그래머들은 종종 단위 테스팅이나 로컬 작업 환경에서 재현하고 확인하기 어려운 문제를 살펴보기 위해 개발 환경 API 인스턴스에 Debug 구성으로 빌드된 바이너리를 배포하고 원격 디버깅(remote debugging) 기능을 사용합니다. 그리고 아주 가끔씩은 개발 환경이 아닌 운영 환경에서만 재현 가능한 현상을 조사하기 위해 외부 트래픽이 차단된 staging 슬롯(혹은 별도의 임시 슬롯)을 대상으로 원격 디버깅을 수행하기도 합니다.

그런데 Web Apps는 원격 디버깅 선택사항에 Visual Studio 버전을 선택하도록 되어있습니다.

Remote debugging

이 때 Visual Studio 버전이 2015로 선택되어있는 경우 현재 Get-AzureWebsite PowerShell 명령은 다음 오류 메시지와 함께 실패합니다.

System.ArgumentException: Requested value 'VS2015' was not found.

지속 배포의 PowerShell 스크립트가 Get-AzureWebsite 명령을 사용하고 있다면 Visual Studio 2015에서 Web Apps 인스턴스를 대상으로 원격 디버깅을 수행한 이후부터 지속 배포는 실패하게됩니다.

Requested value '...' was not found. 메시지는 .NET 열거형을 사용하다보면 만날 수 있습니다. C# REPL에서 다음 코드를 실행해보면 예외가 발생합니다.

enum MyEnum
{
    Foo
};
Enum.Parse(typeof(MyEnum), "Bar");
System.ArgumentException: Requested value 'Bar' was not found.

예외는 문자열 값과 대응되는 이름을 가진 열거형 필드를 찾을 수 없다는 메시지를 가지고 있습니다.

Get-AzureWebsite 명령의 경우도 동일한 이유로 실패하는 것으로 강하게 추정됩니다. Microsoft Azure SDK for .NET 프로젝트 ce6b6e1 커밋의 WebSiteOperations.GetAsync() 메서드를 보면 3404번째 줄에 다음과 같은 코드가 있습니다.

Enum.Parse(typeof(RemoteDebuggingVersion), ((string)remoteDebuggingVersionValue), true)

remoteDebuggingVersionValue라는 변수의 문자열 값을 RemoteDebuggingVersion 열거형으로 변환하는 코드죠. 그런데 RemoteDebuggingVersion 열거형은 Visual Studio의 2015 버전을 나타내는 필드를 가지지 않습니다. 동일한 커밋의 RemoteDebuggingVersion.cs 파일을 열어보면 확인할 수 있습니다. 주석을 제외한 코드는 다음과 같습니다.

using System;
using System.Linq;

namespace Microsoft.Azure.Management.WebSites.Models
{
    public enum RemoteDebuggingVersion
    {
        VS2012 = 0,
        VS2013 = 1,
    }
}

그렇기 때문에 remoteDebuggingVersionValue 변수가 "VS2015"라는 값을 가진다면 코드가 실패합니다.

ce6b6e1 커밋이 2015년 5월에 작성된 것을 고려하면 아직까지 이 문제가 남아있는 것이 많이 아쉽습니다. 게다가 위 두 코드는 주석을 읽어보면 도구에 의해 자동으로 생성된 코드이기 때문에 직접 pull request를 작성하는 것도 여의치 않습니다.

이 문제를 우회하는 방법은 간단합니다. 원격 디버깅을 마쳤다면 Wep Apps 설정에서 Visual Studio 버전을 2012나 2013으로 변경해주세요. Get-AzureWebsite 명령은 다시 잘 동작할 겁니다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중