요즈음 클라우드 서비스들을 이용하다보면, Windows 서버 운영체제를 통해서 확장성있는 클라우드를 만들고자 하는 경우가 자주 있습니다. 일반적인 웹 사이트를 구축할 때에도 마찬가지이고, 당연히 KT UCLOUD나 Amazon과 같은 환경에서도 같은 노력이 뒷받침이 되어야 하지요. 그리고 제가 주 전공으로 하고 있는 Windows Azure 역시, 첫 배포 때에는 간과하기 쉬운 점이 바로 로드 밸런싱 환경이라는 점입니다.

이러한 로드밸런싱 환경을 만들때에는, 이전에 구축해본 경험이 없는 관리자가 개발자 입장에서는 상당히 어려운 문제에 봉착하게 될 가능성이 많습니다. 특히 요즈음 웹 환경에서는 당연하게 사용하는 세션이나 쿠키에 관련된 설정들이 로드밸런싱 환경에서 기대했던 것과 다르게 동작해서 좌절하는 경험을 많이들 하실텐데요, 제가 오늘 블로그에 올리는 것은 ASP.NET에 관한, 그리고 IIS 7에 관한 내용입니다. (PHP나 JSP 개발자분들께서도 공감하실 수 있는 부분이 있을 것입니다.)

로드밸런싱 환경을 잘 알고 구축할 수 있다면, 앞으로 나오게될 어떤 종류의 클라우드 서비스이든 관계없이 문제를 정확하게 해결할 수 있을 것입니다. 사실 클라우드 기반의 웹 서비스는 달리 표현하면, 기본 골자는 로드밸런싱에 기반을 두고 있는 것이고, 그 이후의 확장성 전략을 클라우드 솔루션으로 채우는 것과 같다고 말할 수 있습니다. (어떤 뼈대를 사용할 것인지는 전적으로 여러분들의 선택에 달린 것입니다.)

로드 밸런싱 환경이란?

