Azure Function do szacowanie kosztu Logic Apps

By PowerShell

O wykorzystaniu PowerShell i Azure Function napisałem już dwa wpisy, gdzie w większości skupiłem się na teorii. Dzisiaj chcę Ci pokazać, przykład wykorzystałem Function App do czegoś… mało przydatnego 😂

Konkretniej to do nieprecyzyjnego szacowania kosztu tworzonych rozwiązań w Azure Logic Apps.

Czym jest Azure Logic Apps?

Jest to narzędzie typu low-code, które pozwala na szybkie tworzenie rozwiązań integracji, automatyzacji i przepływu pracy bez potrzeby napisania choćby jednego wiersza kodu (przynajmniej w teorii).

Logic Apps

Do tworzenia logiki możesz wykorzystać wizualne narzędzia Logic Apps Designer, której definicja docelowo zapisywana jest w formacie JSON. Co daje możliwości bezpośdeniej pracy na kodzie w Logic app code view.

Problem – oszacowanie kosztu Logic Apps

W Azure Logic Apps ponosimy koszt za wykonanie (przy takim modelu) każdej akcji (0.000025 $) oraz każdego connectora (standardowy to koszt 0.000125 $). Zakładając, że mamy 6 akcji oraz 3 connectory to łączony koszt jednego takiego przebiegu wyniesie 0,000525$

(6 * 0.000025) + (3 * 0.000125) = 0,000525

Oszacowanie kosztów bardziej złożonej logiki nie jest już takie proste. Jeśli wykorzystujemy pętle, instrukcje warunkowe to koszt przebiegu Logic Appa może być za każdym razem inny.

Postawiony problem, jak i próba jego rozwiązania wyszła z mojej ciekawości czy da się to jakoś „sprytnie” policzyć.

Funkcja w PowerShell

Jak wcześniej wspomniałem „wyklikany” Logic Apps docelowo ląduje do JSONa. Dlatego bez problemu da się wykonać konwersję do obiektu w PowerShell za pomocą polecenia ConvertTo-Json.

Cała reszta to już detale, bo w ten sposób dostajemy dostęp do informacji o ilości akcji oraz connectorów. Jednak ważniejsze czego w JSONie nie ma i jakich informacji w ten sposób nie uzyskamy:

  • typu connectora (nie wiemy czy jest typu standard czy enterprise)
  • ilości przebiegu pętli (type akcji Foreach)
  • dokładnego przebiegu logiki jeśli posiadamy instrukcje warunkowe (typ akcji If)

W tym momencie mógłbym zakończyć bo to pokazuje, że przy skomplikowanym Azure Logic Apps uzyskanie w ten sposób dokładnego kosztu (o ile jest taki potrzebny), nie jest możliwe. Będzie to tylko niedokładna estymacja.

Get-LogicAppEstimatedCost -LogicAppCode (Get-Content -Path C:\Temp\logicappcode.json) | Format-Table -AutoSize
 
# Object    Name                Type               ConnectionName     Cost
# ------    ----                ----               --------------     ----
# connector Copy_blob           ApiConnection      azureblob      0,000125
# connector Copy_blob_2         ApiConnection      azureblob      0,000125
# connector Copy_blob_3         ApiConnection      azureblob      0,000125
# action    Initialize_variable InitializeVariable                 2,5E-05
# action    Set_variable        SetVariable                        2,5E-05
# action    Set_variable_2      SetVariable                        2,5E-05
# action    Set_variable_3      SetVariable                        2,5E-05
# action    Set_variable_4      SetVariable                        2,5E-05
# action    Set_variable_5      SetVariable                        2,5E-05
 
Get-LogicAppEstimatedCost -LogicAppCode (Get-Content -Path 'C:\Temp\logicappcode.json') | Measure-Object -Property Cost -Sum
 
# Count             : 9
# Average           :
# Sum               : 0,000525
# Maximum           :
# Minimum           :
# StandardDeviation :
# Property          : Cost

Funkcje PowerShell do wykonania tego polecenia znajdziesz tutaj lub skorzystaj wywołania Function App.

Osadzenie w Azure Functions

Jak to bywa w życiu. Do pewnych wniosków doszedłem po poświęceniu czasu na napisanie skryptów w PowerShell. Mimo to stwierdziłem, czemu nie wykorzystać tego jako poligon do wykorzystania Azure Functions.

W ten sposób skrypty PowerShell opakowałem w moduł a następnie wdrożyłem jako Function App. Poniżej przykładowe wywołanie (kod z Logic Apps zapisz do pliku).

$Body = Get-Content -Path 'C:\Temp\logicapp.json'
$Uri = 'https://func-logicapp-cost.azurewebsites.net/api/CostLogicAppElement'
Invoke-RestMethod -Uri $Uri -Method 'POST' -Body $body -ContentType 'text/plain'
 
# Object         : connector
# Name           : Copy_blob
# Get-Content           : ApiConnection
# ConnectionName : azureblob
# Cost           : 0, 000125
 
# Object         : connector
# Name           : Copy_blob_2
# Get-Content           : ApiConnection
# ConnectionName : azureblob
# Cost           : 0, 000125
...

Statyczna strona w usłudze Azure Storage

Nie jest to moja bajka ale stwierdziłem, czemu by nie zrobić do tego prostego formularza. W tym celu wykorzystałem biblioteka CSS a konkretniej MDBootstrap.

Całość wylądowała na Azure Storage jako Static website i w takiej nieidealnej postaci znajdziesz to tutaj.

Od razu informacyjnie, że mało kto z tego korzysta, więc na 99% doświadczysz problemu zimnego startu (cold start). Mówiąc najogólniej, funkcje, które nie są używane przez dłuższy czas, potrzebują więcej czasu na pierwsze wykonanie (opóźnienie związane z uruchomieniem). Więcej o tym problemie poczytasz we wpisie Understanding serverless cold start.

Statyczna strona w usłudze Azure Storage

Podsumowanie

Mimo nieosiągnięcia celu związanego z szacowaniem kosztu Logic Apps i tak sporo udało się nauczyć. Tym doświadczeniem chciałem się podzielić z Tobą i mam nadzieje, że nie był to dla Ciebie stracony czas (jeśli jest inaczej to sorry 😉

No comments yet.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close