Latihan - Menyediakan sumber daya Azure

Selesai

Dalam latihan ini, Anda akan mengonfigurasi alur kerja otomatisasi untuk menyediakan sumber daya Terraform Anda.

Mengakses aplikasi contoh

Dalam latihan ini, Anda akan membuat repositori GitHub dari templat yang berisi semua kode untuk penyediaan Terraform.

  1. Di GitHub, buka halaman utama repositori:

    https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
    
  2. Di atas daftar file, pilih Gunakan templat ini, lalu pilih Buat repositori baru.

    Cuplikan layar tombol

  3. Dalam kotak Nama repositori , masukkan nama unik untuk repositori Anda. Pastikan mengikuti konvensi penamaan untuk repositori GitHub.

  4. Pastikan bahwa opsi Privat dipilih, lalu pilih Buat repositori.

    Cuplikan layar tombol

Alur kerja

Di dalam direktori proyek untuk repositori yang telah Anda buat, Anda akan melihat direktori yang disebut terraform dan, di dalamnya, file yang disebut main.tf.

Mari kita lihat beberapa bagian yang mungkin Anda gunakan untuk menentukan konfigurasi modul Anda:

  • Penyedia: File konfigurasi Terraform dimulai dengan spesifikasi penyedia. Saat Anda menggunakan Azure, Anda menentukan penyedia Azure (azurerm) di blok penyedia.
  • Terraform: Versi Terraform yang sedang Anda gunakan.
  • Data: Mendapatkan data dari layanan yang ada.
  • Lokal: Menghasilkan variabel baru dengan menggunakan fungsi dan ekspresi.
  • Sumber Daya: Menjelaskan sumber daya dan dependensi.
  • Modul: Penggunaan kembali dan abstraksi kompleksitas.

Untuk memprovisikan aplikasi dan database kami, kami hanya perlu menyertakan bagian Penyedia dan Sumber Daya .

Selanjutnya, buka file main.tf dan tinjau kerangka dan komentar:

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
  }
}

Menyiapkan alur kerja GitHub Actions Anda dengan Terraform

Mari kita sediakan akses alur kerja GitHub ke akun Azure Anda.

Di Azure CLI, buat perwakilan layanan dengan menjalankan perintah berikut:

Penting

Ganti <yourServicePrincipalName> dengan nama perwakilan layanan yang ingin Anda gunakan.

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

Perintah sebelumnya mengembalikan JSON berikut. Salin untuk digunakan di langkah berikutnya:

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

Rahasia GitHub

Repositori GitHub Anda memiliki fitur bernama Secrets, di mana Anda dapat menyimpan informasi sensitif yang digunakan oleh Terraform untuk mengautentikasi ke Azure.

Setelah Anda membuat KTP yang diperlukan dan rahasia di langkah sebelumnya, langkah selanjutnya dalam unit ini adalah menambahkannya ke toko Secrets di proyek GitHub Anda.

Untuk latihan ini, Anda perlu menyimpan rahasia berikut:

  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_SUBSCRIPTION_ID
  • AZURE_TENANT_ID

Untuk menyimpan rahasia, buka repositori GitHub fork Anda, pilih Pengaturan, lalu pilih Rahasia dan variabel, lalu pilih Tindakan di panel kiri.

Buat empat rahasia menggunakan nilai yang dikembalikan dari pembuatan Perwakilan Layanan.

Pastikan untuk menyimpan rahasia tanpa tanda kutip (" "), seperti yang ditunjukkan pada tangkapan layar berikut:

Cuplikan layar memperlihatkan rahasia yang disimpan di panel Rahasia di bawah Pengaturan GitHub.

File alur kerja

Di dalam direktori proyek Anda adalah direktori yang disebut .github/workflows dan, di dalamnya, file yang disebut main.yml.

File main.yml adalah alur kerja GitHub. Alur kerja ini menggunakan rahasia yang telah Anda konfigurasi untuk menerapkan aplikasi Anda ke langganan Azure Anda.

