[AZ-400] Manage infrastructure as code using Azure and DSC

Explore infrastructure as code and configuration management

  • ทำไมต้อง infrastructure as code (IaC) ?
Manual deploymentInfrastructure as code
Snowflake servers.
Snowflake = unique configuration that cannot be reproduced (ทำซ้ำไม่ได้)
โดยจะได้ตัว configuration drift
A consistent server between environments.
Deployment steps vary by environment.
อันนี้จริง VM > Container ถึงเกิดมาแก้ปัญหานี้
Environments are created or
scaled easily
configurations to be
More verification steps and more elaborate manual processes.
จริง ตอนทำงานต้องตรวจ และจด Click +
เยอะเหมือนกัน
Fully automated creation of
environment Updates.
ทำ Script มา Check ได้
Increased documentation to account for differences.Transition to immutable infrastructure.
มันเป็น Code/Script Run ยังไง
- ผลลัพธ์เหมือนเดิม
- และ version-controlled ได้
Deployment on weekends to allow time
to recover from errors.
Use blue/green deployments.
จากบทที่แล้ว วิธีนี้จะช่วยลด Downtime
แต่ต้องมี Hardware ทำ Blue/Green นะ
Slower release cadence to minimize pain
and long weekends.
Treat servers as cattle(โคขุน?), not pets.
  • ทำไมต้อง configuration as code ?
    • คล้ายๆ infrastructure as code หลังๆก็ลด Bug / เพิ่ม Consistency / จัดการเวอร์ชันได้ง่าย / Deploy + Scale เร็ว
  • imperative vs declarative configuration
    • Declarative (functional) - what the final state should be //ไม่ Logic เขียนอะไรมา Run ๆได้อย่างนั้นเลย ไม่รู้ว่ามายังไง ทำไมต้องแบบนี้ (abstracts นั้นเอง) ตัวอย่างเช่น Azure Resource Manage Template
    • Imperative (procedural) - how for the final state //มี Logic การตัดสินใจ เช่น IF-ELSE / FOR
    • Note ไม่วิธีการไหนที่ดีที่สุดนะ
  • idempotent configuration
    • infrastructure as code - Run แบบไหนได้แบบนั้น เหมือน Math เช่น 1+1 = 2
    • แต่ถ้าจะทำให้เป็น idempotent ถ้ามีแล้ว recreating / การจัดดารพวก Resource Name+ID
  • Knowledge check: Explore infrastructure as code and configuration management

Create Azure resources using Azure Resource Manager templates

  • Azure Resource Manager templates ดียังไง ?
    • improve consistency
    • express complex deployments (ทำให้มันง่าย และมีลำดับ) + reduce manual, error-prone tasks และเป็น Declarative รูปแบบ JSON
    • reuse + modular และ linkable แทนที่จะทำ ARM ชุดใหญ่ๆ ก็มาทำที่ละ Sub System แทน
  • Explore template components
    • Parameters / Variables / Functions / Resources / Outputs
    • Manage dependencies - ใช้คำสั่ง dependsOn เพื่อบอกว่าต้องรออะไรก่อน ทำงานชั้นต่อไป
      • แต่ต้องระวัง Circular Reference
    • Modularize templates
      • Linked template แยกไฟล์ ARM Template เชื่อมด้วย Link
      • Nested template รวมไฟล์ ARM Template ทำให้ทั้งหมดอยู่ไฟล์เดียว
    • Deployments modes - best practice, one resource group per deployment.
      • validate
      • incremental mode (default)
      • complete mode
  • Securing an external template - ใช้ shared access signature (SAS) tokens
Manage secrets in templates

Create Azure resources by using Azure CLI

  • Azure CLI - เป็นชุดคำสั่งที่เอาไว้จัดการ resource บน Azure
    • Interactive - เขียนยน Shell และ Execute ขึ้นมาเลย
    • Scripted - ทำเป็นไฟล์ เอาไว้รันซ้ำได้
  • ถ้าไม่รู้ Command คำสั่ง az find <service / keyword>
    หรือ az [groups] [subgroups] --help
  • รูปแบบของ Azure CLI จะแยกเป็น 2 กลุ่ม
    • groups - สื่อถึง Service ของ Azure
    • subgroups - คำสั่งที่ใช้ได้กับ Service นั้นๆ
  • ตัวอย่าง เช่น Resource Group / VM
az group create --name <name> --location <location>
az group list --output table

az vm create -g MyResourceGroup -n MyVm --image MyImage
az vm start -g MyResourceGroup -n MyVm
az vm stop -g MyResourceGroup -n MyVm