로드 밸런싱 기술 자체는 상당히 오래된 것입니다. 이름에서 알 수 있듯이, 몰려오는 트래픽을 내부적으로 분산하여 특정 서버 컴퓨터로 연결이 몰려 서비스가 사용 불가 상태로 빠지는 것을 "지연"시키거나 "완화"시키는 것에 목적이 있습니다. 로드 밸런싱의 기술적 개념도는 다음과 같습니다. (이미지 출처: http://msdn.microsoft.com/en-us/library/ff650667.aspx)

다양한 상황에서 로드밸런싱이 쓰이겠지만 가장 일반적으로는 웹 환경에서 많이 쓰입니다. 연결을 오래 유지할 필요가 없으면서도, 짧은 시간 내에 빠른 연결 회전을 보이는 웹 프로토콜에서 가장 중요한 것은 바로 신속성인데, 분산 처리를 하지 않는 경우에는 필연적으로 서버 컴퓨터가 받아들일 수 있는 동시 연결 한계치에 금방 치닫게 됩니다. 그러나 로드 밸런싱을 정확히 사용하면 이러한 한계치에 치닫게 되는 속도가 로드 밸런싱에 참가하는 컴퓨터의 댓수만큼 반비례하게 됩니다. 그리고 이 때 하나의 웹 사이트를 위한 로드 밸런싱 서비스에 멤버로 참여하는 서버 컴퓨터들을 묶어서 "웹 팜"이라고 정의를 하는 것이지요. 더 일반적으로는 "서버 팜"이라고도 합니다.

잠시 다른 이야기로 넘어가자면, 요즈음 대두되는 클라우드 컴퓨팅은 관리 측면에서 봤을 때, 충분한 대역폭을 보장하는 연결과 매우 뛰어난 성능을 가진 로드 밸런서를 이용하여 연결을 분산하는 작업을 수행하는 것입니다. 그리고 웹 팜 안에 참여하는 컴퓨터의 유형에 있어서는 이전과 다른 점이 하나 있는데, 마치 구름과 같이 수축과 팽창을 자유자재로 한다는 것입니다. 물론 이런 수축과 팽창이 가능함은 내부적으로 가상화 솔루션을 이용했다거나 여기에 대응할 수 있는 알고리즘을 사용했다는 가정이 깔려있는 것입니다.

정말 완벽하고 정확하게 구축했다면, 적은 전원이나 자원 공급으로도 충분히 웹 팜이 유지가 될 수도 있고, 필요하다면 웹 팜의 크기가 엄청나게 커질 수도 있겠지요. 이걸 여러분이 관리하신다면 프라이빗 클라우드, 신뢰할 수 있는 IT 기업이 관리한다면 퍼블릭 클라우드가 된다고 보실 수 있겠습니다. 그러나, 클라우드 컴퓨팅이 만능약처럼 들릴 수 있는 부분이 있지만 정확히 알아야 할 것은 클라우드 컴퓨팅 역시 이 로드 밸런싱을 기초로 만들어지는 것이고, 여러분이 운영할 수 있는 한계에까지 트래픽이 몰리거나, 이런 일을 하는 IT 업체에게 지불할 수 있는 재정의 한계에까지 트래픽이 몰린다면 이것이 여러분이 생각할 수 있는 클라우드의 한계입니다. 무제한이라고 해서 값이 저렴하거나 무료에 수렴하는게 아님을 명확히 이해하고 있어야 합니다.

웹 로드 밸런싱을 위한 이야기

다시 본론으로 돌아와서, 웹을 로드 밸런싱할 수 있으려면 무엇을 검토해야 할까요? 가장 중요한 것은 웹 서버에 참여하는 각각의 컴퓨터 자체에는 "절대로" 컴퓨터의 고유한 정보를 가지고 있으면 안된다는 점입니다. 매우 단순한 이야기같지만 이러한 원칙을 지키지 않도록 설계되어있는 것이 지금 이 시점까지의 서버 컴퓨팅 기술들의 대다수의 원칙입니다. 간단한 예를 들어볼까요?

여러분이 일상적으로 사용하는, 웹을 통한 파일 업로드 기능을 담당하는 간단한 웹 앱이 있다고 가정해 보겠습니다. 이 웹 앱은 서버가 한 대 일때에는 참 쉽고 빠르게 설치해서 쓸 수 있었습니다. 당연히, 설치를 잘 했다면, 사용자가 웹 페이지를 방문해서 파일을 업로드하면 웹 서버가 그것을 알아보고 파일을 회수해서 하드 디스크 어딘가에 저장하겠지요. 그러나 시간이 지나서 이 웹 앱의 기능을 업그레이드하고 좀 더 많은 사용자들이 파일을 저장하고 다운로드할 수 있도록 만들어보고자 해서 로드 밸런싱 환경을 구축하여 베타 테스트를 시작했습니다. 그런데 어떤 문제들이 생겼을까요?

앞서 이야기한 기술적인 특성때문에, 사용자들은 분명히 조금전까지 파일을 업로드했었는데 페이지를 다시 와서보니 파일이 업로드되지 않은 상태로 페이지가 나와서 혼란스러워합니다. 혹은 파일을 어디로 빼돌린거냐며 분노하는 사람들도 있구요. 그래서 몇 번 F5키를 누르다보면 "어라?"하고 놀라게 됩니다. 조금 전에 업로드했던 파일이 다시 나타나니까요. 그러고나서 그 파일을 다운로드하려고 링크를 클릭하면 이번엔 또 다시 404 오류를 만납니다. 이제 사용자들은 이 서비스에 대해서 대단한 분노와 원성을 쏟아낼 것입니다. 서비스 상태에도 일관성이 없을 뿐 아니라 불안정한것 같다. 믿을 수 없다면서요.

이것이 일선 IT 현장에서 로드 밸런싱이나 클라우드를 처음 접목했을 때 겪는 "가장 흔하고 일반적인 장애"입니다. 더 안타까운 것은, 이것을 신 기술에 의한 책임으로 회피하고 문제시하는 것입니다. 문제의 본질을 정확히 알고 있다면 이렇게 말하는 것이 왜 잘못인지도 금방 알 수 있을 것입니다.

여기서 든 예제처럼, 이 웹 앱의 문제는 단순히 업로드한 파일을 자신의 컴퓨터에 저장하려고 했다는 데에 문제가 있습니다. 로드 밸런싱 멤버로 참여하는 컴퓨터가 자신의 상태를 중요하게 여기면, 다음번에 이어받는 다른 서버 컴퓨터의 입장에서는 이전에 그 컴퓨터가 무엇을 했는지 알 길이 없습니다. 그저, 찾고자 하는 내용이 없음을 이야기하는 수 밖에 없습니다. 이런 상황이 반복되면서 서비스 전체는 들어올때와 나갈때가 전혀 다른, 일관성이 없고 이상한 서비스가 되는 것입니다.

이 문제를 해결하기 위하여 어떻게 수정해야 할까요? 답은 간단합니다. 파일 저장소를 로드 밸런싱 멤버 컴퓨터 내부가 아닌, 여러 멤버 컴퓨터들이 같이 이용할 수 있는 공용 저장소로 바꾸는 것입니다. 가장 간단한 방법은 네트워크 UNC 경로로 이용할 수 있는 스토리지가 있을 수 있습니다.

여기서 궁금한 점이 하나 더 있는데, 그렇다면 로드 밸런싱에 의하여 애써 분산한 서비스가 다시 모이는 것이 아니냐고 반문할 수도 있습니다. 그런데 사실, 생각외로 사용자들이나 웹 크롤러와 같이 인터넷 상에서 발생하는 별 뜻없이 바쁘게 만드는 다양한 유형의 트래픽을 웹 팜 수준에서 한 번은 로드 밸런싱을 해주는 것 만으로도 실제 스토리지에 대한 요구 사항은 획기적으로 감소한다는 점입니다. 거기다, 역할 분담도 정확히 할 수 있으며 스토리지 자체에 대한 요구 사항이 폭증하는 것을 방지하기 위하여 기술적으로는 좀 더 복잡해질 수 있지만 캐싱 기능을 사용할 수도 있습니다. 이렇게 함으로서, 우리가 흔히 잘 아는 클라우드 서비스의 시작을 뗄 수 있게 됩니다.

기술적인 이야기 1 - 세션 처리 방법 바꾸기

그렇다면 IIS와 ASP.NET에서는 이런 이상한 상황을 예방하고 신뢰할 수 있는 서비스를 만들기 위해서 어떤 수정 사항을 반영해야 하는 것일까요? 제가 이제까지 인터넷 상으로 자료 조사를 해왔던 것은 모두 제각기 흩어져있는 정보들이었고 이것을 한 번에 취합할 수 있는 방법을 오늘 블로그 포스팅을 통하여 소개할까 합니다.

기본적으로 ASP.NET은 세션 처리를 IIS 프로세스 안에서 수행하도록 되어있습니다. 가장 동선도 짧고, 신속하게 반응하기 때문입니다. 그러나 로드 밸런싱 환경에서 이는 당연히 "채택하면 안되는" 기법입니다. 이 방법은 web.config 파일 안의 <sessionState> 요소에서 변경할 수 있는 부분으로, <configuration> 요소 아래의 <system.web> 요소 아래에서 없는 경우 새로 지정할 수 있습니다. <sessionState> 요소의 mode 속성의 값을 변경하면 됩니다. 지금 이야기한 부분은 mode 속성이 InProc으로 지정되어있거나, 아무것도 지정되어있지 않을 때 .NET Framework의 글로벌 web.config 설정을 바꾸지 않은 경우 기본으로 지정되는 설정입니다.

IIS 7에서 볼 수 있는 아래 그림과 같은 설정도 이 XML 파일의 수정을 텍스트 에디터 없이 수정하는 것입니다.

로드 밸런싱 환경에서 정상적으로 동작하는 웹 사이트를 만들기 위해서는 mode의 설정 값을 InProc 대신 StateServer나 SQLServer로 바꾸어야 하는데, 양쪽 값 모두 장단점이 있습니다. StateServer의 경우 기본적으로는 꺼져있는 ASP.NET State Service라는 NT 서비스가 제공하는 별도의 서버를 이용하는 방식이고, SQLServer는 이름에서 알 수 있듯이 실제 SQL Server를 사용하여 세션을 구현하는 방식입니다. 데이터베이스 서버의 성능이 세션을 모두 수용할 수 있을만큼 획기적으로 뛰어나거나, 세션 서버가 죽었다가 살아나도 로그아웃 처리가 안되게 한다던가, 혹은 여러 로드 밸런싱 사이트 사이에서 세션 공유를 안전하게 할 방법이 필요하다면 이 모드를 사용할 수 있습니다. 이에 비하여 StateServer는 별도의 SQL 서버 없이도 간편하게 구축할 수 있는 방법을 제공하긴 하지만, 세션 서버가 죽었다 살아날 경우 내용이 없어지는 휘발성 세션입니다.

양쪽 모드 모두 중요한 것은 멤버로 참여하는 웹 서버 컴퓨터 밖에 상태를 보관해야 한다는 것이 키 포인트로, 이것을 지키지 않고 멤버 컴퓨터 안에 이런 설정을 구축하면 전혀 나아지는 것이 없습니다. 그리고 당연한 이야기이지만 멤버 컴퓨터로 참여하는 모든 웹 서버가 같은 설정을 가지고 있어야 합니다.

StateServer와 SQLServer 모드를 구현하는 방법에 대한 자세한 내용은 아래 아티클을 참고하시면 되겠습니다.

http://msdn.microsoft.com/ko-kr/library/ms178586.aspx

기술적인 이야기 2 - ASP.NET 사이트 간에 립싱크 맞추기

세션을 공유하는 것 이외에, ASP.NET은 내부적으로 Machine Key라는 것을 사용합니다. Machine Key의 용도는 ASP.NET 안에서 참 다양한데, 가장 대표적으로는 클라이언트와 서버 사이에 쿠키 정보를 주고 받을 때 암호화하기 위한 수단으로 이용하는 것이 유명한 사례입니다. 쿠키를 이용한 취약점 공격은 웹 세계에서 너무나 당연한 공격 방식 중 하나이기 때문에 ASP.NET은 처음부터 이를 보완하기 위한 전략을 구현하고 있었습니다. 그러나 이것이 지금 와서 로드 밸런싱 환경이 되면서는 또 다른 어려운 문제로 바뀐 것입니다.

이 Machine Key라는 것 역시 서버 컴퓨터마다 고유하게 생성할 뿐 아니라, 매번 연결할 때 마다 다른 값을 생성하여 암호화에 사용합니다. 클라이언트 입장에서야, 서버가 "ABC"라는 쿠키를 주니까 "아 그렇구나. 나중에 돌려주면 서버가 날 알아보겠지?"하며 성실하게 반납합니다. 그런데 로드 밸런싱에 참여하는 A라는 서버 대신 C라는 서버가 이 쿠키를 받아들었을 때는 "이거 내것 아님" 하며 클라이언트에게 퇴짜를 놓습니다. 이것이 문제의 핵심인 것이죠.

이 문제를 해결하기 위해서는 아까전에 이야기한 주제보다 좀 더 많은 노력이 필요합니다. 생각보다, 보안을 완벽하게 유지하기 위하여 ASP.NET이 관리자들에게 요구하는 사항이 까다롭기 때문입니다. 이 Machine Key를 만들기 위해서는 별도의 생성 도구를 사용해야 합니다. 그러나 안타깝게도 이 도구를 구한다거나 만들 수 있으려면 개발자들의 조력이 좀 필요합니다. 그리고 개발자 본인들도 이런 방법을 찾아야 하기때문에 꽤나 귀찮습니다. Codeproject에 가면 이러한 방법을 자세히 설명한 아티클도 있습니다만 간단한 도구도 드리고, 코드 조각도 드리니 프로그램에 넣어 활용하시면 더 편리할 것입니다.

using System;
using System.Text;
using System.Security.Cryptography;

/* 중략 */

        public static string getRandomKey(int bytelength)
        {
            byte[] buff = new byte[bytelength];
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            rng.GetBytes(buff);
            StringBuilder sb = new StringBuilder(bytelength * 2);
            for (int i = 0; i < buff.Length; i++)
                sb.Append(string.Format("{0:X2}", buff[i]));
            return sb.ToString();
        }

        public static string getASPNET20machinekey()
        {
            StringBuilder aspnet20machinekey = new StringBuilder();
            string key64byte = getRandomKey(64);
            string key32byte = getRandomKey(32);
            aspnet20machinekey.Append("<machineKey\n");
            aspnet20machinekey.Append(" validationKey=\"" + key64byte + "\"\n");
            aspnet20machinekey.Append(" decryptionKey=\"" + key32byte + "\"\n");
            aspnet20machinekey.Append(" validation=\"SHA1\" decryption=\"AES\"\n");
            aspnet20machinekey.Append("/>\n");
            return aspnet20machinekey.ToString();
        }

        public static string getASPNET11machinekey()
        {
            StringBuilder aspnet11machinekey = new StringBuilder();
            string key64byte = getRandomKey(64);
            string key24byte = getRandomKey(24);

            aspnet11machinekey.Append("<machineKey");
            aspnet11machinekey.Append(" validationKey=\"" + key64byte + "\"\n");
            aspnet11machinekey.Append(" decryptionKey=\"" + key24byte + "\"\n");
            aspnet11machinekey.Append(" validation=\"SHA1\"\n");
            aspnet11machinekey.Append("/>\n");
            return aspnet11machinekey.ToString();
        }

위의 코드를 사용하여 프로그램을 만들거나 ZIP 파일 안의 프로그램을 이용하여 값을 만들도록 하면 아래와 같은 XML 코드 조각을 얻을 수 있을 것입니다. 이 코드 조각을 각각의 서버에 들어있는 web.config에 지정하거나, 특정한 값만 인용하여 아래의 IIS 7 설정 아이콘에서 볼 수 있는 설정 도구를 통해서 직접 설정할 수도 있습니다.

<machineKey
 validationKey="FACBB6C89C44CB8BB7165FC4639BAA7267B...EF297D815E1BDD40E883E3451628CB95D34309"
 decryptionKey="4E95057676CC8DBA9AB...AACC1121B6B962E5AFA7849B0C82"
 validation="SHA1" decryption="AES"
/>

기술적인 이야기 3 - IIS에서 놓치면 안되는 것

ASP.NET을 가장 먼저 사용할 수 있게 된 웹 서버가 IIS이다보니 발생한 일종의 특성입니다만 여러 포럼에 걸쳐서 잘 언급되지 않는 문제점이 하나 있습니다. 바로 IIS에서 사용하는 사이트 ID 값을 통해서 정해지는 Application Path를 Machine Key와 같이 활용된다는 사실입니다. 웹 사이트 관리를 하다보면 로드 밸런싱에 참여하는 컴퓨터들을 다음과 같이 관리하게 되는 경우가 있습니다.

  • 서버 A에서는 기본 웹 사이트를 먼저 지우고 새 웹 사이트를 만들었다.
  • 서버 B에서는 새 웹 사이트를 먼저 만들고 기본 웹 사이트를 지웠다.

혹은 아래와 같은 경우도 있을 수 있습니다.

  • 서버 C에서는 사이트 A를 만들고 사이트 B를 만들었다.
  • 서버 D에서는 사이트 B를 만들고 사이트 A를 만들었다.

별 차이 없이 생각할 수 있지만, IIS에서는 이 경우 각각의 사이트들에 다른 ID 값을 부과하게 됩니다. 이 경우, 분명히 Machine Key를 동일하게 지정했음에도 불구하고 로드 밸런싱 환경에서 세션 상태가 일관성없게 변하는 문제를 만나게 됩니다. 제가 이번에 고민하게 된 부분도 바로 이 부분이었는데요, 이 문제를 해결하기 위해서는 IIS 7에서 전체 웹 사이트 목록에 나타나는 내용 중 다음의 ID 값이 멤버로 참여하는 웹 서버마다 차이가 있지 않은지 우선 검토해야 합니다.

위에있는 그림에서 빨간색으로 그린 부분이 서버 컴퓨터마다 차이가 있다면 이 값을 수정해주어야 합니다. 이 값을 수정하기 위해서는 수정할 사이트를 클릭하고, 고급 설정 링크를 아래 그림과 같이 클릭합니다.

이제 아래와 같은 팝업 대화 상자가 나타나면 강조 표시한 속성인 ID 값이 멤버로 참여하는 웹 서버 모두 같은 값을 가질 수 있도록 통일시켜줍니다.

확인 버튼을 누른 다음, ID 값이 바뀐 서버 컴퓨터에 한해서 IIS 전체를 재시작해주시거나 사이트 재시작을 시켜주시면 정상적으로 작동하게 될 것입니다.

Windows Azure 환경에서의 고려 사항

오늘 살펴본 내용은 IIS 7과 ASP.NET에 관한 부분이었지만, Windows Azure Platform의 경우에도 비슷한 문제가 있습니다. Windows Azure Platform에 VM Role로 웹 사이트를 게시를 하든, Web Role로 웹 사이트를 게시하든 세션을 사용하게 될 경우 비슷한 문제가 있을 수 있습니다.

다행히, Web Role을 이용한다면 내부적으로 사용하는 IIS에서 여러분이 몇 개의 웹 사이트를 추가적으로 구성하든 관계없이 같은 순서로 같은 ID를 사용하는 웹 사이트를 만들 것이므로 세 번째로 이야기한 ID 값 수정과 같은 작업은 할 필요가 없을 것입니다. 그러나 Machine Key에 대한 설정이나 세션 공유를 위한 설정은 SQL Azure를 이용한다거나, Worker Role에서 ASP.NET State Service 혹은 써드파티의 Session State Server를 이용해야 할 수 있습니다.

물론, 최근에 Windows Azure Platform의 일부로 Windows Azure AppFabric Cache가 새로 출시되기는 하였습니다만 상당히 이용 가격이 비싼 편입니다. (비싼만큼 확실한 성능을 제공합니다.) 로드 밸런싱 환경에서 특별한 문제를 일으키지 않는 일반적인 세션 공유가 필요하시다면 오늘 이야기한 주제를 응용한 Azure Project를 구축해보는 것도 의미가 있을 것입니다.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

안녕하세요. 오랫만에 블로그에 글을 올립니다. 지난번 Visual Studio Camp에서 옴니버스 형식의 세미나로 Visual Studio 2010 Service Pack 1에 대하여 말씀을 드렸던 세션이 있는데, 발표 자료와 더불어서 Visual Studio 2010 SP1에 대한 간략한 소개를 위하여 글을 씁니다.


Visual Studio의 새 도움말 시스템

Visual Studio 2010 RTM 버전부터는 새로운 형태의 도움말 시스템이 도입되는데, 로컬 웹 서버를 통하여 도움말 컨텐츠가 제공되는 방식으로 이전의 Visual Studio 2005와 Visual Studio 2008에서 제공되던 방식과 다르게 제공됩니다. Visual Studio 2005와 Visual Studio 2008의 경우 자체 URI Scheme을 Windows Registry에 등록하고 이를 Internet Explorer를 통하여 탐색할 수 있도록 확장하는 방식이었습니다. 그러나 새로운 도움말 컬렉션을 추가하거나 삭제하는 과정에서 시스템 성능에 따라 재배열 시간이 상당히 오래 걸리는 문제가 있어 불편한 점도 있었습니다. 이러한 방식 대신 더 단순하지만 더 유연한 방식으로 바꾸게 된 듯 합니다.

그렇지만 이전 버전에서 제공되던 색인, 검색 기능 등이 웹 사이트 형식으로 바뀌면서 이전에 사용했던 기능들이 사라져서 아쉬운 점도 있었는데 이번 Service Pack 1에서는 다시 Help Browser Software가 부활했습니다. 그래서 로컬 웹 서버로 컨텐츠를 보여주는 것은 동일하지만 Visual Studio를 통해서 컨텐츠를 탐색하면 Help Browser가 별도로 나타납니다.

그리고 이번 도움말 시스템에서의 백미는 인터넷을 통한 업데이트가 가능해졌다는 점입니다. 실제로 설치한 적이 없는 제품이라 할지라도, 그리고 DVD를 통해서만 설치할 수 있는 전체 버전의 MSDN 안에서만 제공되던 컨텐츠까지도 인터넷을 통하여 항상 최신 버전을 다운로드받아 로컬 도움말 컬렉션에 추가하거나 필요하지 않으면 삭제할 수 있습니다.



Silverlight 4에 대한 지원 추가

Visual Studio 2010 SP1을 설치하면 별도로 Silverlight 4에 대한 Tools for Visual Studio를 추가 설치할 필요가 없습니다. Silverlight 4부터는 이전의 WPF보다 작지만 웹이 아닌 데스크탑 및 오프라인 환경에서 잘 동작하는 응용프로그램을 제작할 수 있는 기능이 더 완벽하게 제공됩니다. 이러한 기술 전반은 권한 상승이 적용된 실버라이트 응용프로그램에서 가능한 것이며, 여기에는 파일 입출력이나 로컬 COM 컴포넌트와 연계하는 방안이 포함되어있습니다. 아래의 예제는 권한 상승이 적용된 Silverlight 4 기반 응용프로그램 샘플의 소스 코드이며, 사용자 프로필 디렉터리 내의 "내 그림" 폴더에 있는 이미지들을 열거하고 뷰어를 통하여 보여주는 예제입니다.



위 프로그램의 소스 코드 중 파일 입출력에 대한 소스 코드를 실제로 발췌하면 다음과 같습니다.

private void UpdateFileList()
{
    string targetPath = Environment.GetFolderPath(
        Environment.SpecialFolder.MyPictures);
 
    List<object> content = new List<object>();
    foreach (string eachFile in Directory.EnumerateFiles(targetPath))
    {
        switch (System.IO.Path.GetExtension(eachFile).ToLower())
        {
            case ".jpg":
            case ".jpeg":
            case ".png":
                break;
 
            default:
                continue;
        }
 
        content.Add(eachFile);
    }
    this.fileList.ItemsSource = content;
}
Visual Studio 2010 SP1을 설치한 후 Silverlight 프로젝트를 생성하려고 하면 다음과 같이 대화 상자가 나타나는데 이 때 Silverlight 4를 사용하도록 지정하면 사용이 가능합니다.


IIS Express 7.5에 대한 지원 추가

Visual Studio 2005부터는 Cassini Web Server라고 불리던 ASP.NET Development Server를 통하여 전체 버전의 IIS가 없어도 쉽게 ASP.NET 응용프로그램을 테스트할 수 있는 환경이 제공되었습니다. 그러나 Visual Studio 2008의 등장과 더불어 IIS 역시 대폭 업그레이드되어 Windows Server 2008부터는 완전히 새로워진 아키텍처를 기반으로 하는 IIS 7이 등장하게 됩니다. 이에 따라, 어느 정도 호환성을 보장하기는 하지만 이전의 IIS와는 많이 달라졌기 때문에 Cassini Web Server 만으로는 테스트가 어려운 점이 많았습니다. 통합 IDE의 이점도 확보하고, 전체 버전의 IIS를 사용하지 않으면서도 충분히 모든 기능을 점검해볼 수 있는 방향으로 가기 위하여 IIS Express가 등장하게 됩니다.

IIS Express를 사용하는 것은 실제 IIS를 사용하는 것과 비교했을 때 다음과 같은 장점이 있습니다.

  • ASP.NET Development Server와는 달리 FastCGI 모듈을 호스팅할 수 있으므로 PHP와 같은 FastCGI 지원 웹 언어들을 같은 환경에서 동시에 테스트할 수 있습니다.
  • 웹 프로젝트에서 IIS를 사용하도록 지정한 경우, 관리자 권한을 얻을 수 없는 다른 컴퓨터에서는 웹 프로젝트를 열 수 없는 문제점이 있었으나 IIS Express를 사용하도록 하면 이런 제약이 없습니다.
  • IIS Hosted Core를 사용하므로 전체 버전의 IIS가 없어도 상관이 없으며, IIS Express가 설치되어있지 않은 경우 Visual Studio가 자동으로 이를 감지하여 Web Platform Installer를 호출하여 IIS Express가 설치될 수 있도록 해줍니다.
  • 개별 프로세스 형태로 실행되므로 여러 사람이 사용하는 컴퓨터에서도 시스템 설정을 편집하는 일 없이 안전하게 실행할 수 있습니다.

HTML 5와 CSS 3에 대한 문법 검증 지원

Visual Studio 2010 SP1 및 Visual Web Developer 2010 Express SP1을 설치하면 HTML 5, XHTML 5 및 CSS 3에 대한 지원이 기본으로 내장되어있어 정확한 코딩이 가능합니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>HTML5 Test</title>
    <link type="text/css" rel="Stylesheet" href="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.10/themes/redmond/jquery-ui.css" /> 
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js"></script>
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.10/jquery-ui.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $('#test').dialog({ show: "drop", hide: "drop", width: "auto", height: "auto", title: "html 5 rocks!" }).show();
        });
    </script>
</head>
<body>
    <div id="test">
        <video src="demo.mp4" width="700" height="500" id="testVideo" autoplay="autoplay">
            <strong>Your web browser does not support video element.</strong>
        </video>
    </div>
</body>
</html>



위의 그림과 같이 검사할 문법을 지정하여 프로그래밍하면 꼭 지정해야 할 프로퍼티를 검사하여 경고를 띄우거나, 프로퍼티에 포함되어야 할 값의 유형을 자동으로 유추해주어 규칙을 몰라서 잘못 코딩할 가능성을 예방해 줍니다.

그 외에 눈여겨 볼만한 것들

Visual Studio 역시 최근에 급격한 변화를 맞이하고 있습니다. 빠르게 변화하는 기술을 수용하기 위해서 Internet Explorer의 런칭 주기가 짧아진 것과 비슷하게, Visual Studio 역시 자주 새로운 형태의 도구와 프레임워크를 업데이트하고 있으며, 이러한 노력의 일환으로 Express Edition의 가치가 더 높아지고 있습니다.

대표적으로 Visual Studio LightSwitch와 Visual Web Developer Express Edition, 그리고 Visual Studio for Windows Phone 7이 그 예시입니다. 전체 버전의 Visual Studio 제품 구성을 바꾸지 않고 안전하게 테스트해볼 수 있는 방법으로서도, 그리고 실무 개발 환경에서도 유용하게 쓰일 수 있습니다.

