Snabbstart: Skapa och distribuera Azure Functions-resurser från Terraform

I den här snabbstarten använder du Terraform för att skapa en funktionsapp i en Flex Consumption-plan i Azure Functions, tillsammans med andra nödvändiga Azure-resurser. Flex Consumption-planen tillhandahåller serverlös värd som gör att du kan köra koden på begäran utan att uttryckligen etablera eller hantera infrastruktur. Funktionsappen körs på Linux och är konfigurerad för att använda Azure Blob Storage för koddistributioner.

Terraform möjliggör definition, förhandsversion och distribution av molninfrastruktur. Med Terraform skapar du konfigurationsfiler med hjälp av HCL-syntax. Med HCL-syntaxen kan du ange molnleverantören – till exempel Azure – och de element som utgör din molninfrastruktur. När du har skapat konfigurationsfilerna skapar du en körningsplan som gör att du kan förhandsgranska ändringarna i infrastrukturen innan de distribueras. När du har verifierat ändringarna tillämpar du genomförandeplanen för att implementera infrastrukturen.

  • Skapa en Azure-resursgrupp med ett unikt namn.
  • Generera en slumpmässig sträng med 13 små bokstäver för att namnge resurser.
  • Skapa ett lagringskonto i Azure.
  • Skapa en bloblagringscontainer i lagringskontot.
  • Skapa en Flex Consumption-plan i Azure Functions.
  • Skapa en funktionsapp med en Flex Consumption-plan i Azure.
  • Mata ut namnen på resursgruppen, lagringskontot, tjänstplanen, funktionsappen och Azure Functions Flex Consumption-planen.

Prerequisites

Utför implementeringen av Terraform-koden

Exempelkoden för den här artikeln finns på Azure Terraform GitHub-lagringsplatsen. Du kan visa loggfilen som innehåller testresultaten från aktuella och tidigare versioner av Terraform. Se fler artiklar och exempelkod som visar hur du använder Terraform för att hantera Azure-resurser.

  1. Skapa en katalog där du kan testa och köra Terraform-exempelkoden och göra den till den aktuella katalogen.

  2. Skapa en fil med namnet main.tfoch infoga följande kod:

    # This Terraform configuration creates a Flex Consumption plan app in Azure Functions 
    # with the required Storage account and Blob Storage deployment container.
    
    # Create a random pet to generate a unique resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    # Create a resource group
    resource "azurerm_resource_group" "example" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Random String for unique naming of resources
    resource "random_string" "name" {
      length  = 8
      special = false
      upper   = false
      lower   = true
      numeric = false
    }
    
    # Create a storage account
    resource "azurerm_storage_account" "example" {
      name                     = coalesce(var.sa_name, random_string.name.result)
      resource_group_name      = azurerm_resource_group.example.name
      location                 = azurerm_resource_group.example.location
      account_tier             = var.sa_account_tier
      account_replication_type = var.sa_account_replication_type
    }
    
    # Create a storage container
    resource "azurerm_storage_container" "example" {
      name                  = "example-flexcontainer"
      storage_account_id    = azurerm_storage_account.example.id
      container_access_type = "private"
    }
    
    # Create a Log Analytics workspace for Application Insights
    resource "azurerm_log_analytics_workspace" "example" {
      name                = coalesce(var.ws_name, random_string.name.result)
      location            = azurerm_resource_group.example.location
      resource_group_name = azurerm_resource_group.example.name
      sku                 = "PerGB2018"
      retention_in_days   = 30
    }
    
    # Create an Application Insights instance for monitoring
    resource "azurerm_application_insights" "example" {
      name                = coalesce(var.ai_name, random_string.name.result)
      location            = azurerm_resource_group.example.location
      resource_group_name = azurerm_resource_group.example.name
      application_type    = "web"
      workspace_id = azurerm_log_analytics_workspace.example.id
    }
    
    # Create a service plan
    resource "azurerm_service_plan" "example" {
      name                = coalesce(var.asp_name, random_string.name.result)
      resource_group_name = azurerm_resource_group.example.name
      location            = azurerm_resource_group.example.location
      sku_name            = "FC1"
      os_type             = "Linux"
    }
    
    # Create a function app
    resource "azurerm_function_app_flex_consumption" "example" {
      name                = coalesce(var.fa_name, random_string.name.result)
      resource_group_name = azurerm_resource_group.example.name
      location            = azurerm_resource_group.example.location
      service_plan_id     = azurerm_service_plan.example.id
    
      storage_container_type      = "blobContainer"
      storage_container_endpoint  = "${azurerm_storage_account.example.primary_blob_endpoint}${azurerm_storage_container.example.name}"
      storage_authentication_type = "StorageAccountConnectionString"
      storage_access_key          = azurerm_storage_account.example.primary_access_key
      runtime_name                = var.runtime_name
      runtime_version             = var.runtime_version
      maximum_instance_count      = 50
      instance_memory_in_mb       = 2048
      
      site_config {
      }
    }
    
  3. Skapa en fil med namnet outputs.tfoch infoga följande kod:

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "sa_name" {
      value = azurerm_storage_account.example.name
    }
    
    output "asp_name" {
      value = azurerm_service_plan.example.name
    }
    
    output "fa_name" {
      value = azurerm_function_app_flex_consumption.example.name
    }
    
    output "fa_url" {
      value = "https://${azurerm_function_app_flex_consumption.example.name}.azurewebsites.net"
    }
    
  4. Skapa en fil med namnet providers.tfoch infoga följande kod:

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>4.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  5. Skapa en fil med namnet variables.tfoch infoga följande kod:

    variable "resource_group_name" {
      type        = string
      default     = ""
      description = "The name of the Azure resource group. If blank, a random name will be generated."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "sa_account_tier" {
      description = "The tier of the storage account. Possible values are Standard and Premium."
      type        = string
      default     = "Standard"
    }
    
    variable "sa_account_replication_type" {
      description = "The replication type of the storage account. Possible values are LRS, GRS, RAGRS, and ZRS."
      type        = string
      default     = "LRS"
    }
    
    variable "sa_name" {
      description = "The name of the storage account. If blank, a random name will be generated."
      type        = string
      default     = ""
    }
    
    variable "ws_name" {
      description = "The name of the Log Analytics workspace. If blank, a random name will be generated."
      type        = string
      default     = ""
    }
    
    variable "ai_name" {
      description = "The name of the Application Insights instance. If blank, a random name will be generated."
      type        = string
      default     = ""
    }
    
    variable "asp_name" {
      description = "The name of the App Service Plan. If blank, a random name will be generated."
      type        = string
      default     = ""
    }
    
    variable "fa_name" {
      description = "The name of the Function App. If blank, a random name will be generated."
      type        = string
      default     = ""
    }
    
    variable "runtime_name" {
      description = "The name of the language worker runtime."
      type        = string
      default     = "node" # Allowed: dotnet-isolated, java, node, powershell, python
    }
    
    variable "runtime_version" {
      description = "The version of the language worker runtime."
      type        = string
      default     = "20" # Supported versions: see https://aka.ms/flexfxversions
    }
    
  6. Använd det här Azure CLI-kommandot för att ange ARM_SUBSCRIPTION_ID miljövariabeln till ID:t för din aktuella prenumeration:

    export ARM_SUBSCRIPTION_ID=$(az account show --query "id" --output tsv)
    

    Du måste ha den här variabeln inställd för att Terraform ska kunna autentisera till din Azure-prenumeration.

Initiera Terraform

Kör terraform init för att initiera Terraform-distributionen. Det här kommandot laddar ned den Azure-provider som krävs för att hantera dina Azure-resurser.

terraform init -upgrade

Viktiga punkter:

  • Parametern -upgrade uppgraderar nödvändiga provider-plugin-program till den senaste versionen som uppfyller konfigurationens versionsbegränsningar.

Skapa en Terraform-utförandeplan

Kör terraform plan för att skapa en utförandeplan.

terraform plan -out main.tfplan -var="runtime_name=dotnet-isolated" -var="runtime_version=8"
terraform plan -out main.tfplan -var="runtime_name=powershell" -var="runtime_version=7.4"
terraform plan -out main.tfplan -var="runtime_name=python" -var="runtime_version=3.12"
terraform plan -out main.tfplan -var="runtime_name=java" -var="runtime_version=21"
terraform plan -out main.tfplan -var="runtime_name=node" -var="runtime_version=20"

Se till att runtime_version matchar versionen av språkstacken som du verifierade lokalt. Välj önskad språkstack överst i artikeln.

Viktiga punkter:

  • Kommandot terraform plan skapar en utförandeplan, men utför den inte. I stället avgör den vilka åtgärder som krävs för att skapa den konfiguration som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om åtgärdsplanen stämmer överens med dina förväntningar innan du gör några ändringar i faktiska resurser.
  • Med den valfria parametern -out kan du ange en utdatafil för planen. Med hjälp av parametern -out ser du till att den plan som du har granskat är exakt vad som tillämpas.

Tillämpa en Terraform-utförandeplan

Kör terraform apply för att applicera genomförandeplanen på din molninfrastruktur.

terraform apply main.tfplan

Viktiga punkter:

  • terraform apply Exempelkommandot förutsätter att du tidigare körde terraform plan -out main.tfplan.
  • Om du har angett ett annat filnamn för parametern -out använder du samma filnamn i anropet till terraform apply.
  • Om du inte använde parametern -out anropar du terraform apply utan några parametrar.

Verifiera resultatet

Filen outputs.tf returnerar dessa värden för den nya funktionsappen:

Value Description
resource_group_name Namnet på den resursgrupp du skapade.
sa_name Namnet på Azure-lagringskontot som krävs av Functions-värden.
asp_name Namnet på flexförbrukningsplanen som hanterar din nya app.
fa_name Namnet på den nya funktionsappen.
fa_url URL:en för den nya funktionsappens slutpunkt.

Öppna en webbläsare och bläddra till URL-platsen i fa_url. Du kan också använda terraform-utdatakommandot för att granska dessa värden vid ett senare tillfälle.

Skärmbild av Azure Functions-appen

Rensa resurser

Gör följande när du inte längre behöver de resurser som skapats via Terraform:

  1. Kör terraform plan och specificera flaggan destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Viktiga punkter:

    • Kommandot terraform plan skapar en utförandeplan, men utför den inte. I stället avgör den vilka åtgärder som krävs för att skapa den konfiguration som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om åtgärdsplanen stämmer överens med dina förväntningar innan du gör några ändringar i faktiska resurser.
    • Med den valfria parametern -out kan du ange en utdatafil för planen. Med hjälp av parametern -out ser du till att den plan som du har granskat är exakt vad som tillämpas.
  2. Kör terraform apply för att tillämpa genomförandeplanen.

    terraform apply main.destroy.tfplan
    

Felsöka Terraform i Azure

Felsöka vanliga problem när du använder Terraform i Azure.

Nästa steg

Nu kan du distribuera ett kodprojekt till de funktionsappresurser som du skapade i Azure.

Du kan skapa, verifiera och distribuera ett kodprojekt till din nya funktionsapp från dessa lokala miljöer: