Bir süredir yazmak istediğim seri ile karşınızdayım. Öncelike seriyi okumadan önce lütfen Mshowto Blog'u üzerinde ve internette takip edebileceğiniz Azure Resource Manager Template isimli yazıları okumanızı tavsiye ederim. Eğer Azure Resource Manager az bir seviyede aşina iseniz, bununla beraber kendinizi DevOps kültürünün bir parçası olduğunuzu farkettiğiniz zaman Infrastrature As Code ile uğraşmaya başladınız demektir. Temel amacımız bu yazı seri içerisinde vermek istediğimiz veya aktarmak istediğimiz konu Azure Resource Manager'ın bir parçası olan Custom Resource Provider kullanarak ve işin içerisine son zamanlarda gözde servisimiz olan Azure Function dahil ederek bu muhteşem ikilinin aralarında bulunan çalışma ilişkisini göstermek olacak. Bu terimleri yazımızın ilerleyen kısımlarında tek tek açıklıyor olacağım.
Custom Resoırce Provider tanımına geçmeden önce hızlıca Azure Resource Manager ve Azure Functions konularından bahsedelim. Öncelikle Azure Resource Manager Template dağıtım modelini kullanmanın avantajlarından kısaca bahsedelim. En basit haliyle Azure Resource Manager Template dağıtım modelini kullanarak geliştirmiş olduğunuz JSON ( declarative syntax ) ile tekrar edilebilir, validate edilmiş, DevOps kültürüne uygun olarak deployment patternleri hazırlayabilir ve tekrar tekrar kullanmaıza yardımcı olur. Green Field bir deployment yaptığınız zaman veya hali hazırda mevcut bir ortamınız için geliştirilmiş olan Azure Resource Template'lerini Dev, UAT, Production ortamlarınız için tutarlı deployment pattern hazırlayabilirsiniz. Bildiğiniz gibi farklı deployment araçları kullanarak Terraform, Ansible(her ne kadar configuration as code giriyor olsada IaC ve CaC ) olarak da kullanabilir) dağıtım yapabilirsiniz.
Azure Resource Manager templateleri daha önce dediğimiz gibi bize tutarlı, tekrar edilebilir, moduler hale getirilmiş, validate edilmiş ve CI/CD süreçlerine entegre olurken çok farklı avantajlar sağlıyor. Deployment süreçlerini yönetirken hangi tool ile bu işi sırtlanmanız gerektiğini siz belirleyebilirsiniz. Daha öncesinde farklı deployment aracı olan Terraform video serisimize Bulut Bilişim Çözümleri ve Ötesi isimlı youtube kanalı içerisinden bakabilirsiniz.
Azure Function ile ilgili yaklaşık iki sene önce bir yazı yazmıştım ama o kadar hızlı değişiyor ki yetişmek mümkün değil. Uzun bir süredir Azure Automation kullanarak schedule edilen standard tasklarımı veya WebHook kullanarak request ettiğim custom süreçlerimi öncelikli olarak Azure Automation içerisinden yönetiyordum ancak oyuna Azure Function hizmetinin Powershell desteği ile girmesiyle beraber şimdi ise iki tarafıda yoğun olarak kullanıyorum fakat Serverless Automation kavramında Azure Function oyuna dahil olduğu için bu Azure Function hizmeti içerisinde Powershell kullanmayı daha çok tercih etmeye başladım şu sıralar. Azure Functions en çok DevOps tarafında Servleress Automation olarak karşımıza çıkıyor ve EventGrid, Storage Queue veya Services Bus ile yaptığınız entegrelerde inanılmaz sonuçlar alabilirsiniz. Bu konuyu başka bir yazıda ele alacağım. Muhtemelen Event Driven Orchestration dünyasının nimetlerinden faydalanmamak imkansız gibi gözüküyor.
Azure Function kendi içerisinde v1 ve v2 olarak ikiye ayrılmakta, yeni bir Azure Function oluşturmak istediğiniz zaman hangi versiyonu seçmeniz gerektiğinize emin olmalısınız. Temel anlamıyla, v1 Powershell Core desteklemiyor. Powershell Core kullanmak istiyorsanız v2 ile devam etmenizi tavsiye ederim. Sebebi ise Powershell Core dışında, Azure Function v2 bize çok fazla kolaylık sağlıyor, en temeli custom bir Powershell Modülüne ihtiyacınız olur ise bunları yönetmek için Dependancy Management kullanarak Package Management üzerinden Custom Powershell Modüllerini alabilir veya Managed Identiy tadına vararak Azure Function code bloğunuzun çalışırken karşılaşacağı authentication sorunlarını kolayca atalabilirsiniz.
Şimdi tekrar Azure Function hizmetini nimetlerine dönmeceğim ama önce artık Custom Resource Provider nedir, ne için kullanabiliriz bunu biraz daha açalım. Bunları şu cümleler ile özetleyebiliriz.
Öncelikle şunu bilmenizi isterim ki, Custom Resource Providers henüz release olmadı. Birkaç cümle ile Azure'da bulunan Publisher'lar yani Vendor veya Partner artık nasıl çağırmak isterseniz onların hizmet vermek istediği müştlerine kaynaklarını dağıtmak, configure etmek için bir yol sağlamaktır. Kullanıcıların Azure dışından gelen kaynaklar için eylemler tanımlamasına izin verir ve bunları Azure Resource Manager şablonu ile dağıtımına yardımcı olur. Senaryoyu biraz daha açmak gerekir ise düşünseniz F5 bir load balancer deploy etmeye çalıştığınız firmanın bir takım orkestrasyon yapması gerekir dağıtılan kaynaklar içerisinde işte tam bu noktada Azure Custom Resource Provider yardımımıza koşuyor. Azure Managed Application detaylarına baktığınız zaman Custom Resource Provider ile ilişkisi olduğunu göreceksiniz. Aslında cevap çok basit, eğer custom bir uygulamanız var ise ve bunu Market Place üzerinden hizmet vermesini istiyorsanız Custom Resource Provider kullanarak Custom Resource için API'lar yayımlayabilir ve kullandırabilirsiniz.
- Azure Resource Manager REST API - isteğimiz doğrultusunda genişletebiliriz. Bunlar organizasyonuza bağlı olarak tasarlanan uygulamalar Internal ve External hizmet sağlayıcıları olabilir.
- Mevcut Azure Deployment süreçlerinizde ihtiyacımız olan özel yapılandırmaları otomatikleştirebiriz.
- Azure Resource Manager Template kullanarak daha fazla denetim altına alabilir ve etki eden deployment süreçlerini daha detaylı kontrol edebiliriz.
Daha fazla örnekleri genişletmemiz gerekir ise sizin bir uygulamanız var bir servis sağlayıcı olarak bu uygulamanızı Azure üzerinde kullanan müşterinize sunarken bir deployment süreçinden geliştirmek istiyorsunuz. Bu herhangi bir third-party uygulama, firewall, aklınıza gelebilecek Azure kaynaklarına dokunna her türlü bir süreç olabilir. Siz bir partner olarak hizmetleriniz var bunları Azure Resource Manager üzerinden dağıtabiir hale getirmek istiyorsunuz ve arada yer alan dağıtım süreçlerini otomatik hale getirerek tamamlamak istiyorsunuz. Benim yakın zamanda yaptığım ve Pre-Production bir sistemde kullanmak olduğunuz Custom Resource Providers kullanarak bir dağıtım yönetimden bahsetmek istiyorum tamamen internal-organizasyon içerisindeki istekler özeli dahilinde kullanıyoruz.Bir Custom Resoırce Provier geliştirdik fakat bu sadece şirket içerisindeki departmanlara hizmet veriyor. En basit haliyle, şirket içerisinde farklı departmanlar var bu departmanların kendi özgü kaynakları abonelikleri olduğunu düşünün. Departmanların isteği doğrultusunda kendi ortamlarına kolayca Jumpbox VM ihtyaçlarını olduğunu ve bunu yine basit bir Azure Resource Manager Template ile kullanabildiklerini ama arkadaki bir çok automation süreçlerini çok fazla soru sorulmadan kolayca ve güvenli bir biçimde halledildiğini düşünün.
Özetle; Bu servisi ben {Jumbox-On-Demand} olarak çağırıyorum. Business Departmanlar merkezi olarak kendi ihtiyaçları doğrultusunda Jumbox on demand hizmetini talep etmek için Azure Resource Template kullanıyorlar ama bu template içerisinde kullanmak istedikleri Azure kaynakları tek tek tanıtmıyorlar, sadece template hizmeti veren ekip tarafından geliştirip, talep edilen parametreler aslında Azure Function içerisine Post ediliyor ve deployment tamemen Azure Function üzerinden kontrol ediliyor. Azure Resource Manager Template'ler sadece bu noktada endpoint ( Azure Function) olarak tanımlamak için ve talep edilen parametrik değerli almak için kullanılıyor. Eğer aşağıda süreçleri düşünürseniz, bu işleri yapmak için basit bir kullanıcının nelere yetkili olması gerektiğini farkına varabilirsiniz. Bu yüzden business departman kullancısı sadece istediği talebi Azure Resource Manager içerisinde tanımlı olan Custom Resource Provider resource'una iletip daha sonrasında Azure Function endpoint'ine gönderiyor ve tüm kontroller, authentication ve authorization Azure Function tarafında yazdığınız Powershell Script tarafından kontrol edilecektir. Senaryonun bir tık ilerisi aslında aynı Azure Function hizmetini, ITSM hizmetleri ile birleştirmekten ibaret yani aynı talebi firmanın talebi ile beraber ServiceNow gibi hizmetlere entegre edebilirsiniz sebebi ise Azure Function geliştirdiğiniz Powershell bloğunuz bir Rest API gibi davranabilir ve önüne Azure API Management hizmetini koyabilirsiniz.
- Creating - Virtual Machine – Sanal Makine oluşturma
- Impelementing – Disk Encyrption – Oluşturulan Sanal Makineyi Disk Encryption süreçlerini otomatik hale getirme
- Creating Firewall Rules on Firewall for spesific IP Ranges. Oluşturulan sanal makine için Firewall üzerinde ingress kurallar tanımlama ( belirtilen source adresler üzerinden)
- Creating CIS Based Imaged – Enrolling Azure Automation Account to get latest DSC Configuration – CIS Image ( Hardening olaması için geliştirdiğim DSC Config alabilmesi için Azure Automation otomatik register etmek)
- Automatically Enroll to Backup Vault – Jumbox amaçlı oluşturulan sanal makinenin Azure Backup Vault içerisine otomatik olarak kaydedilmesi
- To Schedule – Azure Runbook for deleting and redeploying Jumpbox. Deployment süreçinde Azure Automation DSC ve Runbook özelliğinden faydalanılıyor. Mevcut bir Runbook ile güvenlik gereksinimlerinden dolayı her 30 günde bir dağıtılan Jumpbox silinip tekrar oluşturup domain ortamına dahil ediliyor.
Diğer bir örnek verebilecek olur ise, Custom Resource Provider ile mesela, Azure Active Directory tarafında Group Oluşturmak, Group Member'ları ekleme çıkarma gibi değişik senaryolar yapabilirsiniz. Senaryolar oldukça genişletilebilir.Bir sonraki yazımızda Custom Resoırce Provider yapısını oluşturmak için temel bileşemlere bakıyor olacağız.