Custom Resource Providers ve Azure Function Kullanım Örnekleri – Bölüm 2
  1. Anasayfa
  2. DevOps

Custom Resource Providers ve Azure Function Kullanım Örnekleri – Bölüm 2

0

Bir önceki yazımızda Custom Resource Providers Nedir? kavramını tanımlamak ve ona bağlı olan komponentleri anlamak ile ilgilenmiştik. Bu yazımızda ise, Custom Resource Providers kullanımının nasıl olduğundan bahsediyor olacağız.

Custom Resource Provider nasıl tanımlanır?

Custom Resource Providers, Azure ile endpoint (Azure Function) arasında karşılıklı ilişkileri tanımlayan bir listedir. Bu karşılıklı tanımlamalar Azure’un herhangi bir endpoint ile nasıl etkileşime girmesi gerektiğini açıklar. Custom Resource Provider‘lar bir proxy gibi davranır ve belirtilen endpoint için gelen istekleri alır ve yanıtları onlara iletir. Bu kısımda endpoint arkasında çalışan bizim geliştirdiğimiz bir adet Powershell Core ile yazılmış Script olduğunu düşünelim ve onu Azure Function hizmetine deploy edip, endpoint olarak kullanacağız Azure Function olmasının sebebi tamamen Azure Servislerinden faydalanmak. Custom Resource Providers iki tür sözleşme/tanımlar modeli belirtebilir bunlar sırasıyla;

  • resourceTypes
  • Actions

Bunlar endpoint tanımlarını belirtirken kullanılır ve her ikiside farklı API özellikleri bizlere sunar ve onlar aracılığıyla etkileşim içine geçilebiliriz.

  • name,
  • routingType
  • endpoint.

Resim-1

{
    "name": "{endpointDefinitionName}",
    "routingType": "Proxy",
    "endpoint": "https://{endpointURL}/"
}

Yukarıda gördüğünüz, bir endpoint tanımının alması gereken öznitelikleri yani propertyleri görebilirsiniz. Bu property’lerin ne iş yaptıklarına kısaca göz gezdirelim.

Resim-2

Tablo içerisinde bahsettiğimiz ve yukarıdaki örnek JSON dosyası içerisinde sıradan bir Endpoint tanımlasını nasıl yapmamız gerektiğinden bahsettik. Şimdi ise bu endpoint tanımlasını Azure Resource Manager Şablonu içerisinde nasıl kullanabileceğiz ve nasıl Custom Resource tanımlamasını yapabiliriz buna beraber bakalım. Öncelikle Custom Resource için Resouce Types anlaşma/tanım özelliğini kullanılım. Aşağıda gördüğünüz tanımın temelinde bize yeni bir API sunar ve tüm operasyonunda RESTful özelinde Create, Read, Update, Delete (CRUD) yöntemlerini ortaya koyar ve destekler.

Resim-3

{
    "properties": {
      "resourceTypes": [
        {
          "name": "myCustomResources",
          "routingType": "Proxy",
          "endpoint": "https://{endpointURL}/"
        }
      ]
    },
    "location": "eastus"
  }

Yukarıdaki tanımladığımız JSON içerisinde artık Azure API bu detayları gönderdikten sonra Custom Resource ile nasıl iletişime geçeceğini ve eklenen API Detayları aşağıda bulabilirsiniz. Girdiğiniz resourceType adına göre Azure REST API gerekli CRUD işlemleri için API tanımlamaları yapılacaktır. ResourceType olarak kullanılan Custom Resource Provider tipinde yapılan istek sonrası endpoint kesinlikle Id, Name ve Type göndermelidir. Bunlar sırasıyla,

  • Id: “/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/
    Microsoft.CustomProviders/resourceProviders/{customResourceName}”,
  • Name: “{customResourceName}”,
  • Type: “Microsoft.CustomProviders/resourceProviders/{resourceTypeName}”

Bunların detaylarını geliştirmiş olduğum Powershell code bloğu içerisinde bulabilirsiniz. Return Response olarak bu değerleri geriye dönmeniz gerekiyor, Deployment sürecinin başarılı tamamladığını anlatmak için Azure API tarafına göndermeniz şart.

Resim-4

Custom Resource Provider için Custom Actions nasıl tanımlanır?

Daha öncede söylediğimiz gibi iki adet farklı endpoint ile anlaşma kurabileceğimiz karşılıklı anlaşma modelimiz var idi. Bunlardan diğeri olan Custom Actions en basit haliyle, Custom Resource Provider tanımlamasını yaptığımız zaman Azure bize, Action için bir Rest API sunar ama sadece Post methodunu destekler. Yazı serimiz boyunca ResourceType tanımı üzerinde yoğunlaşıp onu kullanarak endpoint kullanımı gerçekleştireceğiz.

