Wyłączanie ARR Affinity Session (sticky sessions) w Azure Web Sites

Microsoft Azure Web Sites ma zaimplementowany Application Request Routing co oznacza, że wspiera tak zwane sticky sessions. Co to oznacza? Oznacza to w dużym skrócie, że request, który przychodzi od kogoś, dostaje w nagłówku zwrotnym informację z jakiego serwera został obsłużony i przy jego każdym kolejnym requescie load balancer będzie kierował go do tego samego serwera.

Jest to bardzo fajne rozwiązanie kiedy np. chcemy w bardzo prosty i szybki sposób przenieść naszą istniejącą stronę do Azure, a strona ta nigdy nie była przystosowana do bezstanowości, a w szczególności do trzymania sesji użytkownika w jakimś zewnętrznym kontenerze (cache, baza danych etc.). Jednak gdy taką zmianę dodamy lub chcemy wykorzystać takie usługi jak Traffic Manager do rozdysponowania ruchu pomiędzy nasze wdrożenia warto jest wyłączyć sticky sessions i wykorzystać prawdziwą skalowalność chmury.

Na potrzeby wpisu mam wgraną na Azure prostą witrynę z szablonu ASP.NET w Visual Studio i zobaczmy jej ruch sieciowy w narzędziach developerskich IE (klawisz F12):

arrcokie

Widać, że zostało dodane ciasteczko z informacją o ARRAffinity.

Teraz żeby wyłączyć tę funkcjonalność należy do pliku web.config dodać następujący wpis:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Arr-Disable-Session-Affinity" value="true"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>

Teraz po odświeżeniu strony i podejrzeniu ruchu sieciowego zobaczymy, że nie ma już ciasteczka odpowiedzialnego za sticky sessions:

arrnocookie

Project Kudu – tylne wejście do Azure

Nawiązując do porównania, które na swoim blogu umieścił Scott Hanselman Azure Web Sites jest jednym z bardziej odizolowanych od samej platformy Azure środowiskiem. Ma to swoje plusy i minusy. Plusem na pewno jest łatwości wykorzystania, zapewnienie działania etc.. Minusem natomiast może być fakt niemożliwości skonfigurowania wielu rzeczy lub podejrzenia co się dzieje na różnych poziomach samej platformy. Nie wszystko jednak stracone bo mamy Kudu! 🙂

Project Kudu jak można przeczytać na jego oficjalnej stronie githuba jest silnikiem umożliwiającym deployment z poziomu git-a do Azure Web Sites. Jednak to zdanie było chyba napisane bardzo dawno temu bo obecnie Kudu potrafi dużo więcej!

Zacznijmy od zalogowania się do Kudu. Załóżmy, że adres naszej strony to http://mojamegasuperstrona.azurewebsites.net. Musimy go lekko zmodyfikować, aby wyglądał następująco https://mojamegasuperstrona.scm.azurewebsites.net. Po udanym logowaniu pojawi się nam się strona główna Kudu

projectkudumain

Na pierwszej stronie dostaniemy podstawowe informacje o naszym środowisku oraz linki do API REST-owego, dzięki czemu rzeczy, które dostarcza Kudu możemy także sami wywołać z poziomu kodu (sam Kudu tak naprawdę jest tylko nakładką UI na to API).

Druga zakładka Envoirement dostarcza bardziej szczegółowych informacji dotyczących naszego środowiska, w ramach , którego uruchomiona jest witryna. Podzielone są one na kategorię (jak na zdjęciu poniżej) i każda z tych kategorii zawiera szereg informacji. Część z nich jest dostępna z poziomu portalu zarządzania naszą witrynę, ale większość nie

projectkuduenv

Kolejna zakładka to Debug console, gdzie możemy sobie wybrać czy wolimy posługiwać się klasycznym wierszem poleceń czy PowerShellem 🙂 Dodatkowo znajduje się tam prosty explorer plików, z możliwością m.in. edycji, a także funkcją drag&drop więc jeśli szybko potrzebujemy przerzucić jakieś pliki na stronę można to zrobić w ten sposób

projectkududebugconsole

Idąc dalej znajdziemy zakładkę Process explorer, w której jak nie trudno się domyśleć, znajdują się informacje o działających procesach. Można podejrzeć właściwości wybranego procesu, pobrać memory czy GC dumpa, zobaczyć wątki,  moduły i dużo więcej. Przypominam, że to wszystko w przeglądarce! 🙂

projectkuduprocessex

