Wprowadzenie
Czy również Tobie zdarza się, że czasami potrzebujesz przygotować jakiś proces lub przepływ (na przykład skopiowanie danych lub pliku z jednej usługi do drugiej)? Na początku wygląda to na proste zadanie, ale z każdą linijką kodu widzisz, że koniec się oddala? A może masz potrzebę sprawdzić działanie jakiejś usługi i chciałbyś zrobić to w ciągu kilku minut, aby ocenić, czy warto inwestować czas w dane rozwiązanie?
Tytułowe Azure Logic App jest właśnie taką usługą dostępną w ramach chmury Microsoftu. Umożliwia tworzenie przypływów, które mogą działać w ciągu kilku minut, bez pisania kodu i skupieniu się tylko na właściwym problemie.
Czym jest Azure Logic App?
Azure Logic App jest usługą, która istnieje na rynku już dłuższy czas. Ale mam wrażenie, że wiele osób za bardzo nic o niej nie wie. A co za tym idzie, nie próbuje jej wykorzystywać w swoich projektach. Szkoda, bo są sytuacje, w których może się fajnie sprawdzić.
W Azure Logic App budujemy przepływ w sposób wizualny. Mamy kreator/diagram, w którym definiujemy kolejne kroki przepływu. Każdy krok wykonuje jakąś operację. Dzięki ponad 200 łącznikom (connectors) mamy możliwość pobrania danych lub wykonania jakieś operacji w różnych usługach. Zaczynając od usług Azure, poprzez Twitter, Google, Facebook, a kończąc na takich aplikacjach jak SAP, czy Salesforce. Dokładną listę łączników można znaleźć na stronie https://docs.microsoft.com/en-us/connectors/connector-reference/connector-reference-logicapps-connectors. Można z tego skorzystać w ciekawy sposób.
Kiedy wykorzystać Azure Logic App?
Osobiście Azure Logic App wykorzystuję w dwóch scenariuszach. Po pierwsze do integracji różnych usług z moją aplikacją. Na przykład pobrania jakichś danych, przetworzenia ich i dodania do naszego systemu. Dzięki wbudowanym łącznikom mogę w kilka minut przygotować prostą aplikację, która połączy się np. w OneDrive, ściągnie dane z arkusza Excela i przerzuci je do naszej aplikacji.
Gdybym chciał zrobić to za pomocą kodu, zajęłoby mi to więcej czasu. A z drugiej strony koszt takiej synchronizacji danych, przy wykonywaniu jej raz dziennie, jest bardzo mały. Dużo mniejszy niż ewentualny czas poświęcony na napisanie kodu (o kosztach będzie dedykowany wpis).
Po drugie Azure Logic App wykorzystuję do prototypowania wykorzystania różnych usług (głównie Azure), taki PoC (Proof of concept). Mogę szybko przygotować jakiś przepływ, w którym przetestuję działanie jakiejś usługi. Później na podstawie tego mogę podjąć decyzję, czy idziemy w dane rozwiązanie. A jeśli tak, to czy zostajemy dalej przy Azure Logic App, czy próbujemy to przepisać, w sytuacji gdy koszty działania byłyby znacząco mniejsze. Oczywiście uwzględniając sam koszt przygotowania takiego rozwiązania.
Przykład aplikacji w Azure Logic App
Myślę, że najlepiej zobaczyć jak działa Azure Logic App w praktyce. Na potrzeby omawiania tej usługi przygotowałem dwa przykłady. Jeden dość prosty, a drugi bardziej rozbudowany. Pierwszy znajdziesz poniżej, a drugim zajmiemy się w kolejnym wpisie.
W pierwszym przykładzie chcemy w sposób cykliczny (np. co 1 godzinę) dla jakieś lokalizacji (np. Olsztyn) pobrać informację o pogodzie z serwisu openweathermap.org i wynik zapisać w Azure Storage. Co widać na poniższym diagramie:

Do skorzystania z api openweathermap.org należy wcześniej utworzyć konto w portalu, po czym wygenerować klucz uwierzytelniający. Podobnie z kontem Azure Storage, do którego będziemy zapisywać pobrane dane. Tego już nie będę pokazywał w tym wpisie.
Utworzenie Azure Logic App
Aby utworzyć nowe Logic App należy zalogować się do portalu Azure, wyszukać Logic App w liście usług, a następnie skorzystać z przycisku Add. Ewentualnie możesz skorzystać z bezpośredniego linku do formularza: https://portal.azure.com/#create/Microsoft.EmptyWorkflow
W formularzu poza podaniem standardowych informacji jak subkrybcja, grupa zasobów, czy lokalizacja, podajemy nazwę nowej aplikacji. W przykładzie użyłem GetWeatherDemo, co widać poniżej.

Po utworzenie aplikacji możemy do niej przejść i zostaniemy przekierowani do kreatora. W nim możemy wybrać jeden z podstawowych triggerów (wyzwalaczy) lub skorzystać z gotowych szablonów aplikacji. Polecam przejrzeć sobie niektóre szablony, bo stanowią one świetne przykłady do nauki.
Na potrzeby przykładu wybierzemy trigger Recurrence (zaznaczony czerwoną ramką poniżej), które będzie uruchamiał aplikację co jakiś czas:

Po jego wybraniu przechodzimy do właściwego kreatora, gdzie będzie dodany box dla wyzwalacza, w którym ustawiłem interwał na jedną godzinę.

Pobranie informacji o pogodzie
Następnie dodajemy krok z wykorzystaniem przycisku „+ New step”. W nowym oknie wybieramy akcję HTTP, która umożliwi wykonanie żądania do serwisu openweathermap.org:

Po dodaniu nowej akcji, musimy ją skonfigurować. W pierwszej kolejności określamy typ żądania. W naszym przypadku jest to GET (punkt 1 na zrzucie poniżej). Następnie podajemy adres (http://api.openweathermap.org/data/2.5/weather – punkt 2). A na końcu podajemy dwa parametry w sekcji Queries, która zostaną przekazane w query stringu. Pierwszym parametrem jest q – olsztyn,pl (punkt 3), który określa lokalizację, dla której szukamy pogodę. Drugi APPID (punkt 4) określa klucz uwierzytelniający, który wygenerowaliśmy w openweathermap.org po założeniu konta.
Skonfigurowany krok widać na zrzucie poniżej.

Możemy również skonfigurować inne elementy żądania HTTP, takie jak treść (body), nagłówki (Headers), pliki cookie (Cookie). Ale w naszym przykładzie nie jest to potrzebne.
Zapis odpowiedzi w Azure Storage
Mając już pobraną informacje o pogodzie, chcemy ją zapisać w Azure Storage. W tym celu dodajemy nowy krok. W wyszukiwarce w nowym oknie wpisujemy Azure Blob (punkt 1) i wybieramy akcję Create blob (punkt 2).

Na początku musimy dodać nowe połączenie do Azure Storage. W tym celu podajemy nazwę połączenia. W moim przypadku jest to WeatherStorageConnection (punkt 1). A następnie wybieramy Azure Storage z dostępnej listy (punkt 2). Wcześniej utworzyłem nowy Azure Storage, do którego dodałem kontener weather.

W samej konfiguracji kroku Create Blob musimy określić kilka rzeczy. Po pierwsze wybrać kontener, do którego ma zostać dodany nowy plik. W tym celu klikamy ikonkę folderu z prawej strony pola Folder path (punkt 1) i w popupie wybieramy interesujący nas kontener (punkt 2).

W kolejnym polu określamy nazwę naszego pliku. Chcemy, aby każdy plik był zapisywany pod nazwą w stylu [wygenerowany guid].json. W tym celu posłużymy się czymś takim, co nazywa się Dynamic Content. Za pomocą tego mechanizmu możemy w konfiguracji kroku używać dynamicznych elementów.
Azure Logic App Dynamic Content
Azure Logic App udostępnia dwa rodzaje Dynamic Content:
- Dynamic content – wynik wykonania jakiejś wcześniejszej akcji (np. żądania http)
- Expression – wynik wykonania jakiejś wbudowanej funkcji (np. guid)
W przypadku nazwy pliku posłużymy się wbudowanym Expression. W popupie, który się pojawia, gdy klikniemy w pole Blob Name, przechodzimy na zakładkę Expression (punkt 1). Tam w pole wyszukiwania wpisujemy guid() (pole będzie nam podpowiadać dostępne wartości) i na końcu klikamy w przycisk OK (punkt 3). W efekcie pojawi się nam w polu Blob name różowy prostokąt z nazwą funkcji. Za nim możemy dodać .json (punkt 4), co w efekcie powoduje, że pliki zapisywane w Azure Storage będą nazwę [wygenerowany guid].json:

Zawartość pliku (pole Blob content) skonfigurujemy również z wykorzystaniem Dynamic Content. W pierwszej zakładce (punkt 1), w polu wyszukiwania wpisujemy Body (punkt 2). W wynikach wyszukiwania zobaczymy, że z kroku HTTP mamy dostępne pole Body (wynik żądania – punkt 3). Wybieramy go i w efekcie w polu Blob content mamy zielony prostokąt (punkt 4):

Tak przygotowaną Azure Logic App możemy zapisać i uruchomić.
Uruchomienie Azure Logic App
Po zapisaniu, nasze Azure Logic App będzie już działać i wykonywać się co godzinę. Możemy również sami ręcznie wywołać aplikację, korzystając z przycisku Run (punkt 1). Po kilku chwilkach zobaczymy efekt wykonania aplikacji. Przy każdym z kroków będzie informacja o statusie (np. zielony ptaszek tak jak przy punktach 2).
Dodatkowo możemy kliknąć w akcje, aby zobaczyć więcej szczegółów z jej wykonania. Poniżej rozwinąłem krok HTTP. W nim możemy między innymi zobaczyć treść odpowiedzi (punkt 3).

W Azure Storage znajduje się zapisany plik. Jego nazwa, jak widać, jest taka, jak skonfigurowany szablon.

Pobranie klucza z Azure Key Vault
Nasz przykład ma jeden drobny problem. Klucz uwierzytelniający, który używamy do pobrania informacji o pogodzie, znajduje się bezpośrednio w aplikacji. Lepszym rozwiązaniem jest przechowywanie go w Azure Key Vault. Przy okazji zobaczymy, jak łatwo zrobić to w Azure Logic App.
Diagram poniżej pokazuje zmodyfikowany flow o pobranie klucza do api z Azure Key Vault.

W pierwszej kolejności utworzyłem nowy Azure Key Vault i dodałem do niego sekret o nazwie apikey.

Następnie dodajemy nowy krok między Recurrence, a HTTP (punkt 1). W polu wyszukiwania wpisujemy Key Vault (punkt 2) i w liście wyników wybieramy Get secret (punkt 3).

Teraz musimy skonfigurować połączenie do Azure Key Vault. W polu Vault name (punkt 1) wpisujemy nazwę Azure Key Vault, w którym znajduje się nasz sekret. Wybieramy tenanta (punkt 2), a następnie logujemy się za pomocą przycisku Sign in (punkt 3) na konto, które będzie wykorzystywane do pobierania sekretów (konto musi mieć do tego uprawnienia).

Po zalogowaniu w liście rozwijanej będziemy mieli listę wszystkich sekretów. Wybieramy ten, w którym znajduje się klucz do api.

Użycie klucza z Azure Key Vault
Na końcu pozostaje nam jeszcze użyć pobrany klucz z Azure Key Vault w kroku HTTP. W tym celu skorzystamy podobnie jak wcześniej z Dynamic Content.
Przechodzimy do kroku HTTP. Z pola, gdzie znajduje się klucz uwierzytelniający (punkt 1), usuwamy wartość i korzystamy z Dynamic Content. W popupie w polu wyszukiwania wpisujemy value (punkt 2). W liście wyników widzimy wartość value z kroku Get secret (punkt 3). Wybieramy go i w polu z wartością klucz pojawia nam się niebieski prostokąt (punkt 1), który określa, że w tym miejscu zostanie wykorzystana wartość sekretu pobrana wcześniej z Azure Key Vault.

Możemy teraz zapisać Azure Logic App i ją wykonać. Efekt będzie taki sam, tylko, że tym razem klucz do api zostanie pobrany z Azure Key Vault. Co widać poniżej.

Podsumowanie
Mam nadzieję, że udało mi się pokazać Ci, że korzystanie z Azure Logic App nie jest trudne oraz że łatwo można utworzyć aplikację korzystającą z różnych usług Azure. Co prawda, potrzeba chwilkę, aby przyzwyczaić się do działania kreatora, ale już po chwili można szybko budować aplikacje.
W kolejnym wpisie o Azure Logic App pokażę Ci trochę bardziej rozbudowany przykład, w którym przedstawię kolejne funkcjonalności tej usługi Azure.
Całkiem fajny tutorial Logic App. Szkoda, że nie poruszyłeś kwestii kontektorów i pricingu. Według mnie to największa niewiadoma tego rozwiązania, koszt uruchomienia jest tylko teoretycznie niski w modelu Pay as you go, ale składa się na to całkiem sporo czynników, co może skutkować jednak sporymi kosztami.
Dzięki Adam za komentarz.
Planuje jeszcze dwa wpisy o Azure Logic App. Pierwszy, w którym pokaże trochę bardziej rozbudowany przykład z dodatkowymi informacjami o samym procesie tworzenia aplikacji.
Natomiast drugi będzie właśnie o kosztach, gdzie na kilku przykładach pokażę kiedy Azure Logic App się opłaca, a kiedy będzie sporo droższy niż na przykład Azure Function.
Seria zapowiada się całkiem ciekawe szczególnie porównanie Azure functions z App Logic, teoretycznie mogą robić to samo, z tą różnicą, że Logic Appsy to układanie klocków :D. Mam nadzieję, ze poruszysz również kwestię deploya na różne stanowiska.
Zastanawiał, czy poruszyć kwestię wdrażania, ale widzę, że chyba trzeba 🙂