Resim-5

{
    "properties": {
      "actions": [
        {
          "name": "myCustomActionName",
          "routingType": "Proxy",
          "endpoint": "https://{endpointURL}/"
        }
      ]
    },
    "location": "eastus"
  }

Yukarıdaki örnekte bir Actions tanımlaması Custom Resource Providers için görebilirsiniz. Bu tanımlama ile bahsettiğim gibi, Custom Resource Providers için RESTful operasyona denk gelen aksiyonları belirtip endpoint talepleri iletebileceğiz. Tanımlanan Actions ile aşağıdaki API Detayları elde edilebilir.

Resim-6

Actions olarak kullanılan Custom Resource Provider tipinde yapılan istek sonrası endpoint kesinlikle aşağıda bulunan geçerli tipte veriler döndürmelidir. Bunlar sırasıyla,

  • Content tipi: “application/json; charset=utf-8” olmalı.
  • Geçerli bir JSON formatında, object array.

Custom Resorce Provider özelinde Resource Type ve Actions tipinde farklı karşılıklı anlaşma modellerinin nasıl yapılacağını gördük, aralarındaki farklılıklardan bahsettik ve artık ön gereksinimlerimize geçebiliriz.

Azure Functions hizmetine ihtiyacımız var çünkü bizim için bir endpoint gibi davranıp Custom Resource Provider tarafından gelen eylemleri işleyip Azure Function içerisinde çalışan Powershell Function veya Script artık nasıl bir süreç yönetmek istiyorsanız sizin isteğiniz doğrultusunda aksiyon almasını sağlayacağız. Makale içerisinde sizleri Azure Function nasıl oluşturulur, neler yapmanız gerektiğini bilmenize gerek kalmadan kendi gitHub hesabım üzerinden Azure Resource Manager Template’lerine erişebilir ve hızlıca kendi ortamınıza dağıtabilirsiniz. Bu yüzden Azure Function nasıl oluşturacağım, nelere dikkat etmem gerekiyor gibi sorunlara sizi boğmadan Azure Function oluşturmak için aşağıdaki adımları seyrederseniz çok hızlı bir şekilde Custom Resource Provider için bir endpoint tanımlaması gerçekleştirebilirsiniz.

Azure Function Dağıtım adımları için lütfen aşağıdaki adımları takip ediniz.

Resim-7

# Creating a Azure Function for Custom Resource Providers



Gördüğünüz gibi Deploy to Azure butonuna bastığınız zaman sizler için yayınlamış olduğum Azure Resource Manager şablonları sayesinde Azure Function hizmetini deploy ediyor olacak. Function içerisinde geliştirdiğim, StartContainer isimli Function job tanımlanmış olacak. Bu sayede bunu Custom Resource Provider kullanabilirsiniz. Deployment başarılı olduğu zaman sizin için bir Deploy ettiğiniz Azure Function adında bir adet App Registration oluşturulmuş olacak( Service Principal Account ) bunun demo ortamı için azure hesabınıza yetkilendirmesini yapmanız gerekmektir. Daha fazlası için gitHub sayfamı takip edebilirsiniz. Özetle bu function deploy ederek, endpoint tanımlamasının bir şablon halinde hesabınıza dağıtarak kullanmaya başlayacaksınız.

Aşağıdaki paylaşmış olduğum ekran görüntüsünde, Azure Function içerisinde Powershell Core ile geliştirmiş olduğum bir kod bloğu var, yaptığı işi kısaca özetlemek gerekir ise gelen talep doğrultusunda bir adet container oluşturup console içerisine birşeyler yazdırmak. Tahmin edebileceğiniz gibi bunu zaten Azure Resoırce Manager Templateleri ile yapabiliyoruz aslında ama burada vermek istediğim örnek tamamen sizin hizmetinize özel geliştirmiş olduğunuz Custom Resource Provider için belirli bir nitelikler göndererek ( endpoint’e yani Azure Function uç noktasına) bu değerler Azure Function tarafından işlenip sizin için bir aksiyon almasını sağlamak. Yani özetle Azure deneyimini bozmadan, Azure Resource Manager üzerinden abonelik içerisinde Custom Resource Provider register edip, sadece talep edilen propertyleri göndermek olacak. Aşağıda bulunan kod bloğunu incelediğiniz zaman request edilen container adında hızlıca bir ACI oluşturup console üzerine birşeyler yazıyor olacak.

Resim-8

