Terraform nedir ? ( Infrastructure as Code nedir ? #2 )

Everything as Code : Infrastructure as Code

--

Terraform Kod Örneği

Bu yazı Infrastructure as Code nedir? başlıklı bir önceki yazımın devamı niteliğindedir.

Yazının ilerleyen kısımlarında Infrastructure as Code ( IaC ) olarak kısaltılmış bir şekilde kullanılacaktır.

Neden Terraform kullanıyorum/kullanmalıyız?

Vendorların IaC yapabilmenizi sağlayan birbirinden farklı toolları mevcut.

  • AWS : CloudFormation
  • Azure : Resource Manager
  • Google Cloud : Deployment Manager vb.

Diyelim ki şirketinizde geliştirdiğiniz ürünü bu zamana kadar kullanan bütün müşterileriniz Google Cloud Platform üzerinden hizmet alarak kullanıyorlar.Siz de bu sistemin altyapısını DevOps ve IaC kuralları çerçevesinde Google Cloud Deployment Manager ile çok güzel bir şekilde yönetiyorsunuz. Yeni bir müşteri geldi ve mevcut bulut altyapısının AWS üzerinde olduğunu ve ürünü AWS üzerinde kullanmak istediğini söyledi. Burada ya müşteriyi kaybedeceksiniz ya da ürünü AWS’de sunmanın yollarını arayacaksınız. Daha önce Deployment Manager’i deneyimlediğiniz gibi AWS’nin CloudFormation tool’unu öğrenip implementasyonu gerçekleştirebilirsiniz.Fakat her farklı vendor ihtiyacı için o vendora ait IaC tool’unu öğrenmek yerine tek bir multi-vendor özelliğine sahip tool’u öğrenerek bu işi çok daha iyi yapabilirsiniz.

Configuration Managment ve Orchestration farkı

Şimdi gelelim diğer multi-vendor toolları yerine neden Terraform kullandığımıza.

Chef, Puppet, Ansible ve SaltStack gibi toolların tamamı birer Configuration Managment tooludur. Bu mevcut altyapı(sunucularda) yazılımı kurmak ve yönetmek için tasarlandıkları anlamına gelir. Terraform ve CloudFormation ise birer Orchestration tooludur. Bu altyapıyı(sunucuları) oluşturmaları için tasarlanmış anlamına gelir. Bu iki kavramdan birine sahip herhangi bir tool basit olarak birbirinin ihtiyaçlarını karşılayabildikleri için tam olarak birbirinden bağımsız sayılmaz. Ancak Configuration Managment veya Orchestration’a odaklanmak, bazı araçların belirli türdeki görevler için daha iyi bir uyum sağlayacağı anlamına gelir.

Terraform’un bize bu konuda sağladığı en iyi özellik Immutability ve multi-vendor sağlayabilmesidir. Configuration Management kısmı bir kenara sektörde Immutable Infrastructure oluşturma ve Infrastructure Orchestration konusunda bence biçilmez kaftan.

Popüler IaC toollarının karşılaştırması

Eğer Terraform gibi multi-vendor özelliğine sahip bir tool ile hem Google Cloud Platform’daki altyapınızı hem de herhangi diğer vendorların altyapısını oluşturan bir sistem tasarlarsanız artık gönül rahatlığı ile farklı vendorlarla ürününüzü sunabilirsiniz.

Terraform nedir ?

Terraform HashiCorp firması tarafından, güvenli ve verimli bir şekilde altyapı oluşturmak, değiştirmek ve iyileştirmek için geliştirilen Open Source bir tooldur.

  • Execution Planları
  • Aynı altyapıyı birden fazla ortamda oluşturabilmek ( development, staging, production vb. )
  • Multivendor desteği ( AWS, Azure, GCP, OpenStack,Wmware etc.) +76
  • Immutable Infrastructure
  • Resource Grafiği

Terraform ile altyapınızın görsel grafiğini oluşturabilirsiniz.

terraform graph dediğiniz de dönen sonuç bir Graphviz çıktısıdır.
Bunu import ettiğinizde ise en basit hali ile şöyle bir grafik şeması görürsünüz.

Write, Plan and Create Infrastructure as Code

Terraform’un mottosu.

Altyapıyı oluşturan kodu yazıyoruz, yazdıktan sonra executing planlarımızı görüyoruz ve onayımız sonrası altyapımız oluşturuluyor.

Şimdi aşağıdaki AWS üzerinde basit bir VPC örneğini Terraform ile oluşturalım. Terraform’un dosya uzantısı .tf dir.

  • Write

Görüldüğü gibi hiç Terraform kodu yazmamış olsanız bile kodu anlamamız çok zor olmuyor, oldukça sade ve anlaşılabilir bir yapıya sahip. Bu da Terraform’un IaC deklaratif kod yaklaşımından kaynaklanır. Biz sadece actual state’de ne istediğimizi belirtiyoruz, alt implementasyon ile ilgilenmiyoruz.

enable_dns_hostnames değeri VPC içerisinde DNS hostname atamasını aktif eder. Bu değer default olarak false ‘dur.

Yukarıda ki kod bloğunda Terraform’un provider olarak AWS’yi kullanmasını ve ilgili credential bilgilerini tanımlıyoruz.

Secret bilgileri açık bir şekilde tanımlamamızı tavsiye ederim. Kendi ortamımda aşağıdaki gibi bir .sh dosyasında tutup her çalışma öncesi source ediyorum.

  • Plan

Kodu yazdık, şimdi gelelim Plan kısmına. Kodun bulunduğu klasör içerisinde;

terraform plan

komutu çalıştırdığımızda aşağıdaki çıktıyı alırız.

Yukarıdaki çıktı da onay öncesi bir önizleme yapılarak, sistemde gerçekleştirilecek işlemler gösterilmektedir.

Terraform’unda belirttiği gibi + create ile bir VPC resourcenun oluşturulacağını görüyoruz. Detaylı olarak Terraform bütün yapacağı işlemleri bize söylemektedir.
Plan: 1 to add, 0 to change, 0 to destroy.

<computed> yazan değerler AWS tarafından tanımlanacak değer/id bilgisi anlamına gelmektedir, bunun dışındaki değerlerden bazılarını da zaten biz tanımlamıştık, bunları buradan görebiliyoruz.

  • Create

Kodu yazdık, sistemde gerçekleşecek işlemleri planladık, şimdi sıra onaylayıp oluşturmakta.

terraform apply

komutunu çalıştırdık ve aşağıdaki çıktı da bizden bir confirm beklemektedir.

Buradan anladığımız üzere Terraform her apply işlemi öncesinde default olarak bir terraform plan işlemi yapmaktadır.yes diyip, devam ettikten sonra olanlar:

AWS Console’dan VPC’lere baktığımız da bir VPC oluşturulduğunu görüyoruz.

AWS Console - VPC

Tekrar terraform plan komutunu çalıştırdığımızda ise aşağıdaki çıktıyı alırız.

Terraform burada altyapımız da gerçekleşen bütün işlemleri bir state üzerinde tutmaktadır. Terraform’un in memory olarak default state yapısını kullandığımız için kodun bulunduğu klasör içerisinde terraform.tfstate dosyası oluşturuldu.

İncelediğimizde :

Terraform gerçek ortamda gerçekleştirdiği bütün işlemleri bu state dosyası üzerinde yaşatır ve daima kod üzerindeki actual state’in oluşturulmasını sağlar. Yani siz oluşturduğunuz altyapıyı manuel olarak değiştirseniz bile Terraform state’ini kontrol edip onu eski haline getirecektir. Bu da bize Immutable Infrastructure sağlamaktadır.

Kaynakçalar

--

--