Dalam file alur kerja main.yml , Anda akan menemukan konten berikut:

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

Alur kerja ini melakukan tindakan berikut:

  • Memeriksa apakah konfigurasi diformat dengan benar.
  • Menghasilkan rencana untuk setiap permintaan tarik.
  • Ini memicu konfigurasi saat Anda memperbarui file di direktori terraform .

Catatan

Anda juga dapat memicu alur kerja GitHub Actions dengan masuk ke Tindakan, memilih alur kerja Terraform, dan memilih Jalankan kembali Pekerjaan yang ada.

Memicu alur kerja

Selanjutnya, di repositori Anda, picu tindakan GitHub Anda dengan:

  1. Di editor teks GitHub bawaan, atau di editor pilihan Anda, edit terraform/variables.tf sebagai berikut:

    sebuah. Ubah "CHANGE_ME_RESOURCE_GROUP" ke nama grup sumber daya yang Anda maksudkan.
    b. Ubah "CHANGE_ME_APP_NAME" ke nama aplikasi yang Anda maksudkan. Pastikan nama aplikasi Anda unik.

    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. Terapkan perubahan Anda.

Memverifikasi build GitHub Actions

  1. Di repositori Anda, pilih Tindakan, lalu pilih alur kerja TERRAFORM di panel kiri.

  2. Dalam daftar langkah-langkah, verifikasi bahwa Terraform Init, Terraform Plan, dan Terraform Validate telah dipicu.

    Cuplikan layar yang menampilkan hasil eksekusi alur kerja Terraform.

  3. Dalam daftar langkah-langkah, perluas Terraform Apply, dan verifikasi bahwa:

  • Terraform telah membuat sumber daya dan menampilkan Azure instance URL.

  • Instans aplikasi Azure Anda tersedia untuk umum.

    Cuplikan layar memperlihatkan bahwa instans aplikasi Azure tersedia untuk umum.

Langkah berikutnya

Pada latihan berikutnya, Anda akan menggunakan GitHub Actions untuk menyebarkan contoh aplikasi Spring Boot.

Menyiapkan nama aplikasi dan grup sumber daya Azure Anda

Di repositori GitHub Anda, edit nama sumber daya Azure Anda dengan melakukan tindakan berikut:

  1. Di editor teks GitHub bawaan, atau di editor pilihan Anda, edit terraform/variables.tf sebagai berikut:

    sebuah. Ubah "<CHANGE_ME_RESOURCE_GROUP>" ke nama grup sumber daya yang Anda maksudkan.
    b. Ubah "<CHANGE_ME_APP_NAME>" ke nama aplikasi yang Anda maksudkan. Pastikan nama aplikasi Anda unik.

    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. Menerapkan perubahan Anda

Membuat Azure Pipeline untuk menyediakan sumber daya Terraform Anda

Dalam proyek Azure DevOps kami, kami akan membuat dua alur terpisah untuk penyediaan dan membangun dan menerapkan. Alur penyediaan membuat sumber daya Azure yang akan dirilis melalui alur membangun dan menerapkan di titik selanjutnya.

Mari kita buat Alur penyediaan pertama:

  1. Pilih organisasi Anda, lalu pilih Proyek baru.

  2. Tentukan parameter berikut.

    Pengaturan Deskripsi
    Nama Proyek Wajib
    Deskripsi Opsional
    Visibilitas Pilih Privat
    Tingkat Lanjut
    Kontrol versi Pilih GIT
    Proses Item Kerja Pilih Dasar
  3. Pilih Buat proyek untuk membuat proyek dan membuka halaman selamat datang.

Cuplikan layar menampilkan formulir Azure Project baru.

Menyiapkan Azure Pipeline Service Connection