using namespace System.Net
# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)
# Authenticating to ARM using MSI and preparing RPC valid reponse
#Write-Output  'Custom Resource Provider will trigger a request'
# Write to the Azure Functions log stream.
Write-Output  'Starting function for creating new Azure Container...'
# Interact with query parameters or the body of the request.
#($Request | ConvertTo-Json | Out-File -LiteralPath object.txt)
$getAllProperties = $Request.RawBody | ConvertFrom-Json -Depth 100
# Interact with query parameters or the body of the request.
$ContainerName = $getAllProperties.Properties.ContainerName.toLower()
$resourceGroupName = ($ContainerName + 'crp')
Write-Output "PowerShell HTTP trigger function processed a request."
Write-Output "Requested Container Name: $ContainerName"
Write-Output "Requested Container Resource Group: $ResourceGroupName"
#region Preparing RPC valid response for Azure Resource Manager
$badRequestStatusCode = 'BadRequest'
$resourceProperties = $request.body.properties | ConvertTo-Json -Depth 100
$uri = $request.Url
class RPC {
    [string] static GetSubScription ([uri]$uri) {
        return $uri.Segments[3].TrimEnd('/')
    }
    [string] static GetCleanedUri ([uri]$uri) {
        return $uri.Segments.Where{ $_ -ne 'api/' } -join ''
    }
    [string] static GetProviderPath ([uri]$uri) {
        $startIndex = $uri.Segments.IndexOf('Microsoft.CustomProviders/')
        $endIndex = $startIndex + 3
        return ($uri.Segments[$startIndex..$endIndex] -join '').TrimEnd('/')
    }
    [string] static GetResourceName ([uri]$uri) {
        return $uri.Segments[-1].TrimEnd('/')
    }
}
$id = [RPC]::GetCleanedUri($uri) | ConvertTo-Json
$name = [RPC]::GetResourceName($uri) | ConvertTo-Json
$type = [RPC]::GetProviderPath($uri) | ConvertTo-Json
$jsonSuccessResponseBody = @"
{
    "id": $($id),
    "type": $($type),
    "name": $($name),
        "properties": $($resourceProperties)
}
"@
$jsonErrorResponseBody = @"
{
    "id": $($id),
    "type": $($type),
    "name": $($name),
        "properties": $($badRequestStatusCode)
}
"@
#endregion Preparing RPC valid response for Azure Resource Manager
if ($ContainerName) {
    $getResourceGroup = Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue
    if (-not $getResourceGroup) {
        New-AzResourceGroup -Name $resourceGroupName `
            -Location 'West Europe'
    }
    ## Creating new Azure Container
    New-AzContainerGroup -ResourceGroupName $ResourceGroupName -Name $ContainerName `
                         -Image alpine -OsType Linux `
                         -Command "/bin/sh -c `"for i in ``seq 1 30``; do sleep 1; echo fSociety `$i; done`"" `
                         -RestartPolicy Never
    # Output - valid response for Azure Resource Manager
    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
            StatusCode  = 'ok'
            Body        = $jsonSuccessResponseBody
            ContentType = 'application/json'
        })
}
else {
    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
            StatusCode  = 'BadRequest'
            Body        = $jsonErrorResponseBody
            ContentType = 'application/json'
        })
    }

Bir sonraki yazımızda Azure Function ve Custom Resource Provider için yapmamız gereken yapılandırmalara devam edeceğiz.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz. 

Referanslar

www.mshowto.org

TAGs:Azure Functions Nedir, Azure Funtion with Powershell, Azure Resource Manager (ARM), Azure Resource Manager API, Custom Resource Provider, Powershell Core

Bu İçeriğe Tepkin Ne Oldu?
  • 5
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Hasan Güral, Istanbul doğumlu ve uzun yıllardır bilişim sektöründe danışmanlıktan eğitmenliğe farkli pozisyonlarda görev almıştır. Üniversite eğitimiyle birlikte bilişim sektöründe Kibar Holding, Bilge Adam Bilgi Teknolojileri Akademisi ve PeakUp Bilgi Teknolojileri gibi farkli kurumlarda Kıdemli Danışman ve Eğitmen olarak sektöre yön veren projelerde yer almistir.Microsoft Azure alanında yapmış olduğu paylaşımlar ve katkılarından dolayı Microsoft Valuable Professional (Azure) unvanına hak kazanmıştır. Cloud teknolojilerinin otomasyon alaninda gelişmesiyle birlikte zamaninin bir çoğunu PowerShell, Event-Driven Orchestration, Infrastructure as a Code ve Configuration as a Code ile geçirmektedir.Kariyerine Ingiltere’de DevOps Engineer ve Automation Enthusiast rolü ile Cloud Rundle’da devam etmektedir.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir