Azure Logic App – wdrażanie

Wprowadzenie

Dzisiaj przyszedł czas na ostatni wpis o Azure Logic App. Poprzednio zajęliśmy się kosztami usługi, a dzisiaj przyszedł czas na automatyzację procesu wdrażania nowych wersji aplikacji. Skupimy się na przechowywaniu kodu w gicie oraz wdrażaniu z wykorzystaniem Azure DevOpsów. Dzięki czemu będziemy mogli zautomatyzować proces przenoszenia zmian z środowiska developerskiego na testowe, czy produkcyjne.

Parametryzowanie aplikacji

Na potrzeby tego wpisu wykorzystam aplikację GetWeatherDemo, którą utworzyłem w wpisie wprowadzającym do Azure Logic App. Dla przypomnienia jest to prosta aplikacja, która pobiera informacje o pogodzie dla Olsztyna i zapisuje w Azure Storage.

W naszym przykładzie będziemy chcieli parametryzować lokalizację i w zależności od środowiska (prod, test, dev) pobierać pogodę dla różnej lokalizacji. W realnej aplikacji tutaj prawdopodobnie parametryzowalibyśmy jakiś adres do usługi, którą wykorzystujemy na przykład podczas integracji naszego systemu z aplikacją klienta.

Parametrami w aplikacji zarządzamy za pomocą przycisku Parameters w menu nad kreatorem aplikacji:

Dodanie nowego parametru do aplikacji.

W panelu bocznych możemy dodać nowe parametr za pomocą przycisku Add Parameter, a następnie w boxie powyżej ustawiamy nazwę parametru, typ oraz jego domyślną wartość.

Po zdefiniowaniu parametru w aplikacji możemy go użyć. Przechodzimy do akcji HTTP, która pobiera pogodę i używamy w niej dodany parametr. Wykorzystujemy tutaj ponownie Dynamic Content, gdzie mamy do dyspozycji wartości w sekcji Parameters. Możemy użyć parametr location w akcji HTTP:

Użycie parametru w akcji HTTP

Efekt działa aplikacji dalej będzie ten sam. Czyli pobranie pogody dla Olsztyna. Plusem parametrów jest możliwość ich późniejszej modyfikacji w zależności od środowiska, na którym działa aplikacja.

Eksport szablonu

Mając już tak przygotowaną aplikację możemy przystąpić do jej eksportu. Robimy to za pomocą opcji Export Template (szablon ARM) z sekcji Automation, które znajduje się w menu z lewej strony:

Eksport szablonu aplikacji

Dokładna zawartość szablonu jest widoczna poniżej (plik template.json – pliki można pobrać korzystając z przycisku Download w górnej części okna):

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"workflows_GetWeatherDemoDeployTest_name": {
"defaultValue": "GetWeatherDemoDeployTest",
"type": "String"
},
"connections_azureblob_externalid": {
"defaultValue": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/resourceGroups/logic-app-demo/providers/Microsoft.Web/connections/azureblob",
"type": "String"
},
"connections_keyvault_externalid": {
"defaultValue": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/resourceGroups/logic-app-demo/providers/Microsoft.Web/connections/keyvault",
"type": "String"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Logic/workflows",
"apiVersion": "2017-07-01",
"name": "[parameters('workflows_GetWeatherDemoDeployTest_name')]",
"location": "eastus",
"properties": {
"state": "Disabled",
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
},
"query": {
"defaultValue": "olsztyn,pl",
"type": "String"
}
},
"triggers": {
"Recurrence": {
"recurrence": {
"frequency": "Hour",
"interval": 1
},
"type": "Recurrence"
}
},
"actions": {
"Create_blob": {
"runAfter": {
"HTTP": [
"Succeeded"
]
},
"type": "ApiConnection",
"inputs": {
"body": "@body('HTTP')",
"host": {
"connection": {
"name": "@parameters('$connections')['azureblob']['connectionId']"
}
},
"method": "post",
"path": "/datasets/default/files",
"queries": {
"folderPath": "/weather",
"name": "@{guid()}.json",
"queryParametersSingleEncoded": true
}
},
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "Chunked"
}
}
},
"Get_secret": {
"runAfter": {},
"type": "ApiConnection",
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['keyvault']['connectionId']"
}
},
"method": "get",
"path": "/secrets/@{encodeURIComponent('apikey')}/value"
}
},
"HTTP": {
"runAfter": {
"Get_secret": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"method": "GET",
"queries": {
"APPID": "@body('Get_secret')?['value']",
"q": "@parameters('query')"
},
"uri": "http://api.openweathermap.org/data/2.5/weather"
}
}
},
"outputs": {}
},
"parameters": {
"$connections": {
"value": {
"azureblob": {
"connectionId": "[parameters('connections_azureblob_externalid')]",
"connectionName": "azureblob",
"id": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/providers/Microsoft.Web/locations/eastus/managedApis/azureblob"
},
"keyvault": {
"connectionId": "[parameters('connections_keyvault_externalid')]",
"connectionName": "keyvault",
"id": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/providers/Microsoft.Web/locations/eastus/managedApis/keyvault"
}
}
}
}
}
}
]
}
view raw template.json hosted with ❤ by GitHub

Na początku szablonu (linijka 4) widzimy parametry. Co istotne nie są to parametry Azure Logic App, które dodaliśmy na początku wpisu. Są to parametry szablonu ARM, taki jak nazwa naszej aplikacji, czy połączenia do Azure Storage i Key Vault, które używamy w aplikacji.

Nasz parametr location dodany do aplikacji znajduje się dopiero wewnątrz zasobu (linijka 19) jakim jest aplikacja. Parametr jest dokładnie zdefiniowany w linijce 35.

Drugim plikiem wygenerowanym jest plik parameters.json, w którym możemy ustawiać wartości poszczególnych parametrów szablonu ARM. Czyli tych, które są na początku w linijce 4, czyli bez naszego parametru location.

Zawartości pliku parameters.json:

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"workflows_GetWeatherDemoDeployTest_name": {
"value": null
},
"connections_azureblob_externalid": {
"value": null
},
"connections_keyvault_externalid": {
"value": null
}
}
}

Wdrażając aplikację tak naprawdę będziemy używamy obu plików. Przy czym w zależności od środowisk (dev, test, prod) będziemy mieli różne pliki parameters.json w zależności od środowiska.

Dodanie parametru location do szablonu

W naszym przykładzie chcemy móc ustawić wartość parametru location aplikacji Azure Logic App podczas wdrażania. Możemy to zrobić, ale wiąże się to z modyfikacją pobranych plików template.json oraz parameters.json.

Po pierwsze musimy dodać nowy parametr w elementu parameters w głównym elemencie w pliku template.json. Określany domyślną wartość oraz typ parametru (linijka 17 wynikowym pliku poniżej):

"location": {
    "defaultValue": "olsztyn,pl",
    "type": "String"
}

Następnie musimy w innym elemencie parameters również dodać informację o nowym parametrze. Przechodzimy do elementu resources, w którym zdefiniowana jest nasza aplikacja Azure Logic App. A następnie w elemencie properties znajdujemy element parameters, do którego dodajemy parametr (linijka 129 w pliku poniżej). Tym razem jako wartość parametru pobieramy wartość z parametrów szablonu ARM, czyli to co przed chwilą dodaliśmy (to co jest w linijce 17).

"location": {
	"value": "[parameters('location')]"
}

W efekcie wynikowy plik będzie wyglądał tak (zmiany w linijce 17 oraz 129):

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"workflows_GetWeatherDemoDeployTest_name": {
"defaultValue": "GetWeatherDemoDeployTest",
"type": "String"
},
"connections_azureblob_externalid": {
"defaultValue": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/resourceGroups/logic-app-demo/providers/Microsoft.Web/connections/azureblob",
"type": "String"
},
"connections_keyvault_externalid": {
"defaultValue": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/resourceGroups/logic-app-demo/providers/Microsoft.Web/connections/keyvault",
"type": "String"
},
"location": {
"defaultValue": "olsztyn,pl",
"type": "String"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Logic/workflows",
"apiVersion": "2017-07-01",
"name": "[parameters('workflows_GetWeatherDemoDeployTest_name')]",
"location": "eastus",
"properties": {
"state": "Disabled",
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
},
"location": {
"defaultValue": "olsztyn,pl",
"type": "String"
}
},
"triggers": {
"Recurrence": {
"recurrence": {
"frequency": "Hour",
"interval": 1
},
"type": "Recurrence"
}
},
"actions": {
"Create_blob": {
"runAfter": {
"HTTP": [
"Succeeded"
]
},
"type": "ApiConnection",
"inputs": {
"body": "@body('HTTP')",
"host": {
"connection": {
"name": "@parameters('$connections')['azureblob']['connectionId']"
}
},
"method": "post",
"path": "/datasets/default/files",
"queries": {
"folderPath": "/weather",
"name": "@{guid()}.json",
"queryParametersSingleEncoded": true
}
},
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "Chunked"
}
}
},
"Get_secret": {
"runAfter": {},
"type": "ApiConnection",
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['keyvault']['connectionId']"
}
},
"method": "get",
"path": "/secrets/@{encodeURIComponent('apikey')}/value"
}
},
"HTTP": {
"runAfter": {
"Get_secret": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"method": "GET",
"queries": {
"APPID": "@body('Get_secret')?['value']",
"q": "@parameters('location')"
},
"uri": "http://api.openweathermap.org/data/2.5/weather"
}
}
},
"outputs": {}
},
"parameters": {
"$connections": {
"value": {
"azureblob": {
"connectionId": "[parameters('connections_azureblob_externalid')]",
"connectionName": "azureblob",
"id": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/providers/Microsoft.Web/locations/eastus/managedApis/azureblob"
},
"keyvault": {
"connectionId": "[parameters('connections_keyvault_externalid')]",
"connectionName": "keyvault",
"id": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/providers/Microsoft.Web/locations/eastus/managedApis/keyvault"
}
}
},
"location": {
"value": "[parameters('location')]"
}
}
}
}
]
}
view raw template2.json hosted with ❤ by GitHub

W kolejnym kroku musimy dodać parametr do pliku parameters.json. Plik ten jest używany podczas wdrażania szablonu ARM. W nim znajdują się konkretne wartości poszczególnych parametrów. W nim znajdzie się właśnie już lokalizacja, dla której chcemy pobrać pogodę. Dla odmiany ustawiłem w nim Warszawę:

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"workflows_GetWeatherDemoDeployTest_name": {
"value": "GetWeatherDemoDeployTest"
},
"connections_azureblob_externalid": {
"value": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/resourceGroups/logic-app-demo/providers/Microsoft.Web/connections/azureblob"
},
"connections_keyvault_externalid": {
"value": "/subscriptions/e8c3a8fe-ce1f-4ae5-8488-a862f658eb35/resourceGroups/logic-app-demo/providers/Microsoft.Web/connections/keyvault"
},
"location" : {
"value": "Warszawa, pl"
}
}
}

Tak naprawdę dla każdego środowiska, będziemy mieli dedykowany plik parameters.json, w którym będą specyficzne wartości dla danego środowiska.

Pipeline w Azure DevOps

Mając już przygotowane pliku szablonu możemy teraz dodać je do repozytorium, a następnie skonfigurować pipeline oraz release w Azure DevOps.

W przykładowym repozytorium (https://github.com/danielplawgo/LogicAppDeploy) znajdują się trzy pliki. Dwa pliki to powyższe pliki szablonu ARM oraz plik azure-pipelines.yml, w którym jest definicja pipeline. W naszym przypadku jest on dość prosty. Po prostu kopiujemy i publikujemy pliki jako artefakty buildu. Aby za chwilkę wykorzystać je w release. Dokładna zawartość pliku to:

Release w Azure DevOps

Sam release będzie składa się z jednego kroku (ARM template deployment). W rozwiązaniu, które wykorzystuje, każde środowisko (dev, test, prod) to dedykowana grupa zasobów w Azure, w której znajdują się wszystkie potrzebne rzeczy do działania aplikacji. W przykładzie to Azure Storage, Key Vault oraz połączenia do tych usług. Zakładam, że używane rzeczy istnieją w grupie zasobów i nie będziemy ich wdrażać (oczywiście można i to osiągnąć, ale to już temat na inny wpis 🙂 ).

Podczas wdrażania nowej wersji aplikacji Azure Logic App tak naprawdę wdrażany szablon ARM dla określonej grupy w zależności od środowiska. W momencie wdrożenia szablon ARM podmieni definicję aplikacji Azure Logic App.

Konfiguracja kroku wygląda następująco:

Azure Logic App release step

Na początku określamy nazwę kroku (punkt 1), później określany sposób deploy, czyli w tym przypadku deploy grupy zasobów (punkt 2). W kolejnych dwóch punktach (3 oraz 4) wybieramy połączenie do subskrypcji. Punkt 5 to akcja jaka ma się wykonać, wybrałem tutaj utworzenie lub aktualizacja grupy. Następnie określamy grupę zosobów (punkt 6), którą będziemy zmieniać.

Location (punkt 7) jest wykorzystywana podczas dodawania nowej grupy. W naszym przypadku zostanie on zignorowana, bo nasza grupa zasobów już istnieje.

Na samym końcu określany pliki szablonów, które mają zostać wykorzystanie. W Template location (punkt 8) określiłem, że pliki znajdują się artefaktach. Kolejna dwa pola to już plik szablonu (punkt 9) oraz plik z parametrami (punkt 10).

Test wdrożenia

Po wykonaniu konfiguracji i zapisaniu, możemy już się cieszyć wdrażaniem nowej wersji aplikacji prostu z Azure DevOps.

Konfiguracja release różnych środowisk (dev, test, prod) będzie głównie się różniła w punktach 6 (grupa zasobów), oraz 10 (plik z parametrami). Ewentualnie w przypadku, gdy środowisko produkcyjne znajduje się w ramach innej subskrybcji, to należy jeszcze zmienić punkt 3 oraz 4.

Po wdrożeniu nowej wersji aplikacji z Azure DevOps i jej wykonaniu możemy już zauważyć, że pogoda jest pobierana dla Warszawy, więc widać, że wdrożenie wykonało się poprawnie:

Wykonanie aplikacji po deploy

Podsumowanie

W tym ostatnich wpisie z serii o Azure Logic App pokazałem Ci w jaki sposób można zautomatyzować wdrażanie nowej wersji aplikacji z wykorzystaniem szablonów ARM oraz Azure DevOps.

Mam nadzieje, że cała ta mini seria ułatwi Ci podjąć decyzję, czy Azure Logic App jest usługą, która może Ci się przydać w projektach i systemach, które realizujesz.

.NET 5 Web App w Azure

Szkolenie .NET 5 Web App w Azure

Zainteresował Ciebie ten temat? A może chcesz więcej? Jak tak to zapraszam na moje autorskie szkolenie o Web API działającym w Azure.

2 thoughts on “Azure Logic App – wdrażanie

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.