Explore Azure Automation with DevOps

  • Azure Automation เป็น cloud-based automation service จัดการงาน Manual / ทำซ้ำบ่อยๆ และมี Workflows ของมัน เพื่อมาดู Infra ของ Azure หรือ เจ้าอื่นๆ (เห็น AWS) หรือ On-Premise ก็ได้ มองว่าเป็น Power Automate ของ Infra ก็ได้นะ
    • Process automation
    • Azure Automation State Configuration - PowerShell DSC << เอามา Monitor ว่าทุก Resouces Configuration ไปทางเดียวกันไหม ?
    • Monitor + Update management
    • Start and stop virtual machines (VMs)
    • Manage Shared resources
    • Run backups - ใน Non-DB เช่น BLOB
  • การใช้งาน
    • Create automation accounts
    • สร้าง หรือ Import Run Book (จาก Run Book Gallery) โดยทำแบบ GUI / PowerShell / Python ก็ได้ ถ้าต้องการทำ Flow ดูตัวอย่างจาก Azure Automation (github.com)
    • Run Book + Source Control Integration - สามารถเก็บ Script ไว้ใน GitHub / Azure DevOps (Git) / Azure DevOps (TFVC)
  • Automation Shared Resources - ส่วนที่เอาไปใช้ในตัว Run Book ได้
  • Webhook เป็นทางเลือกให้ Azure Automation ทำงานนอกเหนือจาก Schedule วิธีการนี้สามารถให้ Service อื่นๆ ของ Azure DevOps หรือ REST ใดๆมาใช้งานผ่าน Protocol HTTPS 
  • PowerShell Workflow - Runbook แบบ PowerShell จะเริ่มต้นด้วย Keyword WordFlow โดยใน Workflow Activity หลายๆอย่างข้างใน
workflow MyFirstRunbook-Workflow
{
   ForEach -Parallel -ThrottleLimit 10 ($<item> in $<collection>)
   {
    <Activity1>
    <Activity2>
   }
   <Activity3>
}
  • Example PowerShell Workflow
workflow MyFirstRunbook-Workflow
{
      Param(
            [string]$VMName,
            [string]$ResourceGroupName
        )
      ....
      #Task1: Start VM
      Start-AzureRmVM -Name $VMName -ResourceGroupName $ResourceGroupName
      ....
      #Task2: copy file
      $files = @("C:\LocalPath\File1.txt","C:\LocalPath\File2.txt","C:\LocalPath\File3.txt")
   
      ForEach -Parallel -ThrottleLimit 10 ($File in $Files)
      {
          Copy-Item -Path $File -Destination \\NetworkPath
          Write-Output "$File copied."
      }
      Write-Output "All files copied."
}

Implement Desired State Configuration (DSC)

  • ปัญหา configuration drift เกิดจากตัว Environment เรามันไม่เหมือนเดิมจากที่เคย Initial ไว้ อาทิ เช่น Path ที่ลง App ไม่เหมือนเดิม (เคสนี้ส่วนตัวเจอจริงนะ ลูกค้า Deploy Tomcat ผิด path สรุปต้องใช้จน Server นั้น EOL เลย) หรือ Port เปลี่ยน
  • ตรวจสอบ configuration drift
    • ใช้ Azure Policy
    • ใช้ Desired State Configuration (DSC) - ทำ Configuration มาตรวจสอบว่า Environment ยังเหมือนเดิมไหม ได้ทั้ง Windows และ Linux
  • Desired State Configuration (DSC) - components
    • Configurations อยู่นอกสุด
      • Node block กำหนดกลุ่ม Area ที่ต้องการตรวจสอบ
    • Resources - configuration sets + properties สำหรับ resources / node นั้นๆ จากตัวอย่าง IIS/Bitlocker
    • Local Configuration Manager (LCM) - runs on the nodes or machines you wish to configure
Configuration MyDscConfiguration
{
    param
    (
       [string[]]$ComputerName='localhost'
    )
   
    Node $ComputerName
    {
       WindowsFeature IIS
       {
          Ensure = 'Present'
          Name = 'Web-Server'
          IncludeAllSubFeature = $true       
       }
   
       WindowsFeature Bitlocker
       {
          Ensure = 'Present'
          Name = 'Bitlocker'
       }
    }
}
   
MyDscConfiguration
  • Implementing DSC โดยจัดการจาก Azure Automation เพราะ มี Built-in pull server / DSC artifacts และ reporting data > Log Analytics โดยการจัดการ Node (Workload ที่สนใจ) มีรูปแบบ ดังนี้
    • Push mode - User สั่งจากยิง DSC ไปยัง target node ทั้งที
    • Pull mode - แต่ละ Node มาขอ DSC จาก Server กลาง
  • สำหรับ hybrid management จะใช้ Azure Automation WebHook เข้ามาช่วย

Implement Bicep

  • Azure Bicep is the next revision of ARM templates
  • Understand Bicep file structure and syntax
    • Scope - resourceGroup (Default) / subscription / managementGroup / tenant
    • Parameters
    • Variables
    • Resources - implicit dependency like a parent-child relationship. //location, name, and properties
    • Modules - reusable templates
    • Outputs
@minLength(3)
@maxLength(11)
param storagePrefix string

param storageSKU string = 'Standard_LRS'
param location string = resourceGroup().location

var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'

resource stg 'Microsoft.Storage/storageAccounts@2019-04-01' = {
    name: uniqueStorageName
    location: location
    sku: {
        name: storageSKU
    }
    kind: 'StorageV2'
    properties: {
        supportsHttpsTrafficOnly: true
    }

    resource service 'fileServices' = {
        name: 'default'

        resource share 'shares' = {
            name: 'exampleshare'
        }
    }
}

module webModule './webApp.bicep' = {
    name: 'webDeploy'
    params: {
        skuName: 'S1'
        location: location
    }
}

output storageEndpoint object = stg.properties.primaryEndpoints

Note:

  • สำหรับ Azure SQL เวลา Deploy เค้าจะแนะนำให้ทำ DACPAC ที่มันจะมัดรวม schema changes + data.

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.