Przedostatnia już zakładka to Tools. Znajdują się tam trzy narzędzia. Pierwsze z nich to Diagnostic dump, który powoduje tak de facto sciągnięcie katalogu Logs z naszej witryny, a tam będą znajdowały się różne logi, w zależności od tego co skonfigurowaliśmy w portalu dla naszej witryny. Log stream, powoduje wyświetlenie konsoli, która pokazuję w czasie rzeczywistym strumień logów, który możemy włączyć w panelu strony, a w kodzie aplikacji korzystać z metod klasy Trace, takich jak TraceError, TraceInformation, TraceWarning. Na samym końcu jest opcja Web hooks, która umożliwia podłączenie poprzez właśnie tę technologię różnych zewnętrznych serwisów. Przykładem może być tu Zapier, który potrafi się zintegrować z Azure Web Sites i ustawić jakąś akcję, która zostanie wykonana po deplymencie nowej wersji naszej wtiryny/aplikacji. Akcją to może być mail, sms, telefon i wiele, wiele innych 🙂

projectkudutools

Na sam koniec została zakładka Site extensions. Jak nazwa wskazuje są to rozszerzenia naszej witryny. O co chodzi. Chodzi o rozszerzenia, które nie są dostępne dla użytkowników, ale raczej dla administratorów. Jako przykład widać, że jest tutaj “Monaco“, czyli on-line’owa wersja Visual Studio, która umożliwia edycję plików witryny bezpośrednio w przeglądarce, czy np. phpMyAdmin, czyli są tu rzeczy, do których dostęp powinni mieć tylko administratorzy, ale działające w kontekście naszej witryny. Istnieje też galeria rozszerzeń, do której można wrzucać swoje rozszerzenia, można ją znaleźć pod adresem http://www.siteextensions.net/.

projectkudusiteexptensions

Ciekawą rzeczą jest też fakt, że Project Kudu można zainstalować u siebie na serwerze i korzystać z jego możliwości 🙂

Mam nadzieję, że dzięki temu narzędziu, oraz innym, które są przez nie dostarczane, łatwiejszy stanie się wgląd w bebechy
Azure Web Sites.

Hello World! from Microsoft Azure

Pierwszy wpis na nowo otwartym blogu! 🙂

Osoby, które mnie znają wiedzą, że mam już jednego bloga, którego można znaleźć pod adresem http://tomaszwisniewski.com. Postanowiłem jednak stworzyć nowego, który skupi się tylko na technologii Microsoft Azure, która jest mi najbliższa obecnie, bo od prawie dwóch lat cały czas z nią pracuję.

Wpisy na tym blogu będą bazowały na czymś co trudno na polski przetłumaczyć, a mowa o “lessons from the field”. Jako że na co dzień pracuję z klientami i partnerami w zakresie Azure często zadają mi różne pytania jak coś zrobić, jakie są możliwości aby osiągnąć zamierzony cel etc.. Na bazie tych pytań (oczywiście anonimowo 😉 ) będę tworzył kolejne wpisy, które dzięki temu staną się praktyczną wiedzą z zakresu wykorzystania Azure w różnych scenariuszach i będą pomocą w wielu sytuacjach.

Można też pokusić się o zadanie pytania, dlaczego tych wpisów nie umieściłem w swoim głównym blogu np. w osobnej kategorii? Powody są myślę dwa: jeden “miękki” drugi “techniczny”.

Miękki jest taki, że chciałem odseparowania treści pomiędzy tymi blogami. Nie wiem czy ten blog się przyjmie, czy będzie zainteresowanie (zakładam, że tak, ale wiadomo – różnie bywa 😉 ).

Techniczny natomiast jest taki, że ze względu, że blog ten jest o Microsoft Azure, to strona jest hostowana na samym Azure! 🙂 Postawienie tej strony zajęło jakieś +/- 60 sekund dzięki technologii Azure Web Sites, gdzie z galerii dostępnych aplikacji wybrałem szablon WordPress-a, wypełniłem podstawowe dane o witrynie, Azure założył dla mnie w tle także bazę MySQL (tak, w Azure TEŻ można wykorzystać bazę MySQL 🙂 ) i tyle. Chwila obserwacji napisu “Creating…” w portalu i strona gotowa do użycia. A gdyby strona się nie przyjęła, to mogę w każdej chwili ją skasować i przestać płacić za usługę, w zależności od ruchu jaki będzie generowany mogę ja dowolnie skalować – same zalety Azure! 🙂

Zachęcam zatem do odwiedzania strony i czytania różnych ciekawostek ze świata Microsoft Azure.