Hızlı Başlangıç: Terraform kullanarak Azure Front Door Standard/Premium profili oluşturma

Bu hızlı başlangıçta Terraform kullanarak web uç noktası için yüksek kullanılabilirlik ayarlamak üzere front door profili oluşturma işlemi açıklanmaktadır.

Not

Web iş yükleri için, yeni ortaya çıkan DDoS saldırılarına karşı koruma sağlamak için Azure DDoS koruması ve web uygulaması güvenlik duvarı kullanmanızı kesinlikle öneririz. Bir diğer seçenek de Azure Front Door'un yanı sıra bir web uygulaması güvenlik duvarı kullanmaktır. Azure Front Door, ağ düzeyinde DDoS saldırılarına karşı platform düzeyinde koruma sunar. Daha fazla bilgi için bkz . Azure hizmetleri için güvenlik temeli.

Bu makalede şunları öğreneceksiniz:

  • random_pet kullanarak Azure kaynak grubu adı için rastgele bir değer oluşturun.
  • azurerm_resource_group kullanarak bir Azure kaynak grubu oluşturun.
  • random_id kullanarak Front Door uç noktası kaynak adı ve App Service uygulama adı için rastgele bir değer oluşturun.
  • azurerm_cdn_frontdoor_profile kullanarak bir Front Door profili oluşturun.
  • azurerm_cdn_frontdoor_endpoint kullanarak bir Front Door uç noktası oluşturun.
  • azurerm_cdn_frontdoor_origin_group kullanarak Front Door kaynak grubu oluşturma
  • azurerm_cdn_frontdoor_origin kullanarak App Service uygulamasına başvuran bir Front Door kaynağı oluşturun.
  • azurerm_cdn_frontdoor_route kullanarak bir Front Door yolu oluşturun.
  • azurerm_service_plan kullanarak bir App Service planı oluşturun.
  • azurerm_windows_web_app kullanarak bir App Service uygulaması oluşturun.

Önkoşullar

Terraform kodunu uygulama

Not

Bu makalenin örnek kodu Azure Terraform GitHub deposunda bulunur. Terraform'un geçerli ve önceki sürümlerinden test sonuçlarını içeren günlük dosyasını görüntüleyebilirsiniz.

