Alıştırma - Azure kaynaklarını sağlama

Tamamlandı

Bu alıştırmada Terraform kaynaklarınızı sağlamak için bir otomasyon iş akışı yapılandıracaksınız.

Örnek uygulamaya erişme

Bu alıştırmada Terraform sağlama için tüm kodları içeren bir şablondan GitHub deposu oluşturacaksınız.

  1. GitHub'da deponun ana sayfasına gidin:

    https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
    
  2. Dosya listesinin üst kısmında Bu şablonu kullan'ı ve ardından Yeni depo oluştur'u seçin.

    mslearn-java-petclinic-basitleştirilmiş ana sayfasındaki

  3. Depo adı kutusuna deponuz için benzersiz bir ad girin. GitHub depoları için adlandırma kuralını izlediğinden emin olun.

  4. Özel seçeneğinin belirlendiğinden emin olun ve ardından Depo oluştur'u seçin.

İş Akışı

Oluşturduğunuz deponun proje dizininde terraform adlı bir dizin ve içinde main.tf adlı bir dosya görürsünüz.

Modülünüzün yapılandırmasını tanımlamak için kullanabileceğiniz birkaç bölüme bakalım:

  • Sağlayıcı: Terraform yapılandırma dosyası sağlayıcı belirtimiyle başlar. Azure'ı kullandığınızda, sağlayıcı bloğunda Azure sağlayıcısını (azurerm) belirtirsiniz.
  • Terraform: Üzerinde çalıştığınız Terraform sürümü.
  • Veri: Mevcut hizmetlerden veri alır.
  • Yerel ayarlar: İşlevleri ve ifadeleri kullanarak yeni değişkenler oluşturur.
  • Kaynak: Kaynakları ve bağımlılıkları açıklar.
  • Modül: Yeniden kullanılabilirlik ve karmaşıklık soyutlaması.

Uygulamamızı ve veritabanımızı sağlamak için yalnızca Sağlayıcı ve Kaynak bölümlerini eklememiz gerekir.

Ardından main.tf dosyasını açın ve ana hattı ve açıklamaları gözden geçirin:

provider "azurerm" {
  version = "=2.20.0"
  features {}
}

# Creates a resource group
resource "azurerm_resource_group" "main" {
  name     = var.resource_group
  location = var.location

  tags = {
    "Terraform" = "true"
  }
}

resource "random_password" "password" {
  length = 32
  special = true
  override_special = "_%@"
}

# Creates a MySQL server
resource "azurerm_mysql_server" "main" {
  name                              = "${azurerm_resource_group.main.name}-mysql-server"
  location                          = azurerm_resource_group.main.location
  resource_group_name               = azurerm_resource_group.main.name

  administrator_login               = "petclinic"
  administrator_login_password      = random_password.password.result

  sku_name   = "B_Gen5_1"
  storage_mb = 5120
  version    = "5.7"
  auto_grow_enabled                 = true
  backup_retention_days             = 7
  geo_redundant_backup_enabled      = false
  infrastructure_encryption_enabled = false
  public_network_access_enabled     = true
  ssl_enforcement_enabled           = true
  ssl_minimal_tls_version_enforced  = "TLS1_2"
}

# The database that your application will use
resource "azurerm_mysql_database" "main" {
  name                = "${azurerm_resource_group.main.name}_mysql_db"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_mysql_server.main.name
  charset             = "utf8"
  collation           = "utf8_unicode_ci"
}

# Enables the 'Allow access to Azure services' check box
resource "azurerm_mysql_firewall_rule" "main" {
  name                = "${azurerm_resource_group.main.name}-mysql-firewall"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_mysql_server.main.name
  start_ip_address    = "0.0.0.0"
  end_ip_address      = "0.0.0.0"
}

# Creates the plan that the service uses
resource "azurerm_app_service_plan" "main" {
  name                = "${var.application_name}-plan"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  kind                = "Linux"
  reserved            = true

  sku {
    tier = "PremiumV2"
    size = "P1v2"
  }
}

# Creates the service definition
resource "azurerm_app_service" "main" {
  name                = var.application_name
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  app_service_plan_id = azurerm_app_service_plan.main.id
  https_only          = true

  site_config {
    always_on        = true
    linux_fx_version = "JAVA|8-jre8"
  }

  # Contains application-specific environment variables
  app_settings = {
    "WEBSITES_ENABLE_APP_SERVICE_STORAGE" = "false"

    "SPRING_PROFILES_ACTIVE"     = "mysql"
    "SPRING_DATASOURCE_URL"      = "jdbc:mysql://${azurerm_mysql_server.main.fqdn}:3306/${azurerm_mysql_database.main.name}?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC"
    "SPRING_DATASOURCE_USERNAME" = "${azurerm_mysql_server.main.administrator_login}@${azurerm_mysql_server.main.name}"
    "SPRING_DATASOURCE_PASSWORD" = azurerm_mysql_server.main.administrator_login_password
  }
}

