Altyapıyı yönetmek, çoğu modern uygulama için temel bir gereksinim olarak karşımıza çıkmaktadır. Bir yazılım şirketi kurulduğu zaman oluşturulan hizmetin verimli ve stabil çalışabilmesi için çok sayıda donanımın da doğru şekilde yönetilmesi gerekmektedir. Bir kabineti kurmak, sunucuları, ağ ve güvenlik cihazlarını konfigüre etmek, doğru kablolama yapmak, yazılacak olan uygulama veya servis ile hali hazırda çalışan sistemlerin entegrasyonunu sağlamak, soğutma, enerji ve yedekleme sistemlerinin çalışma yapılarını planlamak gibi birden çok donanımın bir arada ve senkron çalışmasını sağlamak gerekmektedir.

Hizmet olarak sunulan yazılımların sistem entegrasyonu ve uygun ortamlarda doğru şekilde çalışması DevOps ekibinin iş tanımı olarak belirtilmektedir. DevOps tamamıyla entegrasyon süreçlerine ait bir dizi süreç, fikir ve teknikten oluşmaktadır. Bu aşamada tasarlanacak ve uygulanacak olan neredeyse tüm işlemler manuel komutlar girilerek gerçekleştirilmektedir. Kusursuz bir tasarımda bile eğer yapı aynı büyüklükte kalacaksa pek sorun yaşanmamaktadır. Ancak hizmet sağlayan yazılımın veya hizmetin sunulduğu ekibin büyümesi, hem donanım sayısının hem de entegrasyonların sayısının artmasına sebep olacaktır. Her ne kadar sağlam bir zemin üzerine kurulmuş bir sistem dahi olsa, zahmetli ve öngörülemez iş yükü sebebi ile pratik bir çözüm olmamakta ve zamanla ekiplerin yapıyı takip edememesi veya sistemin yavaşlaması gibi yeni problemlere ortam hazırlamaktadır. Sonuç olarak, hata sayısı artmakta ve sebep olduğu kesintiler ile aksama süreleri daha sık görülür hale gelmektedir. Birden fazla projenin aynı noktaya gelmesi ve şirketlerin bu noktada köşeye sıkışması kaçınılmaz bir hal almaktadır.

DevOps

Hızla gelişen teknoloji ile birlikte geleneksel yapıyı değiştirecek olan köklü değişimler yaşanmaktadır. Bu duruma örnek vermek gerekirse, şirketler büyük bütçeler ayırarak oluşturdukları donanım mimarilerinden uzaklaşarak ağ sanallaştırma, sanal bilgisayar kullanımı veya bulut platform gibi sanallaştırma seçeneklerini tercih etmektedir. Bu noktada şirketler, mimarisini kendilerinin oluşturduğu bir sistem odasında sanallaştırma teknolojilerini kullanarak veya sistem odası bile kurmadan, bir bulut platform hizmeti (AWS, CloudFlare, Oracle Cloud, GPC, Docker, DigitalOcean etc.) satın almaktadır. Böylece kullanılan büyük donanımlara ayrılan maliyetten kurtulmakta ve kullanılan donanımların yönetimi, güvenliği, mimarisi, detaylı konfigürasyonu gibi bir çok konuda iş yükünü hafifletmektedir.

Bu noktada donanıma büyük yatırım yapmak yerine Chef, Puppet, Terraform, Docker, Jenkins ve Kubernetes gibi entegrasyon araçları kullanılarak, DevOps ekiplerinin iş yükü hafifletilmiş olmakta ve zamanlarını yazılım ile yazılımın sistem entegrasyonu üzerinde çalışarak geçirmektedir. Sonuç olarak, hem yazılım geliştirme ve operasyon ekipleri birimi zamanlarının çoğunu yazılım ve sistem entegrasyonu üzerinde çalışarak geçirmektedir. Burada kilit nokta tüm işlemleri belirli bir otomasyon ile sağlayabilmektir. Ancak yine de yukarıda bahsedilen entegrasyon araçlarının da yetersiz kaldığı ve iş yükü oluşturduğu noktalar olmaktadır. Bu noktada Terraform devreye girmektedir.

TERRAFORM
TerraForm

Terraform, HashiCorp firması tarafından GO dili kullanılarak geliştirilmiş olan, ağ altyapılarının kod olarak, güvenli, verimli bir şekilde tanımlanmasını sağlamak ve iyileştirmek için geliştirilen, DevOps ekipleri tarafından kullanılan, açık kaynak kodlu bir IaC (Infrastructure as Code) aracıdır. IT altyapısını koda çevirip programlama yoluyla yöneten bir uygulama olmakla beraber, bulut bağımsız çalışmaktadır ve bu sebeple entegrasyon aşamalarında ekiplere yönetim kolaylığı sağlamaktadır. Hiçbir satıcıya, ürüne veya entegrasyon çeşidine bağlı kalmadan veya platforma özel yeni araçlar öğrenmek zorunda kalmadan desteklenen herhangi bir ortamda kullanılmasına olanak tanımaktadır.

Infrastructure as Code yapısının kullanım avantajı, aynı hizmetin birbirinden farklı platformlarda sunulabiliyor olmasıdır. Bu noktada kullanılan farklı bulut platformlara örnek olarak, AWS “CloudFormation”, Azure “Resource Manager”, Google Cloud “Deployment Manager” verilebilmektedir. Sistem ve ağ altyapısının, ağ içerisinde kullanılacak olan uygulma veya hizmetlerin kod olarak tasarlanmasında DevOps ekiplerinin entegrasyonlarının yanı sıra IaC kurallarına uyması da büyük önem taşımaktadır.

IaC yapabilmeyi sağlayan birbirinden farklı araç mevcuttur. Chef, Puppet, Ansible, Pulumi ve SaltStack gibi toolların tamamı birer Configuration Managment tooludur ve çoklu üretici yapısında çalışmaktadır. Bu ürünler aracılığı ile ağ ürünlerini ortak bir noktadan belirli scriptler ile yönetmek oldukça kolaydır.

Ancak görevi bakımından bu araçlar, sadece mevcut altyapıda yani kurulu olan sunucularda bulunan yazılımları kurmak, yönetmek ve geliştirebilmek için tasarlanmıştır. Terraform tamamen bildirime dayalı bir araç olarak çalışmaktayken, Ansible veya Puppet hem bildirimsel hem de yordamsal yapılandırmayı birleştirmektedir. Yordamsal yapılandırmada, altyapıyı tercih edilen şekilde kurgulamak için kullanılan adımlar, kesin bir şekilde belirlenmekte ve manuel olarak belirtilmektedir. Belirli prosedürlere sahip olması ve manuel girdi veya kontrollerin yapılması sebebi ile yordamsal yapılandırma daha çok iş yükü getirmektedir. Ancak yordamsal yapılandirma sistemler üzerinde daha fazla kontrol sağlamaktadır. Fakat yordamsal uygulamaların manuel takibe yakın işlemlere sahip olması ve iş yükünü arttırması sebebi ile işletmeler tarafından Terraform daha fazla tercih edilmektedir. Ek olarak Terraform ile bir altyapı sıfırdan kurulabilmekte, yönetilebilmekte ve tam yaşam döngüsü tamamlanabilmektedir. Diğer araçların böyle bir yeteneği bulunmamaktadır.

Terraform Rota Örneği

Terraform, birbirinden farklı bulut platformlarını kullanan hizmetler, altyapısını şirket içerisinde otomatize etmek veya farklı bulut platformlarına sahip firmalar için ortak bir ürün olarak geliştirilmiş ve hizmetlerin tek noktadan tüm üreticilerin ortamında çalışacak şekilde sunulmasına olanak sağlayan bir Orchestration aracı olarak sunulmaktadır. Sadece bulut platformları değil ağ içerisinde on-prem olarak bulunan ortamları da (Vmware, OpenStack) birkaç komut ile yönetebilmeyi sağlamaktadır. Bu sayede hizmet veya uygulamarların kurulacağı, yönetileceği veya çalışıp geliştirilebileceği sunucu ortamını oluşturabilmek için tasarlanmış olduğu anlamını taşımaktadır. Terraform’un tercih sebebi olmasındaki en büyük pay, birden fazla üretici ve hizmet ile ortaklaşa çalışabilmekte ve tasarlanan obje yapılarının değiştirilemez (Immutable) olmasıdır. Bu sayede tasarlanan bir ürün, farklı üreticiler tarafından hizmet verilen bulut platformları üzerinden (AWS, Google, iCloud, Azure) aynı altyapıyı oluşturarak, aynı hizmeti sunabilmektedir. Terraform ile altyapının bir görsel grafiği oluşturulabilir ve böylece yönetilecek yapının takibi oldukça kolaylaşmaktadır. Ek olarak, bilgi işlem, depolama ve ağ kaynakları gibi düşük seviyeli bileşenlerin yanı sıra DNS girişleri ve SaaS ve PaaS gibi yüksek seviyeli bileşenleri yönetebilmektedir.

Burada bahsedilen Immutable kavramı, yazılım içerisinde bir nesne oluşturulduktan sonra, değeri değiştirilemeyen yani bir sabit olarak tanımlanmaktadır. Immutable veri tiplerine örnek olarak, string, integer, double, byte gibi tipler örnek verilebilir. Mutable nesneler ise değişken adı verilen, nesne oluşturulduktan sonra değeri zamana, uygulamaya, duruma veya isteğe bağlı olarak değiştirilebilen olarak tanımlanmaktadır.

Obje Yapısı

Terraform kodu oldukça basit, sade ve okunabilir yapıdadır. HCL (HashiCorp Configuration Language) adı verilen JSON benzeri bir yapılandırma dili kullanarak altyapı yapılandırmaları tanımlanmakta ve uygulanmaktadır. Bu durum da Terraform’un IaC deklaratif kod yaklaşımından kaynaklanmaktadır. Kodun büyük bir kısmında sadece istenilen sonuca yönelik bir aksiyon belirtilmektedir, alt implementasyonlar ile ilgilenilmemektedir. Terraform açık kaynak koduna sahip olması sebebi ile dünyanın dört bir tarafında bulunan yazılım uygulama geliştirme ekipleri veya tüzel kişiler tarafından her zaman yeni eklentiler yazılarak veya mevcut eklentilerin farklı sürümlerinin derlenmesi ile geliştirilmektedir.

Terraform günümüzde Mac OS, FreeBSD, Linux, OpenBSD, Solaris, Windows işletim sistemleri üzerinde kullanılmaktadır. Ek olarak FreeBSD ve Linux işletim sistemleri üzerinde ARM mikroişlemci desteği bulunmaktadır.

HashiCorp, Terraform Cloud adlı yönetilen bir çözüm sunmaktadır. Kullanıcılara, Terraform’un kendisini kurma veya yönetme zorluğu olmadan, desteklenen tüm sağlayıcılardaki altyapıyı yönetmeleri için bir platform sağlamaktadır.

Terraform dendiğinde akla gelen başlıca 4 önemli özellik bulunmaktadır.

  • IaC: Basitçe söylemek gerekirse, IaC, kullanıcıların altyapılarını kodlamasını sağlamaktadır. Sistemlerin otomatize olması ve otomasyon süreçlerinin yönetilmesindeki amaç entegrasyon aşamalarının mümkün olduğunca otomatik işlemler ile yürütülmesini sağlamaktır. Böylece manuel scriptler veya işlemler yerine aşama aşama ilerleyen bir kod grubu ile işlemler sırayla uygulanmaktadır. Terraform üzerinde hangi API çağrısının nasıl yapılacağı da IaC konfigürasyonları ile sağlanmaktadır. Bu aşama IaC süreci olarak tanımlanmaktadır. Infrastructure as Code (IaC) mevcut altyapıyı tanımlamak, dağıtmak, güncellemek, kaldırmak veya versiyon işlemleri gibi birden çok noktada kolayca kod yazılmasını ve yönetilmesini sağlayan operasyon sürecidir. Manuel işlem yükünü ortadan kaldırması sebebi ile süreçlere hız kazandırmaktadır. IaC, altyapı oluşturulurken hata veya sapma olasılığını en aza indirmektedir. Böylece hatalı yapılandırmalar veya hatalı kaynak tahsisi gibi sorunların ortadan kalkmasına sebep olmaktadır. Standart bir hale gelen kod, neredeyse tüm platformlarda sorunsuz çalışmaktadır. Bu durumda ölçeklendirilebilirlik veya yeniden yapılandırılabilirlik gibi bir çok durumda yeni altyapı tahsisi veya yazılm testleri kolayca uygulanabilir hale gelmektedir. IaC, altyapı değişikliklerinin GIT gibi bir kaynak kontrol mekanizması aracılığıyla yönetilmesine ve CI/CD ardışık düzeninin bir parçası olarak entegre edilmesine olanak tanımaktadır. Yalnızca altyapı değişikliklerini otomatikleştirmekle kalmamakta, aynı zamanda denetlenebilir değişiklikleri ve gerektiğinde değişikliklerin kolayca geri alınmasını kolaylaştırmaktadır.

    IaC kullanımının daha birçok faydası olsa bile hız, doğruluk, veri görünürlüğü ve güvenlik gibi konular sebebi ile kuruluşlar Terraform benzeri IaC çözümlerini tercih etmemektedir. Kendisini günden güne geliştiren yapısı sayesinde bu durumun da aşılacağı ön görülmektedir.
  • Uygulama Planları: Planlama aşaması altyapının oluşturulması veya aktarılması noktasında alınacak kararlar doğrultusunda altyapının konfigürasyon dosyalarının yazılmasını veya değiştirilmesini kapsamaktadır. Mevcut altyapı nasıl değiştirilmek istediğiniyor ise yapılandırma dosyaları da bu bağlamda değiştirilmekte ve böylece istenilen durum bildirilmektedir. Yapı netlik kazanıp bildirildiği zaman Terraform bir komut sayesinde bunun için bir uygulama planı oluşturmaktadır. Plan içerisinde mevcut altyapıyı  yapılandırmak ve belirtilen duruma getirmek için Terraform’un hangi değişiklikleri yapması gerektiği belirtilmektedir. Bu aşamada mutlaka en az hamle ile maksimum verimin alınacağı bir algoritma arka planda çalıştırlacak ve en az değişiklik ile istenilen yapının kurulması planlanacaktır. Karmaşık altyapılar için çıkarılacak olan plan aşaması daha uzun zaman almaktadır. Bunun temel sebebi ise değişikliklerin doğru bir şekilde konfigüre edilebilmesini sağlamak için API isteklerinin yapılmakta olması ve altyapıda bulunan tüm bileşenlerden mevcut durum bilgisi istemesinden kaynaklanmaktadır. Bu problemi çözebilmek için altyapı parçalara ayrılmakta ve alt kümeler şeklinde uygulama planları işleme koyulmaktadır. Plan sonucunda oluşan çıktının tercih edilmemesi durumunda, geri dönüp yapılandırma değiştirilebilmektedir. Planın çıktısının onaylanması durumunda ise Terraform’a gerekli aksiyonların alınması yönünde uygulama talimatı verilmektedir.

    Uygulama esnasında herhangi bir hata oluşması veya bazı planların ters gitmesi durumunda çalışan API’ler duracaktır ancak Terraform altyapıyı, uygulamayı çalıştırmadan önceki durumuna otomatik olarak geri döndürmemektedir. Bunun sebebi uygulamanın plana bağlı olmasından kaynaklanmaktadır. Çalışma planı bu aksiyonu gerektirmiyorsa hiçbir kaynak silinmemektedir.
  • Kaynak Grafiği: Terraform, altyapıda bulunan tüm bağımlılık bilgilerini yakalayan bir kaynak grafiği oluşturmaktadır. Bağımlılıklar genellikle yapılandırma yoluyla doğal olarak ifade edilmekte ve herhangi bir bağlılık şeması oluşturmaya veya bağlılıkları belirtmeye ihtiyaç duymamaktadır. Kaynak grafiği kullanılarak oluşturulan sonuçta hiçbir bağımlılık olmadığı zaman, değişiklikler paralel olarak uygulanmakta ve altyapı mümkün olduğunca verimli bir şekilde oluşturulmaktadır. Terraform tarafından oluşturulan grafiğin çıktısı alınabilir ve altyapı hakkında daha fazla bilgi edinmek için bu grafik görselleştirebilmektedir.
  • Otomasyon Değişikliği: Belirli şablon veya şemalar sayesinde önceden oluşturulan altyapı örnekleri üzerinden yeni şubeler veya altyapı genişletme talepleri kolayca oluşturulabilmektedir. Herhangi bir insan müdahalesi olmadan altyapının son sürüme güncellenmesi gibi planların otomatik olarak uygulanması da sağlanabilmektedir.Yine de yönetici onayı oluşturularak, manuel onay verilmesi sağlanabilmektedir. Oluşturulan uygulama planı ve kaynak grafiği ile neyin, hangi sırayla işleme alınacağını anlamak oldukça kolaydır.