Azure kaynaklarını yönetmek için Terraform'un nasıl kullanılacağını gösteren diğer makalelere ve örnek koda bakın

  1. Örnek Terraform kodunu test etmek ve geçerli dizin yapmak için bir dizin oluşturun.

  2. adlı providers.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    terraform {
      required_version = ">=1.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    provider "azurerm" {
      features {}
    }
    
  3. adlı main.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    resource "random_pet" "rg-name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      name     = random_pet.rg-name.id
      location = var.resource_group_location
    }
    
    resource "random_id" "front_door_endpoint_name" {
      byte_length = 8
    }
    
    locals {
      front_door_profile_name      = "MyFrontDoor"
      front_door_endpoint_name     = "afd-${lower(random_id.front_door_endpoint_name.hex)}"
      front_door_origin_group_name = "MyOriginGroup"
      front_door_origin_name       = "MyAppServiceOrigin"
      front_door_route_name        = "MyRoute"
    }
    
    resource "azurerm_cdn_frontdoor_profile" "my_front_door" {
      name                = local.front_door_profile_name
      resource_group_name = azurerm_resource_group.rg.name
      sku_name            = var.front_door_sku_name
    }
    
    resource "azurerm_cdn_frontdoor_endpoint" "my_endpoint" {
      name                     = local.front_door_endpoint_name
      cdn_frontdoor_profile_id = azurerm_cdn_frontdoor_profile.my_front_door.id
    }
    
    resource "azurerm_cdn_frontdoor_origin_group" "my_origin_group" {
      name                     = local.front_door_origin_group_name
      cdn_frontdoor_profile_id = azurerm_cdn_frontdoor_profile.my_front_door.id
      session_affinity_enabled = true
    
      load_balancing {
        sample_size                 = 4
        successful_samples_required = 3
      }
    
      health_probe {
        path                = "/"
        request_type        = "HEAD"
        protocol            = "Https"
        interval_in_seconds = 100
      }
    }
    
    resource "azurerm_cdn_frontdoor_origin" "my_app_service_origin" {
      name                          = local.front_door_origin_name
      cdn_frontdoor_origin_group_id = azurerm_cdn_frontdoor_origin_group.my_origin_group.id
    
      enabled                        = true
      host_name                      = azurerm_windows_web_app.app.default_hostname
      http_port                      = 80
      https_port                     = 443
      origin_host_header             = azurerm_windows_web_app.app.default_hostname
      priority                       = 1
      weight                         = 1000
      certificate_name_check_enabled = true
    }
    
    resource "azurerm_cdn_frontdoor_route" "my_route" {
      name                          = local.front_door_route_name
      cdn_frontdoor_endpoint_id     = azurerm_cdn_frontdoor_endpoint.my_endpoint.id
      cdn_frontdoor_origin_group_id = azurerm_cdn_frontdoor_origin_group.my_origin_group.id
      cdn_frontdoor_origin_ids      = [azurerm_cdn_frontdoor_origin.my_app_service_origin.id]
    
      supported_protocols    = ["Http", "Https"]
      patterns_to_match      = ["/*"]
      forwarding_protocol    = "HttpsOnly"
      link_to_default_domain = true
      https_redirect_enabled = true
    }
    
  4. adlı app-service.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    resource "random_id" "app_name" {
      byte_length = 8
    }
    
    locals {
      app_name              = "myapp-${lower(random_id.app_name.hex)}"
      app_service_plan_name = "AppServicePlan"
    }
    
    resource "azurerm_service_plan" "app_service_plan" {
      name                = local.app_service_plan_name
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      sku_name     = var.app_service_plan_sku_name
      os_type      = "Windows"
      worker_count = var.app_service_plan_capacity
    }
    
    resource "azurerm_windows_web_app" "app" {
      name                = local.app_name
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      service_plan_id     = azurerm_service_plan.app_service_plan.id
    
      https_only = true
    
      site_config {
        ftps_state          = "Disabled"
        minimum_tls_version = "1.2"
        ip_restriction {
          service_tag               = "AzureFrontDoor.Backend"
          ip_address                = null
          virtual_network_subnet_id = null
          action                    = "Allow"
          priority                  = 100
          headers {
            x_azure_fdid      = [azurerm_cdn_frontdoor_profile.my_front_door.resource_guid]
            x_fd_health_probe = []
            x_forwarded_for   = []
            x_forwarded_host  = []
          }
          name = "Allow traffic from Front Door"
        }
      }
    }
    
  5. adlı variables.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    variable "resource_group_location" {
      type        = string
      description = "Location for all resources."
      default     = "eastus"
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
      default     = "rg"
    }
    
    variable "app_service_plan_sku_name" {
      type        = string
      description = "The SKU for the plan. Possible values include: B1, B2, B3, D1, F1, I1, I2, I3, I1v2, I2v2, I3v2, I4v2, I5v2, I6v2, P1v2, P2v2, P3v2, P0v3, P1v3, P2v3, P3v3, P1mv3, P2mv3, P3mv3, P4mv3, P5mv3, S1, S2, S3, SHARED, EP1, EP2, EP3, WS1, WS2, WS3, Y1."
      default     = "S1"
      validation {
        condition     = contains(["B1", "B2", "B3", "D1", "F1", "I1", "I2", "I3", "I1v2", "I2v2", "I3v2", "I4v2", "I5v2", "I6v2", "P1v2", "P2v2", "P3v2", "P0v3", "P1v3", "P2v3", "P3v3", "P1mv3", "P2mv3", "P3mv3", "P4mv3", "P5mv3", "S1", "S2", "S3", "SHARED", "EP1", "EP2", "EP3", "WS1", "WS2", "WS3", "Y1"], var.app_service_plan_sku_name)
        error_message = "The SKU value must be one of the following: B1, B2, B3, D1, F1, I1, I2, I3, I1v2, I2v2, I3v2, I4v2, I5v2, I6v2, P1v2, P2v2, P3v2, P0v3, P1v3, P2v3, P3v3, P1mv3, P2mv3, P3mv3, P4mv3, P5mv3, S1, S2, S3, SHARED, EP1, EP2, EP3, WS1, WS2, WS3, Y1."
      }
    }
    
    variable "app_service_plan_capacity" {
      type        = number
      description = "The number of Workers (instances) to be allocated."
      default     = 1
    }
    
    variable "front_door_sku_name" {
      type        = string
      description = "The SKU for the Front Door profile. Possible values include: Standard_AzureFrontDoor, Premium_AzureFrontDoor"
      default     = "Standard_AzureFrontDoor"
      validation {
        condition     = contains(["Standard_AzureFrontDoor", "Premium_AzureFrontDoor"], var.front_door_sku_name)
        error_message = "The SKU value must be one of the following: Standard_AzureFrontDoor, Premium_AzureFrontDoor."
      }
    }
    
  6. adlı outputs.tf bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    
    output "frontDoorEndpointHostName" {
      value = azurerm_cdn_frontdoor_endpoint.my_endpoint.host_name
    }
    

Terraform'u başlatma

Terraform dağıtımını başlatmak için terraform init komutunu çalıştırın. Bu komut, Azure kaynaklarınızı yönetmek için gereken Azure sağlayıcısını indirir.

terraform init -upgrade

Önemli noktalar:

  • -upgrade parametresi, gerekli sağlayıcı eklentilerini yapılandırmanın sürüm kısıtlamalarına uygun en yeni sürüme yükseltir.

Terraform yürütme planı oluşturma

Terraform planını çalıştırarak yürütme planı oluşturun.

terraform plan -out main.tfplan

Önemli noktalar:

  • komutu terraform plan bir yürütme planı oluşturur ancak yürütmez. Bunun yerine, yapılandırma dosyalarınızda belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu düzen, gerçek kaynaklarda değişiklik yapmadan önce yürütme planının beklentilerinizle eşleşip eşleşmediğini doğrulamanızı sağlar.
  • İsteğe bağlı -out parametresi, plan için bir çıkış dosyası belirtmenize olanak tanır. parametresinin -out kullanılması, gözden geçirdiğiniz planın tam olarak uygulanan plan olmasını sağlar.

Terraform yürütme planı uygulama

Yürütme planını bulut altyapınıza uygulamak için terraform apply komutunu çalıştırın.

terraform apply main.tfplan

Önemli noktalar:

  • Örnek terraform apply komut, daha önce komutunu çalıştırdığınızı terraform plan -out main.tfplanvarsayar.
  • parametresi için -out farklı bir dosya adı belirttiyseniz, çağrısında terraform applyaynı dosya adını kullanın.
  • parametresini -out kullanmadıysanız, parametresiz olarak çağırın terraform apply .

Sonuçları doğrulama

  1. Front Door uç noktasını alın:

    terraform output -raw frontDoorEndpointHostName
    
  2. Uç noktayı bir tarayıcıya yapıştırın.

    Uç noktaya başarılı bir bağlantının ekran görüntüsü.

Kaynakları temizleme

Terraform aracılığıyla oluşturulan kaynaklara artık ihtiyacınız kalmadığında aşağıdaki adımları uygulayın:

  1. terraform planını çalıştırın ve bayrağını destroy belirtin.

    terraform plan -destroy -out main.destroy.tfplan
    

    Önemli noktalar:

    • komutu terraform plan bir yürütme planı oluşturur ancak yürütmez. Bunun yerine, yapılandırma dosyalarınızda belirtilen yapılandırmayı oluşturmak için hangi eylemlerin gerekli olduğunu belirler. Bu düzen, gerçek kaynaklarda değişiklik yapmadan önce yürütme planının beklentilerinizle eşleşip eşleşmediğini doğrulamanızı sağlar.
    • İsteğe bağlı -out parametresi, plan için bir çıkış dosyası belirtmenize olanak tanır. parametresinin -out kullanılması, gözden geçirdiğiniz planın tam olarak uygulanan plan olmasını sağlar.
  2. Yürütme planını uygulamak için terraform apply komutunu çalıştırın.

    terraform apply main.destroy.tfplan
    

Azure'da Terraform sorunlarını giderme

Azure'da Terraform kullanırken karşılaşılan yaygın sorunları giderme

Sonraki adımlar