Dela via


Infrastruktur som kod

Dricks

Det här innehållet är ett utdrag från eBook, Architecting Cloud Native .NET Applications for Azure, tillgängligt på .NET Docs eller som en kostnadsfri nedladdningsbar PDF som kan läsas offline.

Cloud Native .NET apps for Azure eBook cover thumbnail.

Molnbaserade system omfattar mikrotjänster, containrar och modern systemdesign för att uppnå snabbhet och flexibilitet. De tillhandahåller automatiserade bygg- och lanseringssteg för att säkerställa konsekvent kod och kvalitetskod. Men det är bara en del av historien. Hur etablerar du de molnmiljöer som dessa system körs på?

Moderna molnbaserade program omfattar den allmänt accepterade metoden infrastruktur som kod, eller IaC. Med IaC automatiserar du plattformsetablering. Du tillämpar i princip programvaruteknikmetoder som testning och versionshantering på dina DevOps-metoder. Infrastrukturen och distributionerna är automatiserade, konsekventa och repeterbara. Precis som kontinuerlig leverans automatiserade den traditionella modellen för manuella distributioner utvecklas infrastruktur som kod (IaC) hur programmiljöer hanteras.

Med verktyg som Azure Resource Manager (ARM), Terraform och Azure Command Line Interface (CLI) kan du deklarativt skripta den molninfrastruktur som du behöver.

Azure Resource Manager-mallar

ARM står för Azure Resource Manager. Det är en API-etableringsmotor som är inbyggd i Azure och exponeras som en API-tjänst. MED ARM kan du distribuera, uppdatera, ta bort och hantera resurserna i Azure-resursgruppen i en enda samordnad åtgärd. Du ger motorn en JSON-baserad mall som anger vilka resurser du behöver och deras konfiguration. ARM orkestrerar automatiskt distributionen i rätt ordning med hänsyn till beroenden. Motorn garanterar idempotens. Om det redan finns en önskad resurs med samma konfiguration ignoreras etableringen.

Azure Resource Manager-mallar är ett JSON-baserat språk för att definiera olika resurser i Azure. Det grundläggande schemat ser ut ungefär som bild 10–14.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "",
  "apiProfile": "",
  "parameters": {  },
  "variables": {  },
  "functions": [  ],
  "resources": [  ],
  "outputs": {  }
}

Bild 10–14 – Schemat för en Resource Manager-mall

I den här mallen kan man definiera en lagringscontainer i resursavsnittet så här:

"resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "apiVersion": "2018-07-01",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],

Bild 10–15 – Ett exempel på ett lagringskonto som definierats i en Resource Manager-mall

En ARM-mall kan parametriseras med dynamisk miljö och konfigurationsinformation. På så sätt kan den återanvändas för att definiera olika miljöer, till exempel utveckling, QA eller produktion. Normalt skapar mallen alla resurser i en enda Azure-resursgrupp. Det går att definiera flera resursgrupper i en enda Resource Manager-mall om det behövs. Du kan ta bort alla resurser i en miljö genom att ta bort själva resursgruppen. Kostnadsanalys kan också köras på resursgruppsnivå, vilket möjliggör snabb redovisning av hur mycket varje miljö kostar.

Det finns många exempel på ARM-mallar som är tillgängliga i Azure Quickstart Templates-projektet på GitHub. De kan hjälpa dig att påskynda skapandet av en ny mall eller ändra en befintlig mall.

Resource Manager-mallar kan köras på många olika sätt. Det enklaste sättet är kanske att helt enkelt klistra in dem i Azure-portalen. För experimentella distributioner kan den här metoden vara snabb. De kan också köras som en del av en bygg- eller lanseringsprocess i Azure DevOps. Det finns uppgifter som använder anslutningar till Azure för att köra mallarna. Ändringar i Resource Manager-mallar tillämpas stegvis, vilket innebär att du bara måste lägga till den i mallen för att lägga till en ny resurs. Verktygen kommer att stämma av skillnader mellan de aktuella resurserna och de som definierats i mallen. Resurser skapas eller ändras så att de matchar det som definieras i mallen.

Terraform

Molnbaserade program konstrueras ofta för att vara cloud agnostic. Det innebär att programmet inte är nära kopplat till en viss molnleverantör och kan distribueras till alla offentliga moln.

Terraform är ett kommersiellt mallverktyg som kan etablera molnbaserade program för alla större molnaktörer: Azure, Google Cloud Platform, AWS och AliCloud. I stället för att använda JSON som malldefinitionsspråk använder den den något mer terse HCL (Hashicorp Configuration Language).

Ett exempel på en Terraform-fil som gör samma sak som den tidigare Resource Manager-mallen (bild 10–15) visas i bild 10–16:

provider "azurerm" {
  version = "=1.28.0"
}

resource "azurerm_resource_group" "testrg" {
  name     = "production"
  location = "West US"
}

resource "azurerm_storage_account" "testsa" {
  name                     = "${var.storageAccountName}"
  resource_group_name      = "${azurerm_resource_group.testrg.name}"
  location                 = "${var.region}"
  account_tier             = "${var.tier}"
  account_replication_type = "${var.replicationType}"

}

Bild 10–16 – Ett exempel på en Resource Manager-mall

Terraform innehåller också intuitiva felmeddelanden för problemmallar. Det finns också en praktisk verifieringsuppgift som kan användas i byggfasen för att fånga mallfel tidigt.

Precis som med Resource Manager-mallar är kommandoradsverktyg tillgängliga för att distribuera Terraform-mallar. Det finns också community-skapade uppgifter i Azure Pipelines som kan verifiera och tillämpa Terraform-mallar.

Ibland matar Terraform- och ARM-mallar ut meningsfulla värden, till exempel en anslutningssträng till en nyskapad databas. Den här informationen kan samlas in i bygg-pipelinen och användas i efterföljande uppgifter.

Azure CLI-skript och -uppgifter

Slutligen kan du använda Azure CLI för att deklarativt skripta din molninfrastruktur. Azure CLI-skript kan skapas, hittas och delas för att etablera och konfigurera nästan alla Azure-resurser. CLI är enkelt att använda med en skonsam inlärningskurva. Skript körs i Antingen PowerShell eller Bash. De är också enkla att felsöka, särskilt jämfört med ARM-mallar.

Azure CLI-skript fungerar bra när du behöver ta bort och distribuera om infrastrukturen. Det kan vara svårt att uppdatera en befintlig miljö. Många CLI-kommandon är inte idempotenter. Det innebär att de återskapar resursen varje gång de körs, även om resursen redan finns. Det är alltid möjligt att lägga till kod som söker efter förekomsten av varje resurs innan du skapar den. Men om du gör det kan skriptet bli uppsvälldt och svårt att hantera.

Dessa skript kan också bäddas in i Azure DevOps-pipelines som Azure CLI tasks. Om du kör pipelinen anropas skriptet.

Bild 10–17 visar ett YAML-kodfragment som visar versionen av Azure CLI och information om prenumerationen. Observera hur Azure CLI-kommandon ingår i ett infogat skript.

- task: AzureCLI@2
  displayName: Azure CLI
  inputs:
    azureSubscription: <Name of the Azure Resource Manager service connection>
    scriptType: ps
    scriptLocation: inlineScript
    inlineScript: |
      az --version
      az account show

Bild 10–17 – Azure CLI-skript

I artikeln Vad är infrastruktur som kod beskriver författaren Sam Guckenheimer hur Teams som implementerar IaC kan leverera stabila miljöer snabbt och i stor skala. Teams undviker manuell konfiguration av miljöer och framtvingar konsekvens genom att representera önskat tillstånd för sina miljöer via kod. Infrastrukturdistributioner med IaC är upprepbara och förhindrar körningsproblem som orsakas av konfigurationsavvikelser eller saknade beroenden. DevOps-team kan arbeta tillsammans med en enhetlig uppsättning metoder och verktyg för att leverera program och deras stödjande infrastruktur snabbt, tillförlitligt och i stor skala."