Terraform을 사용하여 Azure Functions Python 배포

이 게시물은 Terraform을 사용하여 Azure Functions Python을 배포하는 데 중점을 둡니다. 두 서비스를 처음 사용하는 경우 전제 조건에서 시작할 수 있습니다.

전제 조건


  • Create and deploy serverless Azure Functions in Python with Visual Studio Code
  • Quickstart: Configure Terraform using Azure Cloud Shell

  • 개요



    Azure Functions은 Microsoft Azure의 FaaS(function-as-a-service)입니다. 서버리스 서비스이기 때문에 흥미로운 서비스를 더 빠르게 만들 수 있습니다. 코드에만 집중하면 되고 OS 업데이트 및 미들웨어에 신경 쓸 필요가 없습니다.

    또한 Azure Functions는 외부 이벤트에 의해 트리거되는 이벤트 기반입니다.
  • Azure Blob Storage(Object Storage 서비스)에 이미지 업로드
  • Azure Cosmso DB(NoSQL DB 서비스)에 항목 삽입/업데이트
  • HTTP 수신 요청
  • cron이 정의한 타이머

  • 그러나 모든 서비스를 배포하고 Azure Portal에서 구성하는 데 시간이 오래 걸리고 실수가 발생합니다.

    생산성을 높이고 안전하게 배포하려면 Azure Portal에서 각 리소스를 배포하는 것보다 ARM Template 또는 Terraform 와 같은 IaC(Infrastructure as Code) 도구를 사용하고 싶습니다. 특히 프로덕션 환경에서는 인프라를 코드로 관리하는 것이 정말 중요합니다.

    환경 설정


  • 테라폼 >= 0.12
  • azurerm 공급자 >= 2.21
  • 하늘빛 CLI

  • 리소스 정의



    리소스를 정의해 봅시다. Terraform에서는 .tf 파일에 리소스를 정의합니다.
    main.tf
    # https://github.com/terraform-providers/terraform-provider-azurerm/issues/7960
    provider "azurerm" {
      version = ">=2.21.0"
      features {}
    }
    
    resource "azurerm_resource_group" "funcdeploy" {
      name     = "rg-${var.prefix}-function"
      location = var.location
    }
    
    resource "azurerm_storage_account" "funcdeploy" {
      name                     = "${var.prefix}storage"
      resource_group_name      = azurerm_resource_group.funcdeploy.name
      location                 = azurerm_resource_group.funcdeploy.location
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    
    resource "azurerm_storage_container" "funcdeploy" {
      name                  = "contents"
      storage_account_name  = azurerm_storage_account.funcdeploy.name
      container_access_type = "private"
    }
    
    resource "azurerm_application_insights" "funcdeploy" {
      name                = "${var.prefix}-appinsights"
      location            = azurerm_resource_group.funcdeploy.location
      resource_group_name = azurerm_resource_group.funcdeploy.name
      application_type    = "web"
    
      # https://github.com/terraform-providers/terraform-provider-azurerm/issues/1303
      tags = {
        "hidden-link:${azurerm_resource_group.funcdeploy.id}/providers/Microsoft.Web/sites/${var.prefix}func" = "Resource"
      }
    
    }
    
    resource "azurerm_app_service_plan" "funcdeploy" {
      name                = "${var.prefix}-functions-consumption-asp"
      location            = azurerm_resource_group.funcdeploy.location
      resource_group_name = azurerm_resource_group.funcdeploy.name
      kind                = "FunctionApp"
      reserved            = true
    
      sku {
        tier = "Dynamic"
        size = "Y1"
      }
    }
    
    resource "azurerm_function_app" "funcdeploy" {
      name                       = "${var.prefix}func"
      location                   = azurerm_resource_group.funcdeploy.location
      resource_group_name        = azurerm_resource_group.funcdeploy.name
      app_service_plan_id        = azurerm_app_service_plan.funcdeploy.id
      storage_account_name       = azurerm_storage_account.funcdeploy.name
      storage_account_access_key = azurerm_storage_account.funcdeploy.primary_access_key
      https_only                 = true
      version                    = "~3"
      os_type                    = "linux"
      app_settings = {
          "WEBSITE_RUN_FROM_PACKAGE" = "1"
          "FUNCTIONS_WORKER_RUNTIME" = "python"
          "APPINSIGHTS_INSTRUMENTATIONKEY" = "${azurerm_application_insights.funcdeploy.instrumentation_key}"
          "APPLICATIONINSIGHTS_CONNECTION_STRING" = "InstrumentationKey=${azurerm_application_insights.funcdeploy.instrumentation_key};IngestionEndpoint=https://japaneast-0.in.applicationinsights.azure.com/"
      }
    
      site_config {
            linux_fx_version= "Python|3.8"        
            ftps_state = "Disabled"
        }
    
      # Enable if you need Managed Identity
      # identity {
      #   type = "SystemAssigned"
      # }
    }
    

    variables.tf
    variable "location" {
        type    =   string
        default =   "japaneast"
    }
    
    variable "prefix" {
        type    =   string
        default =   "my"
    
    }
    


    다음은 성공적인 배포를 위한 몇 가지 팁입니다.
  • 용도 azurerm >= 2.21.0
  • 숨겨진 링크 태그 추가
  • version = ~3 설정(기본값은 v1)

  • Azure 리소스 배포



    위의 파일을 생성했으면 배포하자!

    로컬 PC에 Terraform을 설치하지 않으려면 테스트로 Azure Cloud Shell을 사용하십시오.

    각 리소스 이름이 고유한지 확인하십시오.

    $ terraform init
    
    ...
    Terraform has been successfully initialized!
    ...
    
    $ terraform plan 
    $ terraform apply
    
    ...
    Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
    




    Fig.1 terraform apply의 결과

    그러면 Azure Portal에 Azure Functions가 표시됩니다.



    Fig.2 Azure Portal의 리소스

    기능 배포


    terrafrom apply 이후에 코드를 Function with Visual Studio Code에 업로드할 수 있습니다.

    함수 앱에 코드를 배포하면 Azure Portal에서 함수를 볼 수 있습니다.



    Fig.3 Azure Portal의 기능
    .tf 파일에서 다양한 리소스를 관리하고 버전을 제어할 수 있습니다. 프로덕션에서는 GitHub Actions 또는 Azure DevOps 과 같은 CI/CD 도구를 사용해야 합니다.

    참조


  • Terraform と Azure Pipelines を使って App Service / Azure Functions をコード化して管理する
  • azurerm_function_app Example Usage (Linux) in docs produces error on apply
  • Feature Request: Attach azurerm_application_insights to a azurerm_app_service
  • azurerm_function_app
  • 좋은 웹페이지 즐겨찾기