Çalışma Yapısı

Altyapı ortamının planlanması, sunucu ortamlarının hazırlanması, manuel olarak işletim sistemlerinin kurulması, ağ topolojisinin çizilmesi gibi birden fazla yapılandırmayı büyük ölçekli oluşturmak karmaşık ve hata oranı yüksek bir ortamdan oluşmaktadır. Bir süreci otomatize etmenin en basit yolu geçici bir komut dosyası yazmaktır. Yapılan işlemler adım adım ve manuel olarak işlenmektedir. Bu adımların her birinin kodda tanımlanabilmesi için bir komut dosyası dili ve bu dosyanın yürütüleceği bir sunucuya ihtiyaç duyulmaktadır. Bu aşamada bağımlılıkların kurulması, kodların kontrol veya tes edilmesi ve çalıştırılması gibi bir dizi işlem bulunmaktadır.

Terraform API Yapısı

Backend tarafında himzetin sunulabilmesi için kurulu olan GO kodu, terraform adı verilen tek bir binary dosyada derlenmektedir. Bu binary program dizüstü bilgisayardan başlamak üzere, bir build sunucusu veya hemen hemen başka herhangi bir bilgisayardan, hemen hemen tüm platformalar üzerinden altyapıyı deploy etmek için kullanılabilir ve bunun gerçekleşmesi için herhangi bir ek altyapı çalıştırmak gerekmemektedir. Tüm iletişim ve çağrıları API aracılığı ile başlatılmaktadır.

Terraform, yapısında kullanılan birden fazla API aracılığıyla bulut platformlarında ve diğer hizmetlerde kaynakları oluşturmakta ve yönetmektedir. Sadece ihtiyaç duyulan kaynak bilgisinin verilmesi ile bu kaynak durumuna sahip olan bir altyapı tasarlamak için kesin adımları belirtmeye gerek kalmadan kullanıcı deneyiminin basitleştirilmesine olanak tanımaktadır. Altyapının kurulması planlanan platform sağlayıcılar, Terraform’un erişilebilir bir API ile neredeyse her platform veya hizmetle çalışmasını sağlamaktadır. Bu noktada kendi kullanmış olduğu API’ler ile hizmet sağlayıcısı olan platformların API’leri ile iletişim kurmaktadır. Bir sunucuyu, veritabanını veya ağ cihazlarının yönetilmesi için komut girildiğinde, Terraform komut için girilen konfigürasyon kodunu ayrıştırır ve kaynak sağlayıcı için oluşturulan bir API çağrısına çevirmektedir. Terraform, birbirinden farklı platform sağlayıcısına ait API sunucuları için çalıştırmakta olduğu altyapının yanı sıra bu sağlayıcılarla halihazırda kullanmakta olan kimlik doğrulama mekanizmalarından da yararlanmaktadır. Ayrıca Terraform, istenen sonuca ulaşmak için altyapının nasıl değiştirilmesi gerektiğini de yorumlamakta ve yönetmektedir.

Terraform Modül Yapısı

Öncelikle altyapıda kullanılacak olan, ihtiyaç duyulan kaynaklar tanımlanmaktadır. Bir sonraki aşamada Terraform, platform üzerinde ihtiyaç duyulacak olan kaynaklara bağlı olarak mevcut altyapıya ve yapılandırmaya bağlı olarak oluşturacağı, güncelleştireceği veya yok edeceği altyapıyı açıklayan bir yürütme planı oluşturmaktadır. Daha sonrasında uygulanacak önerilen işlemler sırası ile kaynak bağımlılığına öncelik verilecek şekilde sıralanarak uyglanmaktadır. Örneğin, bir VPC’nin özellikleri güncellenirse ve o VPC’de bulunan sanal makinelerin sayısı değiştirilirse, Terraform sanal makineleri ölçeklendirmeden önce VPC’yi yeniden oluşturmaktadır.

Terraform’un çalışma yapısında iki önemli bileşeni bulunmaktadır; Terraform Core ve Terraform Plugins.

  • Terraform Core, kaynak içi gerekli planın yürütülmesi, kaynak grafiklerinin oluşturulması, durum yönetimi özelliklerinin ve yapılandırma dosyalarının okunması gibi konuları denetlemektedir. Çekirdek, GO programlama dilinde yazılmış ve derlenmiş ikili dosyalardan oluşmaktadır. Her derlenmiş ikili, RPC aracılığıyla eklentiler ile iletişim kurmak için bir CLI satırı görevi görür.
  • Terraform Plugins, belirli hizmetler için kaynakları tanımlamaktadır. Buna, altyapı sağlayıcılarının kimliğinin doğrulanması ve API çağrıları yapmak için kullanılan kod kütüphanelerinin başlatılması da dahildir.

Terraform modülleri, birlikte kullanılabilir ve çoklu altyapı kaynaklarının yönetiminde kolaylık sağlamaktadır. Böylece karmaşık kaynakların yeniden kullanılabilir ve yapılandırılabilir yapılarla otomatik şekilde entegre olabilmesine olanak tanımaktadır. Bir modül, kurulum yapılandırmasını daha hızlı ve daha kısa hale getirebilen, alt modül olarak adlandırılan diğer modülleri çağırabilmektedir. Modüller aynı yapılandırma içinde ya da ayrı yapılandırmalarla birlikte entegre edilebilmekte ve birden çok kez çağrılabilmektedir. Her modül aslında geliştiricinin birlikte gruplamak istediği birden çok altyapı kaynağı için bir kapsayıcı olarak kullanılmaktadır. Modüllerin hem giriş hem de çıkış değişkenleri bulunmaktadır. Giriş değişkenleri, onu çağıran bir modülden değerleri kabul etmektedir. Çıkış değişkenleri, verileri çağıran modüle dönüştürülmektedir. Modüller birbirini çağırabilmektedir, bu da konfigürasyonların daha hızlı yapılmasına yardımcı olmaktadır.

Her modülün bir adlandırma yapısı, bir havuz açıklaması, standart bir modül yapısı, desteklenen bir sürüm kontrol sistemi ve sürüm etiketleri olması gerekmektedir. Terraform Registry, modül paylaşımı için merkezi bir depo görevi görmekte ve Terraform modüllerinin keşfedilmesini ve kullanıcılara dağıtılmasını sağlamaktadır. Kayıt Defteri iki varyantta mevcuttur. Genel Kayıt ile belirli kaynakları ve topluluk tarafından sağlanan modülleri ortaya çıkarmak ve yönetmek için bir API ile etkileşime giren hizmetleri tutmaktadır. Özel Kayıt ile ise bir kuruluş içinde dahili olarak kullanılan modüller için hizmetleri barındırmaktadır.

Terraform kurulumu ve implementasyon aşamaları için lütfen aşağıda bulunan kaynakça linklerini takip ediniz.

Kaynakça
Lütfen bu gönderiye bir puan ver.
[Total: 0 Average: 0]