Terraform ile GitHub Actions iş akışınızı ayarlama

Şimdi GitHub iş akışınıza Azure hesabınıza erişim sağlayalım.

Azure CLI'da aşağıdaki komutu çalıştırarak bir hizmet sorumlusu oluşturun:

Önemli

YourServicePrincipalName< değerini kullanmak istediğiniz hizmet asıl adıyla değiştirin>.

az ad sp create-for-rbac --name "<yourServicePrincipalName>" --role contributor --scopes /subscriptions/<subscriptionId> --sdk-auth

Yukarıdaki komut aşağıdaki JSON'yi döndürür. Sonraki adımda kullanmak üzere kopyalayın:

{
  "clientId": "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "clientSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "subscriptionId": "XXXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "tenantId": "XXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXX",
  ...
}

GitHub gizli dizileri

GitHub deponuzda Gizli Diziler adlı bir özellik vardır. Burada Terraform tarafından Azure'da kimlik doğrulaması için kullanılan hassas bilgileri depolayabilirsiniz.

Önceki adımda gerekli kimlikleri ve gizli diziyi oluşturduktan sonra, bu ünitedeki sonraki adım bunları GitHub projenizdeki Gizli Diziler deposuna eklemektir.

Bu alıştırma için aşağıdaki gizli dizileri depolamanız gerekir:

  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_SUBSCRIPTION_ID
  • AZURE_TENANT_ID

Gizli dizileri depolamak için çatallanmış GitHub deponuza gidin, Ayarlar'ı ve ardından Gizli diziler ve değişkenler'i ve ardından sol bölmede Eylemler'i seçin.

Hizmet Sorumlusu'nun oluşturulmasından döndürülen değerleri kullanarak dört gizli dizi oluşturun.

Aşağıdaki ekran görüntüsünde gösterildiği gibi gizli dizileri tırnak işaretleri (" ") olmadan sakladığından emin olun:

GitHub Ayarları altında Gizli Anahtarlar sekmesinde depolanan gizlemleri gösteren ekran görüntüsü.

İş akışı dosyası

Proje dizininizin içinde .github/workflows adlı bir dizin ve içinde main.yml adlı bir dosya bulunur.

main.yml dosyası bir GitHub iş akışıdır. Uygulamanızı Azure aboneliğinize dağıtmak için yapılandırdığınız gizli diziyi kullanır.

main.yml iş akışı dosyasında aşağıdaki içeriği bulacaksınız:

name: TERRAFORM

on:
  push:
    branches: [ main ]
    paths:
    - 'terraform/**'
  pull_request:
    branches: [ main ]
    paths:
    - 'terraform/**'

  workflow_dispatch:
jobs:
  terraform:
    runs-on: ubuntu-latest

    env:
      ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{secrets.AZURE_CLIENT_SECRET}}
      ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}

    defaults:
      run:
        working-directory: ./terraform
    steps:
      - uses: actions/checkout@v2

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1

      - name: Terraform Init
        run: terraform init

      - name: Terraform Plan
        run: terraform plan

      - name: Terraform Apply
        run: terraform apply -auto-approve

Bu iş akışı aşağıdaki eylemleri gerçekleştirir:

  • Yapılandırmanın düzgün biçimlendirilip biçimlendirilmediğini denetler.
  • Her çekme isteği için bir plan oluşturur.
  • Terraform dizinindeki dosyaları güncelleştirdiğinizde yapılandırmayı tetikler.

Not

GitHub Actions iş akışını, Eylemler'e gidip Terraform iş akışını seçip Mevcut İşleri Yeniden Çalıştır'ı seçerek de tetikleyebilirsiniz.

İş akışını tetikleme

Ardından, deponuzda GitHub eyleminizi şu şekilde tetikleyin:

  1. Yerleşik GitHub metin düzenleyicisinde veya seçtiğiniz bir düzenleyicide terraform/variables.tf dosyasını aşağıdaki gibi düzenleyin:

    a. Hedeflenen kaynak grubu adınızla değiştirin "CHANGE_ME_RESOURCE_GROUP" .
    b. Hedeflenen uygulama adınızla değiştirin "CHANGE_ME_APP_NAME" . Uygulama adınızın benzersiz olduğundan emin olun.

    variable "resource_group" {
      description = "The resource group"
      default = "CHANGE_ME_RESOURCE_GROUP"
    }
    
    variable "application_name" {
      description = "The Spring Boot application name"
      default     = "CHANGE_ME_APP_NAME"
    }
    
    variable "location" {
      description = "The Azure location where all resources in this example should be created"
      default     = "westeurope"
    }
    
  2. Değişikliklerinizi işleyin.