Mari kita berikan akses Azure Pipeline Anda ke akun Azure Anda.

  1. Di Azure DevOps, buka halaman Koneksi layanan dari halaman pengaturan proyek

  2. Pilih Buat koneksi layanan dan pilih Azure Resource Manager, lalu pilih Berikutnya.

  3. Pilih Principal layanan (otomatis), lalu pilih Berikutnya.

  4. Tentukan parameter berikut.

    Pengaturan Deskripsi
    Tingkat cakupan Pilih Langganan Azure
    Langganan Pilih langganan Azure Anda yang sudah ada
    Grup Sumber Daya Biarkan kosong untuk memperbolehkan pengguna mengakses semua sumber daya yang ditentukan dalam langganan
    Nama Koneksi Harus diisi. Nama yang akan Anda gunakan untuk merujuk ke sambungan layanan ini dalam properti tugas. Nama ini bukan nama langganan Azure Anda.
  5. Pilih Simpan untuk membuat koneksi.

Buat Alur Penyediaan

Penting

Prasyarat modul ini mengharuskan Anda menginstal ekstensi Terraform Azure Pipelines. Jika Anda belum menginstalnya, alur Anda tidak akan berjalan.

Setelah menyiapkan proyek dan koneksi ke Azure, Anda harus membuat Azure Pipeline untuk menyediakan sumber daya terraform Anda.

Di Azure DevOps, buka Proyek Anda, pilih Alur di menu sebelah kiri, lalu pilih Buat Alur.

  1. Pada tab "Sambungkan", pilih "GitHub" (file YAML).
  2. Jika diminta untuk mengotorisasi akses GitHub, masukkan informasi masuk GitHub Anda dan setujui akses untuk Azure Pipelines dengan hak istimewa yang diminta.
  3. Pada tab "Pilih", pilih Repositori GitHub yang berisi Templat Anda.
  4. Pilih Konfigurasikan alur pada tab Inventarisasi .
  5. Pada tab "Konfigurasikan", pilih untuk menggunakan "File YAML Alur Azure yang Ada".
  6. Di jalur, pilih "/azuredevops/provision.yml"
  7. Pilih Lanjutkan untuk membuka tab Tinjau dan tinjau alur Anda.

Cuplikan layar menampilkan formulir Azure Pipeline baru.

Pada layar "Tinjau yaml alur Anda", mari kita periksa file Yaml yang akan kami gunakan untuk membuat Alur kami.

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)

Mari kita lihat beberapa bidang yang kita gunakan dalam konfigurasi:

  • serviceConnection: Koneksi Layanan Azure Pipeline yang Anda atur sebelumnya
  • perintah: Perintah alur kerja Terraform Anda: init atau terapkan
  • backendAzure: Bidang yang diperlukan di lingkungan tim untuk menyimpan status bersama.\

Sebelum Anda menyimpan dan menjalankan alur, kita perlu menambahkan variabel yang akan mengikat koneksi layanan Anda:

  1. Pilih Variabel (Kanan atas) dan tambahkan variabel bernama "serviceConnection" dengan nilai sebagai nama Koneksi Layanan Anda.
  2. Pilih OK (sudut kanan bawah) untuk menyimpan variabel.

Cuplikan layar yang menampilkan variabel Principal Layanan baru.

Terakhir, pilih "jalankan" (sudut kanan atas) untuk menyimpan dan menjalankan alur

Tonton alur yang dijalankan

Di bawah Pekerjaan, lacak proses build melalui setiap langkah.

Ketika pipeline Anda berjalan, amati tahap init Terraform pertama Anda, lalu tahap penerapan kedua Anda, berubah dari biru (berjalan) ke hijau (selesai). Anda dapat memilih tahapan untuk menonton alur Anda beraksi.

Cuplikan layar menunjukkan pemrosesan Azure Pipeline baru.

Petunjuk / Saran

Periksa email Anda. Anda mungkin telah menerima pemberitahuan build dengan hasil yang Anda jalankan. Anda dapat menggunakan pemberitahuan ini untuk mengetahui apakah setiap build lolos atau gagal.

Langkah berikutnya

Pada latihan berikutnya, Anda akan menggunakan Azure Pipelines untuk membangun dan menerapkan contoh aplikasi Spring Boot Anda.