그러나 서비스 팩 출시와 더불어서 Express Edition의 경우 한 박자 정도 업데이트가 늦어지는 편입니다. 이 때문에, 먼저 설치한 서비스 팩과 나중에 설치한 RTM 버전의 Express Edition 사이의 버전 차로 인한 충돌 문제가 이슈가 되었던적이 있는데, 이번 버전부터는 그러한 상황이 있을 경우 Visual Studio가 시작되기 전에 해당 문제점을 사용자에게 정확히 알려줍니다. 그 외에, 다양한 도구와 런타임에서 기능 및 성능 향상이 있었습니다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

이 글은 http://www.boutell.com/newfaq/misc/urllength.html 의 내용을 인용하여 서술한 것으로 2006년 이후로 바뀐 내용들이 반영되어있지 않은 것들이 많습니다. 덧붙일 의견이 있으시면 언제든 말씀해주시면 반영하겠습니다. :-)

http://www.w3.org/Protocols/rfc2616/rfc2616.html 에서 설명하는 사양에도 최대 URL 길이에 대한 내용은 언급이 되어있지 않습니다. 하지만 웹 개발을 하면서 누구나 한번즈음은 이런 부분에 대해서 고민을 하게 될 때가 있는데, 그러한 고민을 풀어줄만한 아티클이 있어 소개해 봅니다.

Browser Case No. 1: Microsoft Internet Explorer

http://support.microsoft.com/kb/q208427/ 에서 언급한 것 처럼 Microsoft Internet Explorer는 내부 WININET 헤더 파일 상의 정의를 충실히 따릅니다. URL이 가질 수 있는 최대 길이는 2083자이고, 이 중 프로토콜, 서버 이름 등을 제외한 순수 경로가 2048자까지 허용이 됩니다. 이 글을 작성했던 분의 테스트 결과에 따르면 URL 길이가 긴 경우 브라우저 차원에서 오류 페이지를 띄운다는 것으로 결과가 나왔다고 합니다.

Browser Case No. 2: Firefox

버전 1.5.x의 경우 시각적으로 주소 표시줄은 65536번째 글자 이후로는 주소를 더 표시하지 못한다고 합니다. 그러나 논리적으로 십만글자 이상의 URL도 정상적으로 처리하는 것으로 보이며, 현재 출시되는 Firefox의 경우 이러한 제약이 거의 없지 않겠는가 하는 예상을 해봅니다.

Browser Case No. 3: Safari

적어도 8만자까지는 잘 동작한다고 합니다. :-)

Browser Case No. 4: Opera

긴 URL에 관해서는 종결자라고 해도 틀림없겠네요. 무려 19만자까지, 그것도 인라인 편집이 아닌 여러 행 편집이 가능한 컨트롤로 확장까지 가능하다고 합니다. >_<

Web Server Case No. 1: Apache

기본적으로 약 4000자까지는 허용하지만 그 이후부터는 413 Entity too large 오류가 발생한다고 합니다. 그러나 근래 개발되는 RHEL 기반에서의 Apache는 문서 상으로 약 8000자 이상까지 지원한다고 합니다.

Web Server Case No. 2: Microsoft Internet Information Services (IIS)

기본적으로 16384자까지 지원하며 이는 Microsoft Internet Explorer의 경우와는 상반되는 동작입니다. 게다가 설정도 가능합니다. 특별한 제약은 없겠지만 너무 긴 URL을 받아들이는건 상식적이지 않겠지요.

Web Server Case No. 2-1: ASP.NET

웹 서버 이야기는 아닙니다만 IIS에서 독자적인 처리 규정을 가지고 있는 서버 기반 처리 엔진에 대한 이야기를 하나 하자면, ASP.NET의 이야기를 해야 할 것 같습니다. ASP.NET 3.5 SP1 (내부 ASP.NET 2.0) 까지는 Windows의 시스템 상수 _MAX_PATH가 정의하는 범위 만큼의 URL만을 IIS의 설정과는 관계없이 받아들일 수 있었지만 ASP.NET 4.0부터는 Web.config 파일의 httpRuntime 요소의 maxQueryStringLength 속성에 의하여 확장이 가능합니다.

Web Server Case No. 3: Perl의 HTTP::Daemon

기본적으로 8000자까지 지원합니다. POST 메서드로 수신하게 되는 데이터를 제외하고 순수 HTTP 헤더는 16384바이트까지 지원하며 이 중 헤더에 들어있을 URL에도 이러한 제약이 적용됩니다. 즉, 헤더에 전달되는 내용과의 상관관계도 감안해야하므로 헤더의 양이 많은 경우 8000자보다 안되게 지원이 될 수도 있습니다. 보통은 8000자 이상의 URL로 요청을 하는 경우 413 오류가 발생합니다. 이러한 제약을 넘기위해서 Daemon.pm 파일 내의 16x1024라는 모든 표현식을 더 큰 값으로 수정하면 됩니다. 물론, 이런 동작을 하는 경우 당연한 이야기이지만 Denial of Service (DoS) 공격에 취약해질 수 밖에 없겠지요.

결론

이 글에서는 단순히 fact에 대해서만 살펴보았습니다. 기본적으로 URL이 필요 이상으로 길다고 하는 것 (그 기준이 정확하지는 않지만 상식적인 범위를 벗어나는, 가령 100글자 이상)은 정상적인 상황이 아닐 것입니다. 이 정도로 긴 URL을 보내야 한다면, 대개는 Query String이 그 원인일 것이므로, GET 방식 대신 POST 방식의 전송을 고려해보실 수 있습니다. 하지만 긴 URL을 유지해야 할 필요가 있다면 제가 원본으로 참조한 글의 끝자락에 있는 "The Bookmark Problem" 섹션을 참고하시기 바랍니다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

VM Role 만들기 Step 4 - 서비스 모델 만들기

이전 글 보기: [Software Development/Windows Azure] - Windows Azure VM Role 미리보기 #3

이제 긴 과정이 끝났고, 여러분이 작성한 Virtual Machine Role이 Windows Azure에서 잘 실행되는지 확인할 수 있도록 Visual Studio를 이용하여 서비스 모델을 만들 차례입니다. Amazone Elastic Cloud Computing 서비스와 가장 큰 차이는 바로 이 부분입니다.

Amazone Elastic Cloud Computing은 Amazon Machine Image (AMI)를 관리 도구 상에서 생성하도록 가이드를 하지만, Windows Azure Platform에서는 Visual Studio를 이용하는 것이 Standard입니다. 단지 VM Role만을 게시하기 위하여 사용할 수도 있지만 좀 더 정확히 표현하면 개발자들이 개발한 Cloud Application과 상호작용하도록 VM Role을 만드는 것이 Virtual Machine Role 본연의 역할이라고 할 수 있겠습니다.

Step 3에서 설명했던 Visual Studio 프로젝트 생성 과정에서 만든 클라우드 프로젝트를 열어놓고 진행하겠습니다.

1. 아래 그림과 같이 솔루션 탐색기에서 지구본 모양의 아이콘이 그려진 프로젝트 항목 아래의 역할 폴더 (Roles 폴더)를 오른쪽 버튼으로 클릭하면 팝업 메뉴에 New Virtual Machine Role 메뉴가 나타납니다. 이 항목을 클릭합니다.

(주의 사항) VM Role은 이 글을 작성하는 현 시점에서 베타 프로그램입니다. Visual Studio Tools for Windows Azure에서 위 기능을 활성화시키는 것에 관련한 지침이 베타 프로그램에 참여하는 경우 별도로 안내되므로 반드시 VM Role 베타 프로그램을 Windows Azure Portal (http://windows.azure.com)에서 신청해 주십시오.

2. 새 VM Role 생성을 위한 창이 아래 그림과 같이 나타납니다. Virtual Hard Disk 탭이 선택된 상태에서 지난번 Step 3에서 만든 사용자 계정 정보를 사용하여 게시한 하드 디스크 이미지 정보를 확인합니다. 정상적으로 작업을 수행했다면 아래와 같이 하드 디스크 이미지 파일의 목록이 나타날 것입니다.

3. 지난번 Step 2에서 진행했던 것 처럼, 우리는 가상 하드 디스크 이미지 내에 설치된 Windows 운영 체제에서 IIS를 사용하여 간단한 웹 사이트를 호스팅하기로 하였으므로, 80번 TCP 포트를 열도록 끝점을 구성해야 합니다. Endpoints 탭을 클릭하고, Add Endpoint 버튼을 클릭한 후, 아래 그림과 같이 항목을 입력하여 설정을 추가합니다.

4. 이제 VM Role을 출판할 차례입니다. 솔루션 탐색기로 다시 이동하여 이번에는 클라우드 프로젝트 항목을 오른쪽 버튼으로 클릭하여 게시 메뉴를 클릭합니다. 그러면 아래와 같이 클라우드 프로젝트 게시 대화 상자가 나타나게 됩니다. 여기서 Configure Remote Desktop connections 링크를 클릭합니다.

5. 아래 그림에서 Enable connections for all roles 항목을 클릭합니다. 그리고 첫 번째 콤보 박스를 클릭하여 나타나는 목록들 중에서 새 인증서 생성을 위한 항목을 클릭하여 원격 데스크톱 인증에서 사용할 새로운 인증서를 만듭니다.

6. 아래와 같이 인증서를 구분할 수 있는 별칭을 입력합니다.

7. 이제 원격 제어를 위하여 생성할 관리자 계정의 ID와 비밀 번호, 그리고 유효 기간을 지정할 차례입니다. 표준 Windows System에서 제안하는 관리자 계정 이름인 Administrator와 같이 잘 알려진 이름보다는 고유의 이름을 사용하는 것이 좋습니다. 그리고 비밀 번호 역시 일정 수준 이상의 난이도를 만족해야 합니다. 기간은 가능하면 짧게 설정하여 노출 영역이 최대한 덜 발생하도록 만드는 것이 좋습니다.

8. (매우 중요) 창을 닫기 전에, 해당 인증서 선택란 옆의 View 버튼을 클릭한 후, 인증서 대화 상자에서 자세히 탭을 클릭하고 파일로 복사 버튼을 클릭합니다. 인증서 내보내기 마법사가 나타나면, 개인 키를 포함하여 내보내도록 정확히 옵션을 선택하고 찾기 쉬운 위치에 개인 키를 포함하여 인증서 사본을 저장합니다. 이 때 내보내는 인증서를 나중에 Windows Azure Portal의 Remote Desktop 섹션에 등록해야 하므로 잘 보관합니다.

9. 인증서를 처음 등록하는 것이므로 자동 등록대신 패키지 파일만 만들어 수동으로 등록하는 것으로 가정하겠습니다. 아래 그림과 같이 Create Service Package Only 라디오 버튼을 클릭하고 확인 버튼을 클릭합니다.

10. (매우 중요) 잠시 기다리면 폴더 창 하나가 나타나는데, 전체 경로를 잘 보관해 놓습니다.

11. 이제 Windows Azure Portal (http://windows.azure.com)으로 이동하여 로그인한 후 아래 그림과 같이 New Hosted Service 리본 버튼 항목을 클릭합니다.

12. Create a new Hosted Service 대화 상자가 나타나면 아래 그림과 같이 필요한 항목들을 입력합니다. Affinity Group이나 Region에 관한 설정은 기본 설정을 사용하여도 무방하며, Do not deploy 라디오 버튼을 우선 체크합니다. 원격 데스크톱을 위한 인증서 등록이 우선 이루어져야 하기 때문입니다.

13. 아래 그림과 같이, Hosted Services 항목을 선택하여 나타나는 리스트 뷰에서 서비스 항목 아래의 Certificates 폴더를 클릭하면 리본 메뉴가 아래 그림처럼 바뀝니다. 여기서 Add Certificate 버튼을 클릭합니다.

14. 개인 키를 포함한 인증서를 이제 업로드할 차례입니다. 인증서 내보내기 마법사를 통하여 만든 개인 인증서 파일의 경로를 지정하고, 인증서 비밀 번호를 입력한 후 Create 버튼을 클릭합니다.

15. 이제 패키지 파일을 배포할 수 있게 모든 준비가 끝이 났습니다. Certificates 항목 위의 Hosted Service 항목을 아래 그림처럼 선택한 후, 상단 리본 메뉴에서 New Production Deployment 버튼을 클릭합니다.

16. 나중에 배포 단위를 확인할 수 있도록 알아보기 쉬운 Deployment Name을 지정하고, CSPKG 파일과 CSCFG 파일의 경로를 지정합니다. 이 2개의 파일은 10단계에서 나타난 폴더 창의 전체 경로로 이동하면 찾을 수 있습니다. Deployment Name에 한국어를 사용해도 됩니다.

17. 작업이 시작되면 아래와 같이 진행 상태가 표시됩니다.

18. 부팅까지 모두 완료된다면 아래 그림과 같이 상태가 나타납니다.

19. 만들어진 Virtual Machine Role이 정확히 동작하는지 확인하기 위하여 Deployment 항목을 클릭하면 나타나는 우측의 Properties 패널 상의 DNS name을 확인하고 해당 주소를 브라우저에 넣어봅니다.

20. 아래와 같이 IIS 7 환영 웹 페이지가 나타나면 여러분은 Windows Azure 환경에 성공적으로 여러분만의 가상 서버를 발행한 것입니다. 이제 사용량 추세에 따라서 여러분이 만든 가상 하드 디스크를 기반으로 인스턴스가 늘어나거나 줄어들게 될 것입니다.

다음 시간에는

다음 시간에는 VM Role을 원격에서 제어하고 관리하는 방법을 소개하겠습니다. VM Role은 보편적으로 Windows Server를 관리하기 위하여 널리 사용하는 Remote Desktop을 지원하고, 부수적으로는 PowerShell CMDLET을 이용하여 관리할 수도 있습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

오늘 오전 10시부터 네이트 앱 스토어에서 Amazon Elastic Cloud 기반 Social App을 런칭하였습니다. 주식회사 SHESTORY의 서비스이며, QR 코드에 독창적인 컨텐츠를 부여하고 자신의 메시지를 남들에게 전달하거나 공유하고, 댓글 등을 통하여 의견을 받을 수도 있는 LinkupWith라는 App이며, Microsoft Silverlight 4를 사용하였고, 조만간 iPhone과 Android용 전용 QR Code Reader Application이 추가 공개될 예정입니다.

위의 이미지는 Silverlight 기반 Client UI로 주요 실행 화면들을 스크린 샷으로 촬영한 것입니다. App의 자세한 사용법은 http://club.cyworld.com/5451477817/43245835 에서 소개하고 있습니다. 이번에 사용한 클라우드 플랫폼은 Amazon EC2로, Windows Server 2008 x86 및 IIS 7에서 ASP.NET과 WCF를 사용하여 구현된 서비스입니다.

서비스 체험 바로가기: http://bit.ly/aOBxEI

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)
출처: http://blogs.msdn.com/b/jmeier/archive/2010/10/31/windows-azure-code-samples-collection.aspx

Windows Azure 코드 샘플을 한 곳에 모아서 찾아보기 쉽게 만든 블로그 아티클이 있어서 올려봅니다. Windows Azure 실전 예제에 관심있으신 분들께 도움이 되셨으면 합니다. :-)

예제 응용프로그램

아키텍처 및 디자인 예제

  • 코드 갤러리
    • 동적 스케일링 샘플 - 처리량에 대응하여 동적으로 인스턴스의 수가 늘어나고 줄어드는 것을 보여주는 다중 역할 샘플입니다: http://code.msdn.microsoft.com/azurescale
  • 본사 DPE 부서에서 작성한 예제
    • Project Riviera - 동적 스케일링 샘플에서 더 확장된 예제로, 윈도 애저 스토리지, Windows Workflow, 액티브 디렉터리 페더레이션 서비스, Patterns & Practices Enterprise Library 캐싱 및 로깅 응용프로그램 블럭, 윈도 라이브 ID 인증 등 엔터프라이즈 및 아키텍처에서 등장하는 기술들이 골고루 사용된 고급 샘플입니다: http://code.msdn.microsoft.com/riviera
  • Patterns & Practice - Windows Azure Platform을 위한 아티클이 새로 업데이트되고 있는 중입니다.

클레임 / 아이덴티티 예제

환경 설정

데이터 액세스 및 스토리지 예제

응용프로그램 배포

일반적인 내용들

로깅 및 운영 전략

기존 응용프로그램을 클라우드로 마이그레이션
서비스 버스 (AppFabric)
서비스 관리 API
SQL 애저
WCF (Windows Communication Foundation)
윈도 애저 스토리지
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

이번 PDC 2010의 핵심 주제이기도 했던 클라우드 컴퓨팅과 더불어서, Windows Azure Platform에 대대적인 업데이트가 있을 예정임이 다양한 발표자들에 의하여 키노트에서 언급되었습니다. 오늘 오후에 업데이트할 PDC 2010 키노트 요약 포스팅 이전에 중요한 내용들만을 먼저 간추려 올립니다. 아래의 글은 http://www.microsoft.com/windowsazure/compute/default.aspx 에 PDC 2010 키노트 발표 직후 업데이트된 새로운 사항들을 번역한 글입니다.

드디어 등장! Virtual Machine Role

올해 봄에, VM Role의 등장이 예고된 바가 있었습니다. 하지만 확정된 자료, CTP 발표 등이 없는 상태에서 소문만 무성했었는데요, 이번 PDC 2010 키노트에서 베일을 벗었습니다. VM Role이란, 말 그대로 여러분이 구축한 가상 PC의 하드 디스크 이미지를 이용하여 Windows Azure에 클라우드 컴퓨팅 인스턴스를 생성할 수 있는 인스턴스 타입으로 기존의 Web Role과 Worker Role에 이어 새로 추가된 유형의 Role입니다.

VM Role을 이용하여 구동할 수 있는 OS의 종류는 Windows Server 2008 R2에 한정됩니다. 그리고 기존에 구축한 Windows Server 2008 R2 서버 컴퓨터로부터 VHD 이미지를 생성하여 Windows Azure BLOB Storage로 업로드하게 됩니다. 만들어진 VHD 이미지는 필요한 시기에 동적으로 관리 도구에 의하여 적재되고 부팅될 수 있으므로 가상 PC 인스턴스의 복제 작업이 훨씬 더 간단해집니다. 당연한 이야기이지만, VM Role을 어떻게 구성할 것인지는 전적으로 고객 여러분의 몫입니다.

Web Role과 Worker Role의 향상

그렇다면 Web Role과 Worker Role은 전혀 필요가 없게 되는 것일까요? 그렇지 않습니다. 대부분의 경우 여러분이 클라우드에 게시하려는 응용프로그램의 스타일은 클라우드에 이미 친화적입니다. 이는 ASP.NET 기반의 웹 사이트에서부터 일반적인 TCP 소켓 기반의 데몬 서버에 이르기까지 매우 포괄적입니다. 그리고 목적에 알맞는 Role 선택은 Cloud 환경에서의 비용을 감소시켜줄 수 있습니다.

VM Role의 등장과 더불어서 Web Role과 Worker Role은 한층 더 사용하기 편리해지게 됩니다. 이전까지는 Web Role과 Worker Role의 실행 환경에 대해 제일 많이 혼선을 빚었던 부분 중 하나인 관리자 권한의 부재가 있었습니다만, 이번 업데이트를 통하여 Web Role과 Worker Role에도 관리자 권한이 주어지게 됩니다. 동시에, IIS 7.0의 전체 기능을 모두 사용할 수 있도록 Web Role도 기능이 확장됩니다. 이에 따라 하나의 Web Role이 동시에 여러 사이트를 호스팅할 수 있게 되기도합니다. 그리고, Remote Desktop 연결 기능이 추가됨에 따라 실행 중인 인스턴스를 모니터링하거나 문제를 해결하기 위하여 직접 접속하여 조치를 실행할 수도 있게 됩니다.

VM Role에 대하여

VM Role은 Windows Server 기반의 환경을 Windows Azure로 빠르게 마이그레이션하기 위한 수단으로 제공됩니다. 이는 Windows Server 기반의 응용프로그램을 마이그레이션하면서 필요로 할 수 있었던 시간이 오래 걸리고, 자동화되지 않았으며, 손상되기 쉬운 과정을 최소화합니다. VM Role이 더 높은 유연성과 자유로운 제어에 대한 이점을 제공하는 것과는 별도로, 기존의 Web Role과 Worker Role 역시 더 많은 이점을 제공한다는 사실도 충분히 검토하십시오. Web Role과 Worker Role을 기반으로 한다면, 운영 체제 하부에 대한 제어를 거의 하지 않고 클라우드 환경에 대한 개발자 여러분들의 목표와 기대치 설정을 완벽하게 재현할 수 있을 것입니다. 그리고, 기존과 마찬가지로 Visual Studio를 통한 Windows Azure 개발은 Web Role과 Worker Role에 알맞게 디자인되고 더욱 향상될 것입니다. 또한, Web Role과 Worker Role을 사용하여 클라우드 응용프로그램을 개발한다면, 추상화된 개발을 지향하기 때문에 자동화된 업데이트의 이점을 충분히 누릴 수 있습니다.

VM Role과 관리자 권한 중에서 어떤 것을 택하면 좋습니까?

VM Role과 관리자 권한 기능은 Windows Azure 환경으로의 이관을 검토하는데 큰 변수가 되었던 환경 전반에 대한 제어에 관한 문제점을 완벽하게 해결할 것입니다. 그러나, IIS의 구성 요소를 일부 수정하거나, 특정 MSI 패키지를 설치하는 정도의 작업에 대하여 VM Role보다는 관리자 권한으로 액세스할 수 있는 향상된 Web Role과 Worker Role의 사용을 권장합니다. 이는 잦은 변경 사항이 지속적으로 발생할 수 있는 서비스 환경에 최적화되어있으며, 추상화된 개발 환경을 바탕으로 최신 업데이트의 신속한 적용을 통한 완벽한 서비스를 가능하게 합니다. 만약 복잡한 변경 사항이나 환경 설정을 수용해야 하거나, 시스템 전반에 걸쳐서 다양한 역할을 수행해야 하는 경우, VM Role이 더 좋은 선택이 될 수 있습니다. VM Role의 경우도, 게스트 OS의 자동 업데이트에 관한 부분을 제외하면 로드 밸런싱이나 장애 진단 - 또는 - 극복의 이점을 충분히 누릴 수 있습니다.

만약 VM Role과 관리자 권한에 대한 좀더 자세한 내용이나 최신 정보에 대한 업데이트를 받기 원한다면 http://msdn.microsoft.com/en-us/library/dd179416.aspx 페이지를 방문하십시오.

새 컴퓨터 인스턴스 레벨 제공: 극소형 (Extra Samll) 인스턴스

이번 PDC 2010에서 새로운 종류의 인스턴스 레벨이 하나 더 발표되었습니다. Extra Small (극소형) 인스턴스 레벨이 새로 추가되었으며 이제 사용할 수 있는 기본 인스턴스 레벨이 총 5가지가 됩니다. 극소형 인스턴스는 기존의 소형 (Small) 인스턴스보다 더 개발자에게 저렴하고 쉬운 개발 환경을 제공합니다. 자세한 내용은 아래 도표롤 참고하십시오.

인스턴스 레벨 CPU 메모리 로컬 스토리지 I/O 성능 시간당 과금
Extra Small
(극소형)
1.0 GHz 768 MB 20 GB Low
(낮음)
$0.05 (하루 $1.2)
Small
(소형)
1.6 GHz 1.75 GB 225 GB Moderate
(보통)
$0.12 (하루 $2.88)
Medium
(중형)
2 x 1.6 GHz 3.5 GB 490 GB High
(높음)
$0.24 (하루 $5.76)
Large
(대형)
4 x 1.6 GHz 7 GB 1,000 GB

High
(높음)

$0.48 (하루 $11.52)
Extra large
(특대형)
8 x 1.6 GHz 14 GB 2,040 GB High
(높음)
$0.96 (하루 $23.04)










 

 

 

VM Role의 가격과 라이센싱

VM Role의 가격 정책은 기존의 Web Role과 Worker Role과 다르지 않을 것입니다. VM Role 고객들에게는 기존과 마찬가지로 위의 컴퓨터 인스턴스 등급에 따라 시간당 과금이 적용됩니다. 그리고 기존의 Web Role이나 Worker Role과는 달리, Windows Server 라이센싱 비용이 좀 더 추가 될 것입니다.