GitHub Actions derlemesini doğrulama

  1. Deponuzda Eylemler'i ve ardından sol bölmede TERRAFORM iş akışını seçin.

  2. Adım listesinde Terraform Init, Terraform Plan ve Terraform Validate tetiklendiğini doğrulayın.

    Terraform iş akışı çalıştırmasının sonuçlarını gösteren ekran görüntüsü.

  3. Adım listesinde Terraform Uygula'yı genişletin ve şunları doğrulayın:

  • Terraform kaynakları oluşturmuştur ve Azure örneği URL'sini görüntüler.

  • Azure uygulama örneğiniz genel kullanıma açıktır.

    Azure uygulama örneğinin genel kullanıma açık olduğunu gösteren ekran görüntüsü.

Sonraki adımlar

Sonraki alıştırmada, örnek bir Spring Boot uygulaması dağıtmak için GitHub Actions'ı kullanacaksınız.

Uygulama adınızı ve Azure kaynak grubunuzu ayarlama

GitHub deponuzda, aşağıdaki eylemi gerçekleştirerek Azure kaynak adlarınızı düzenleyin:

  1. Yerleşik GitHub metin düzenleyicisinde veya seçtiğiniz bir düzenleyicide terraform/variables.tf dosyasını aşağıdaki gibi düzenleyin:

    a. Hedeflenen kaynak grubu adınızla değiştirin "<CHANGE_ME_RESOURCE_GROUP>" .
    b. Hedeflenen uygulama adınızla değiştirin "<CHANGE_ME_APP_NAME>" . Uygulama adınızın benzersiz olduğundan emin olun.

    variable "resource_group" {
      description = "The resource group"
      default = "<CHANGE_ME_RESOURCE_GROUP>"
    }
    
    variable "application_name" {
      description = "The Spring Boot application name"
      default     = "CHANGE_ME_APP_NAME"
    }
    
    variable "location" {
      description = "The Azure location where all resources in this example should be created"
      default     = "westeurope"
    }
    
  2. Değişikliklerinizi kaydetme

Terraform kaynaklarınızı sağlamak için Azure Pipeline oluşturma

Azure DevOps projemizde sağlama ve derleme ve dağıtma için iki ayrı işlem hattı oluşturacağız. Sağlama işlem hattı, daha sonraki bir noktada derleme ve dağıtma işlem hattı aracılığıyla yayınlanacak Azure kaynaklarını oluşturur.

İlk sağlama İşlem Hattını oluşturalım:

  1. Kuruluşunuzu seçin ve ardından Yeni proje'yi seçin.

  2. Aşağıdaki parametreleri belirtin.

    Parametre Açıklama
    Proje Adı Zorunlu
    Açıklama İsteğe bağlı
    Görünürlük Özel'i seçin
    Gelişmiş
    Sürüm denetimi GIT'i seçin
    İş Öğesi İşlemi Temel'i seçin
  3. Projeyi oluştur'u seçerek projeyi oluşturun ve bir karşılama sayfası açın.

Yeni Azure Project formunu gösteren ekran görüntüsü.

Azure Pipeline Service Bağlantınızı ayarlama

Şimdi Azure pipeline hesabınıza erişim verelim.

  1. Azure DevOps'ta proje ayarları sayfasından Hizmet bağlantıları sayfasını açın

  2. Hizmet bağlantısı oluştur'u ve Azure Resource Manager'ı ve ardından İleri'yi seçin.

  3. Hizmet sorumlusu (otomatik) öğesini ve ardından İleri'yi seçin.

  4. Aşağıdaki parametreleri belirtin.

    Parametre Açıklama
    Kapsam düzeyi Azure Aboneliği'ne tıklayın
    Abonelik Mevcut Azure aboneliğinizi seçin
    Kaynak Grubu Kullanıcıların abonelik içinde tanımlanan tüm kaynaklara erişmesine izin vermek için boş bırakın
    Bağlantı Adı Gerekli. Görev özelliklerinde bu hizmet bağlantısına başvurmak için kullanacağınız ad. Bu ad, Azure aboneliğinizin adı değildir.
  5. Bağlantıyı oluşturmak için Kaydet'i seçin.

Sağlama İşlem Hattı Oluşturma

Önemli

Bu modülün önkoşulları Terraform Azure Pipelines uzantısını yüklemenizi gerektiriyor. Yüklemediyseniz işlem hattınız çalışmaz.

Projenizi ve Azure bağlantısını ayarladıktan sonra terraform kaynaklarınızı sağlamak için bir Azure Pipeline oluşturmanız gerekir.

Azure DevOps'ta Projenize gidin, sol taraftaki menüde İşlem Hatları'nı ve ardından İşlem Hattı Oluştur'u seçin.

  1. "Bağlan" sekmesinde "GitHub" (YAML dosyası) öğesini seçin.
  2. GitHub erişimini yetkilendirmeniz istenirse GitHub Kimlik Bilgilerinizi girin ve istenen ayrıcalıklarla Azure Pipelines erişimini onaylayın.
  3. "Seç " sekmesinde Şablonunuzu içeren GitHub Deposunu seçin.
  4. Stok sekmesinde İşlem hattını yapılandır'ı seçin.
  5. "Yapılandır" sekmesinde bir "Mevcut Azure Pipelines YAML dosyası" kullanmayı seçin.
  6. Yolda "/azuredevops/provision.yml" öğesini seçin
  7. Gözden Geçir sekmesine gidip işlem hattınızı gözden geçirmek için Devam'ı seçin.

Yeni Azure Pipeline formunu gösteren ekran görüntüsü.

"İşlem hattı YAML'nizi gözden geçirin" ekranında İşlem Hattımızı oluşturmak için kullanacağımız Yaml dosyasını inceleyelim.

name: Provision Resources

trigger: none

pool:
  vmImage: 'ubuntu-latest'

steps:

# Initialize the Terraform environment and bind to your Service Connection
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'init'
    workingDirectory: $(Build.Repository.LocalPath)/terraform
    backendServiceArm: $(serviceConnection)
    backendAzureRmResourceGroupName: $(serviceConnection)
    backendAzureRmStorageAccountName: $(serviceConnection)
    backendAzureRmContainerName: 'tfstate'
    backendAzureRmKey: 'tf/terraform.tfstate'

# Apply the Terraform config and deploy to Azure
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'apply'
    workingDirectory: $(Build.Repository.LocalPath)/terraform
    backendAzureRmContainerName: 'tfstate'
    backendAzureRmKey: 'tf/terraform.tfstate'
    environmentServiceNameAzureRM: $(serviceConnection)

Şimdi yapılandırmada kullandığımız bazı alanlara göz atalım:

  • serviceConnection: Daha önce ayarladığınız Azure Pipeline hizmet bağlantınız
  • command: Terraform iş akışı komutunuz: init veya apply
  • backendAzure: Paylaşılan durumu depolamak için ekip ortamında gerekli alanlar.\

İşlem hattını kaydedip çalıştırmadan önce hizmet bağlantınıza bağlanacak değişkeni eklememiz gerekir:

  1. Değişkenler 'i (Sağ üst) seçin ve Hizmet Bağlantınızın adı olarak değeriyle "serviceConnection" adlı bir değişken ekleyin.
  2. Değişkeni kaydetmek için Tamam'ı (sağ alt köşe) seçin.

Yeni Hizmet Sorumlusu değişkenini gösteren ekran görüntüsü.

Son olarak işlem hattını kaydetmek ve çalıştırmak için "çalıştır" (sağ üst köşe) seçeneğini belirleyin

İşlem hattının çalışmasını izleyin

İşler'in altında, adımların her biri aracılığıyla derleme işlemini izleyin.

Pipeline'ınız çalışırken, ilk aşamanız olan Terraform init'in ve ardından ikinci aşamanız olan apply'in maviden (çalışıyor) yeşile (tamamlandı) gittiğini izleyin. İşlem hattınızın nasıl çalıştığını izlemek için aşamaları seçebilirsiniz.

Yeni Azure Pipeline çalıştırmasını gösteren ekran görüntüsü.

İpucu

E-postanızı denetleyin. Çalıştırmanızın sonuçlarını içeren bir derleme bildirimi almış olabilirsiniz. Her derlemenin başarılı mı yoksa başarısız mı olduğunu öğrenmek için bu bildirimleri kullanabilirsiniz.

Sonraki adımlar

Sonraki alıştırmada, örnek Spring Boot uygulamanızı derlemek ve dağıtmak için Azure Pipelines'ı kullanacaksınız.