Windows Server 2008 R2에 대한 라이선스는 WIndows Azure VM Role 라이선스로 대체됩니다. 이미지로 만들고자 하는 기존의 Windows Server 2008 R2에 대한 라이선스는 볼륨 라이센싱으로 획득한 제품이어야 하며, 이렇게 만들어진 이미지를 Windows Azure VM Role로 실행할 때에는 기존 라이선스와는 별도로 새로운 라이선스 정책 아래에서 실행이 됩니다. 추가적으로, Windows Azure VM Role 베타 기간 동안에는, 개발자들은 64비트 버전의 Windows Server 2008 R2 기반 VM Role을 직접 Windows Azure 환경에 배포할 수 있습니다. 기타 MSDN 라이선스 및 구독 등을 통해 활성화된 Microsoft의 제품들은 개발과 테스트 목적에 한하여 VM Role위에서 사용이 가능합니다. Microsoft는 2011년 5월까지 고객들과 파트너들로부터 다양한 피드백을 수집할 예정에 있으며, 이에 따라 여러가지 개선 방안이 새롭게 적용될 수 있다고 합니다. 또한, 이 기간 동안 설치되는 모든 종류의 써드파티 소프트웨어들에 대해서는 해당 소프트웨어 제조사들의 라이선스 정책에 따라 사용 가능/불가 여부 및 책정 금액이 변동될 수 있습니다.

Windows Azure VM Role에 연결할 때에는 기존에 사용하던 Client Access License (CAL)가 적용되지 않습니다. 또한 기존의 Windows Server 2008 R2 라이선스를 Windows Azure VM Role을 위한 라이선스로 전환하거나 혹은 VM Role을 위한 라이선스를 On-Premise 환경을 위한 라이선스로 전환하는 것은 인정되지 않습니다. 양쪽이 서로 독립된 라이선스이며 호환성이 없음을 의미합니다.

출처: http://www.microsoft.com/windowsazure/compute/default.aspx

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

최근 Microsoft 제품군이 새롭게 발표되면서, IIS 6.0과 같이 오래된 웹 서버에는 등록되지 않은 새로운 유형의 MIME Type으로 인해서 호환성에 문제가 발생하는 경우가 자주 있습니다. 특히 IIS 6.0의 경우는 의도된 동작 (By Design)임을 설명하는 기술 문서 (http://support.microsoft.com/kb/326965/ko)로 이에 대한 해명을 하기도 하였습니다.

IIS 6.0 뿐만 아니라, 최근에는 실버라이트 컨텐츠를 개인 웹 호스팅 계정에 올려서 테스트하시는 분들도 많이 계신데요, 단순히 실버라이트 컨텐츠를 재생하기 위함이라면 필요가 없겠지만, 실버라이트 컨텐츠와 상호작용하는 기능을 구현할 때에는 반드시 MIME 설정이 웹 서버에 올바르게 구현되어있어야 합니다.

아래는 Microsoft가 근래에 들어서 발표한 최신 기술에서 사용하는 파일 형식들의 MIME Type 목록들을 정리한 것입니다. 아래의 목록을 참조하여 IIS 6.0이나 Apache 등의 웹 서버에서 설정을 변경할 수 있습니다.

MIME 확장명

파일 확장명 

 application/x-silverlight-app  .xap
 application/manifest  .manifest 
 application/x-ms-application  .application 
 application/x-ms-xbap  .xbap
 application/octet-stream  .deploy
 application/vnd.ms-xpsdocument  .xps 
 application/xaml+xml  .xaml
 application/vnd.ms-cab-compressed  .cab
 application/vnd.openxmlformats-officedocument.wordprocessingml.document  .docx
 application/vnd.openxmlformats-officedocument.wordprocessingml.document  .docm
 application/vnd.openxmlformats-officedocument.presentationml.presentation  .pptx
 application/vnd.openxmlformats-officedocument.presentationml.presentation  .pptm
 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  .xlsx
 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  .xlsm
 application/msaccess  .accdb
 application/x-mspublisher  .pub
 image/svg+xml  .svg
 application/xhtml+xml  .xht
 application/xhtml+xml  .xhtml

아래는 Apache 기반의 웹 호스팅에서 서버의 설정을 변경하지 않고 손쉽게 MIME 형식을 추가할 수 있는 .htaccess 파일입니다. 다른 .htaccess 파일이 있을 경우 적당한 위치에 파일을 병합하시고, 다른 응용프로그램을 사용하지 않고 있는 경우 이 파일을 그대로 업로드하면 곧바로 반영됩니다.

IIS 7.x (Windows Vista 및 Server 2008 이상)에서는 위의 형식들 중 상당수가 이미 기본으로 등록되어있으므로 IIS 7.x 이상의 웹 응용프로그램 서버를 사용하고 있을 경우에는 문제가 되지 않습니다. 자체적인 웹 서버를 구현하고 있을 경우 (예를 들어 WCF나 .NET Framework based HTTP Listener 같은 경우) MIME Type에 대해서 올바른 처리가 추가 구현되어있어야 합니다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

닷넷 프레임워크 기술들 중 가장 적게 알려지고 그 비중이 많이 축소되어 소개되는 부문이 바로 Visual C++ CLR일 것입니다. 생각보다 C++ CLR이 유용할 수 있음에도 불구하고 여론에 떠밀려서 거의 사장되다시피하고 있지요. 이번 블로그 포스트에서는 C++ CLR을 통해서 실용적인 코딩 하나를 해볼까합니다.

C++과 더불어 관련 라이브러리들 (STL, ATL, WTL, Boost, MFC 등)의 경우 일반적인 응용프로그램을 작성하거나, 성능 튜닝이 필요한 응용프로그램들을 작성하거나, 수학 라이브러리 등의 힘을 빌어 불필요한 오버헤드가 없는 고속 연산을 처리하는 등의 목적에 알맞게 디자인되어있습니다. 그러나 엔터프라이즈 프로그래밍의 경우에서처럼 구조화된 처리를 수행해야 하는 경우 상당히 불편한 점이 많습니다. 간단한 예로 당장 XML 문서 하나 분석하는 것도 썩 편리하지는 않지요.

Visual Studio 패밀리에서 공식적으로 제공되는 기능은 아니지만 C++ CLR도 닷넷 프레임워크 위에서 기동되는 어셈블리를 작성할 수 있습니다. 그리고 더 중요한 것은 기존의 x86 코드나 x64 코드를 MSIL 어셈블리 사이에 끼워넣을 수 있다는 점입니다. 이러한 사실을 바탕으로 하여 하이브리드 코드를 만들 수 있습니다.

그럼 하나씩 살펴보도록 하겠습니다.

1. C++ CLR 기반의 클래스 라이브러리 프로젝트 하나를 만듭니다. 프로젝트 이름으로 여기서는 "CLRxASPX"를 사용하기로 하겠습니다.

2. 여느 닷넷 프로젝트처럼 예상 가능한 종류의 파일들이 만들어집니다. AssemblyInfo.cpp 파일은 어셈블리 어트리뷰트를 정의하는 부분으로 다음과 같이 코드가 구성되어있습니다.

AssemblyInfo.cpp 보기

C#에서와 마찬가지인 어트리뷰트 사용법입니다. 다만 C++ 컴파일러의 특성상 空문장임을 뒷쪽에 명시해둔 것이 다른 부분이라고 할 수 있겠습니다. 그리고 네임스페이스의 참조 방법이 C#과 동일하게 되어있습니다. C#에서 흔히 사용하는 using은 C++의 using namespace와 같습니다. 그리고 C++에서 흔히 사용하는 using std::cout; 같은 참조는 C#에서는 using Console = System.Console; 과 같이 표현이 가능합니다.

특이한 점이 하나 더 있다면 stdafx.h의 존재입니다. MFC나 ATL 프로젝트에서 Precompiled Header라는 명목으로 많이 사용되던 것이 C++ CLR에도 그대로 적용된 걸 볼 수 있습니다. 거리낌없이 그 개념 그대로 stdafx.h에 Windows API 헤더를 추가하거나 프로젝트 전반에 걸쳐 사용하고 싶은 다른 라이브러리의 헤더를 추가하면 됩니다.

그럼 stdafx.h는 어떻게 구성되어있는지 한 번 살펴보도록 하겠습니다.

stdafx.h 보기

C++ CLR의 유용함이 느껴지는 부분입니다. 굵게 표시한 부분이 예제를 위하여 추가된 코드로, Win32 API 헤더를 추가한 것입니다. WIN32_LEAN_AND_MEAN은 컴파일러나 링커의 처리를 최소화하기 위한 것으로 통계적으로 사용 확률이 그닥 높지 않은 코드, 라이브러리를 사전에 제거해주는 옵션입니다. 예제에서는 API 참조를 위해서만 stdafx.h를 이용한 것이므로 stdafx.cpp에는 다른 서술이 되어있지 않아서 생략합니다.

이제 실제 코드를 살펴보기로 합니다.

CLRxASPX.h 보기

using namespace로 모든 네임스페이스의 요소들을 참조할 수도 있지만  필요한 항목들만 위와 같이 참조할 수도 있습니다. 그리고 아래의 클래스 선언을 보면 일반 C++ 클래스 선언과는 구별되는 내용들이 몇 가지 있습니다. 우선, class 키워드 앞에 ref 키워드가 사용된 걸 볼 수 있는데 이것이 이 클래스가 Managed Class 임을 나타내는 것입니다. 그 다음에는 상속 대상을 ASP.NET의 페이지 클래스로 정한 것이 보입니다.

Protected 멤버 메서드로 Page_Load 메서드가 선언된 것이 보입니다. 이 때 알아둘 것이 있는데 ASP.NET은 내부적으로 Reflection을 통해서 실제로 Page 클래스의 Load 이벤트에 추가한 이벤트 처리기가 아니라도 자동으로 이름을 통하여 호출 대상을 결정하기 때문에 위의 메서드는 항상 실행됩니다.

그리고 C++ CLR에서 닷넷 프레임워크의 형식들을 이용할 때에는 닷넷 프레임워크 상의 관리되는 참조 객체임을 표현하기 위하여 과거의 Managed Extensions for C++ 시절때 사용하였던 __gc * 형식 대신 ^ 기호를 사용합니다. 포인터의 * 와는 구분되는 것으로 주소값을 얻기 위한 형변환 시도는 허용되지 않습니다. 이렇게 사용되는 형변환은 주소값에 대한 형변환이 아니라 형식 자체에 대한 형변환 시도가 됩니다. 별도로 해당 형식이 암묵적/명시적 형변환 연산자를 가지고 있지 않을 경우 상속 관계와는 무관하므로 컴파일이 실패합니다. 참고로, Page_Load 메서드가 이벤트 핸들러로서의 조건을 충족하려면 반환 형식은 void, 즉 반환 대상이 없으며, 두 개의 매개 변수를 받아들여야 합니다. 하나는 이벤트를 발행한 출처의 참조, 또 하나는 이벤트 인자 개체의 참조입니다. 자세한 내용은 System::EventHandler 대리자를 참고하시면 됩니다.

CLRxASPX.cpp 보기

구현하기 나름이지만, 원래의 C++ 코드 스타일을 유지하기 위하여 선언부와 구현부를 나눈다면 위와 같은 형태로 cpp 파일에 메서드 본문을 작성할 수 있습니다. 이 때, 메서드의 시그니처에 전체 네임스페이스가 지정되어야 함을 유의합니다.

windows.h 헤더 파일 내에 포함되어있는 항목들 중 시스템 정보를 추출하는 API를 이용해보기로 합니다. 이 부분은 C#이나 기타 닷넷 환경에서는 원래 Platform Invoke를 통하여 우회적으로 마샬링해야 하는 부분이지만 C++ CLR의 특성에 따라 Native Code를 평소처럼 실행할 수 있다는 것을 보여줍니다. SYSTEM_INFO 구조체의 주소값을 전달하여 시스템 정보를 구조체에 채우도록 만들고 이를 ASP.NET 서비스에서 보여준다는 것이 예제 프로그램의 컨셉입니다.

Label 컨트롤을 생성하기 위하여 gcnew 연산자를 사용하였습니다. 역시 C++에서 원래 사용하던 new 연산자와 구분되는 것입니다. gcnew 연산자로 관리되는 객체를 만들고, Text 프로퍼티에 문자열을 지정하였습니다. 관리 객체에 지정되는 문자열은 자동으로 System::String의 인스턴스로 분류되어 처리되도록 만들어져 있기 때문에 유니코드 문장임을 나타내는 접두사 L 없이도 쓰일 수 있습니다. 또한, 아랫쪽 코드를 보면 System::String 형식에만 정의되어있는 문자열간 합치기 기능이 C++에서도 동작하는 것을 볼 수 있습니다.

위의 예제 코드를 작성한 다음, 결과를 확인하기 위하여 아래와 같이 IIS 7.0에서 사용할 수 있는 web.config 파일을 작성하여 웹 어플리케이션 디렉터리를 구축하고, 해당 웹 어플리케이션 디렉터리 바로 아래의 Bin 폴더에 이 프로젝트로 빌드한 DLL을 저장하였습니다.

web.config 보기

위의 내용에서 확인해야 할 부분이 두 가지가 있습니다. IIS 7의 system.webServer 섹션은 닷넷 프레임워크가 처리하는 것이 아니라 IIS 7이 스스로 처리하는 부분입니다. 우선 핸들러에 type이라고 되어있는 부분은 닷넷 프레임워크에서 불러들일 IHttpHandler 인터페이스와 호환되는 형식의 약식 명칭을 지정하는 부분입니다. Page 클래스를 상속함으로서 이 부분이 자동으로 구현되었기 때문에 우리가 방금 작성한 C++ CLR 클래스의 약식 명칭을 여기에 기술합니다. 네임스페이스와 클래스 이름, 그리고 Bin 폴더 내에 들어있는 클래스 라이브러리의 어셈블리 이름을 여기에 기출합니다. 그리고 preCondition에서는 이 핸들러가 통합 모드에서 실행되어야 하고 닷넷 프레임워크 2.0 런타임을 사용하여 구동되어야 함을 표기하고 있습니다.

이제 실행 결과를 살펴보도록 하겠습니다.

C++ CLR이 Native Code와 잘 연동되어 ASP.NET 서비스를 수행하고 있는 것을 볼 수 있습니다. 여기서는 공식적으로 프로젝트 템플릿이 제공된 것이 아니라서 이와 같이 간소한 형태로만 프로그램을 작성하였지만 C++ CLR로도 이와 같이 프로그램 작성을 할 수 있다는 것을 확인할 수 있었습니다. Platform Invoke로 해결하기 어려운 문제는 이와 같이 프로그램의 형태에 제한을 갖지 않고 직접 C++의 힘을 빌릴 수도 있다는 것을 기억하면 쉽게 문제를 풀어나갈 수 있을 것입니다.

참고로 C++/CLI의 ECMA 표준안 문서는 http://www.ecma-international.org/publications/standards/Ecma-372.htm 에서 확인가능합니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

그동안의 Microsoft Windows 서버 환경에 대한 일반적인 오해와 편견, 그리고 불편한 부분까지 일거에 해소시켜줄 새로운 아이템이 하나 등장했습니다. 바로 Microsoft /web Platform Installer와 Microsoft /web Application Installer (이하 Web PI, Web AI)가 그 주인공들입니다. 양쪽 솔루션은 모두 Windows Vista SP1 이상, Windows Server 2008 이상의 시스템에서 동작하도록 설계되어있습니다.

1. Microsoft Web Platform Installer

Microsoft 및 관련 커뮤니티에서는 지속적으로 웹 환경에 알맞는 소프트웨어를 개발하고 테스트합니다. 그 덕분에 최근에 IIS 7.0에서는 Apache의 URL Rewriting 모듈과 호환 수준이 높은 자체적인 무료 URL Rewriting Engine이 배포되어 절찬리에 채택중입니다. 이것은 예전에 ASP .NET 기반 사이트에서만 자체적으로, 그리고 제한적으로 구현하였던 URL Rewriting Engine보다 더 성능이 좋고 범용적이며 검증이 많이 된 것입니다. 또 그 이외에도 계속해서 새로운 프로젝트와 기술들이 발표되곤 합니다.

이제는 이러한 기술들에 대한 정보를 놓치거나 테스트해보지 못할 걱정을 더 이상 하지 않으셔도 됩니다. Web PI가 이러한 부분을 일정 부분 이상 보충해 줄 것입니다. Web PI는 한 번 실행하고 마는 설치 프로그램이 아니라 개발자 PC에서는 주기적으로 새로운 시스템에 대한 정보를 확인하고 설치할 수 있도록 해줄 것입니다.

다음은 소개 동영상입니다.

WebPI는 http://www.microsoft.com/web/channel/products/WebPlatformInstaller.aspx 에서 받아보실 수 있습니다. 위의 도구를 이용하여 필요한 모든 플랫폼 도구를 설치한 다음에는 실제 테스트해보고 싶은 여러분만의 웹 어플리케이션을 바로 설치해볼 수 있는 Web AI를 써보실 차례입니다.

2. Microsoft Web Application Installer

아직 국내에서 많이 사용되는 PHP 기반 응용프로그램들 중 하나인 텍스트큐브가 IIS 7.0을 Apache + PHP 조합처럼 네이티브하고 자연스럽게 처리해주지는 않고 있지만, IIS 7.0을 기준으로 실행하는 것이 가능할 정도로 IIS 7.0은 이전의 IIS 6.0과는 다르게 유연해지고 강력해졌습니다. Web AI는 ASP.NET 기반 응용프로그램들 뿐만 아니라 PHP 기반 응용프로그램의 설치도 지원하며 PHP 해석 엔진과 MySQL 설치도 종속성 검사를 통하여 자동으로 이루어질 수 있도록 돕습니다.

Web PI에서 권장하는 모든 설치 요소를 설치한 다음에 이 설치 도구를 이용하여 필요한 웹 응용프로그램을 설치하셔야 합니다. Web AI는 http://www.microsoft.com/web/channel/products/WebApplicationInstaller.aspx 에서 받아보실 수 있습니다. Web AI로 설치할 수 있는 웹 어플리케이션들 중 DotNetNuke, phpBB, Wordpress 블로그는 특히 주목할만한 부분입니다. :-)

위의 두 가지 도구를 이용하여 멀리 발품팔지 않고도 손쉽고 빠르게 IIS의 기능을 업그레이드하고 필요한 모든 개발 도구와 웹 응용프로그램을 쉽게 구하고 설치할 수 있습니다. 이제부터는 여러분도 IIS로 마음껏 원하는 일을 해보시면 어떨까요? ^^

ps. http://www.microsoft.com/web 에 가시면 인스톨러 이외에 더 많고 풍부한 정보들을 얻으실 수 있습니다. :-)

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)