iac-aws

IaC ile Cloud Platform Yönetimi

Merhaba! Bugün AWS üzerinde infrastracture as code (IaC) hakkında konuşacağız. Oraya gelmeden önce ise biraz cloud'tan bahsetmek istiyorum. Günümüzde gerek yerelde gerekse global çaplı firmalarda AWS, GCP, Azure gibi firmalarla cloud altyapısı kurgulandığını görüyoruz. Yakın zamanlarda ise Huawei Cloud'un TR region'ının açılmış ve birçok servisinin aktif hale gelmiş olması da ülkemizdeki firmaların epey ilgisini çekebilir. Yasal regülasyonlar nedeniyle cloud'a servislerini taşıyamayan firmalar da bu süreç ile birlikte birçok servisini cloud'a taşıyabilir duruma gelecekler. Huawei bu hamlesi ile birlikte Türkiye pazar payında ilk yeri almış bulunuyor fakat şu anki fiyat politikaları ile firmaları kendine çekmesi de zor görünüyor. Bu durumun rekabeti arttırıp diğer firmaların da ülkemizde region açıp hizmet vermesini tetiklemesini umuyoruz.

Peki neden cloud?

Firmalarda genelde cloud üzerinde dolar harcandığı için bir ön yargı mevcut oluyor. Biz TL kazanıyoruz fakat altyapımız için dolar harcıyoruz dediğinde ilk bakışta işler farklı gibi görünebiliyor. Fakat bence burada tek etken para değil. Bu kıyaslamayı yaparken terazinin bir kefesine doları diğer tarafına TL'yi koyduk tamam, fakat artılarını düşünürken diğer eforları ve üretim maliyetlerini de hesaplamak gerekiyor. On-prem'deki 5 kişilik eforu cloud'ta 2 kişi ile karşılayabilir duruma geldiğinde aradaki 3 kişinin eforunu ise farklı geliştirmeler için kullanabilir duruma geliyorlar.

Diğer bir yandan ise cloud'un sunduğu ek hizmetlere bakmak gerekir. Örneğin on-prem'de SDLC sürecimizi işletirken birçok tool kullanmak zorunda kalıyoruz. CI&CD tool'u, monitoring tool'u, logging tool'u, security tool'u derken bunlar dallanıp budaklanabiliyor. Bunlar için zaman zaman ücretli tool'lar bile kullanabiliyoruz. Bu araçların yönetim eforları ve maliyetleri gibi detaylar da işin içerisine girdiğinde ve terazinin diğer kefesine bunlar da detaylandırıldığında cloud'ta aslında maliyet tasarrufundan bile bahsetmek mümkün olabiliyor. Her ne kadar cloud'ta da bunların ayrı servisi ve maliyeti olsa da tek bir platform üzerinden kolayca yönetebilmek işleri kolaylaştırabiliyor. Bu şekilde Capex & Opex dengesine bakarak kıyaslama yapan firmalar zaten genelde cloud'u tercih ediyorlar.

Esneklik, kolayca sürekli güncel kalabilme, veri güvenliği, firmanın global pazara kolayca açılabilmesi gibi birçok konu da cloud'un kefesine eklenecek konulardan bazılarıdır. Hatta ve hatta cloud'a geçişin firmaların karbon ayak izlerini azaltması konusu da ayrı bir detaydır. Bu kapsamda yeşil bulut sistemleri adı altında yazılan makaleler de mevcut, merak edenler için yazıların linklerini bıraktım.

Gelelim konumuz olan infrastracture as code (IaC)'a;

Neden cloud kısmına kısaca değinmeden geçemedim 🙂 Bizim işimiz cloud'u tercih eden firmalarda altyapıyı kurgularken nasıl ilerlememiz gerektiği noktasını planlarken başlıyor (on-prem'de de bu yapıyı kurmak mümkün fakat bugün AWS üzerinde konuşacağız). Burada önerilen ve best practices olan bir kurgu olan infrastracture as code (IaC) yaklaşımı ile ilerlememiz işin yönetilebilirliği ve çevikliği açısından çok faydalı olacaktır.

Infrastructure as Code (IaC), altyapımızı kod kullanarak yönetme ve konfigüre etme yaklaşımıdır. IaC'de altyapının istenen durumunu tanımlamak için kod kullanır. Bu, altyapının manuel olarak yapılandırılması ihtiyacını ortadan kaldırır ve altyapının daha tutarlı, ölçeklenebilir ve güvenli olmasını sağlar. Herhangi bir sorun anında ise dilerseniz mevcut ortamı yeniden ayaklandırır, dilerseniz aynı ortamınızı farklı bir yerde de ayağa kaldırabilir durumda olursunuz. Bu metodoloji Amerika'nın başkanlık seçimlerinde yapılan reklam çalışmalarında dahi kullanılmaktadır. Herhangi bir saldırı/sorun anında birkaç dakika içerisinde aynı ortamı farklı bir yerde ayağa kaldırma imkanı sağlamaktadır. IaC ile ilgili daha fazla detay için de bir yazı bırakıyorum.

AWS üzerinde IaC ile altyapı kurgulama;

IaC için CloudFormation, Terraform, Pulumi gibi araçlar sık kullanılan araçlardır. Burada ise Terraform ile basit bir altyapı kurgulayacağız. Bir ortam kurgularken olması gereken temel kavramlar üzerinde gidelim. İsterler arasında bir EKS cluster, bir RDS olsun. Yazıyı uzatmamak adına basitçe bunları oluşturmak istiyorum. Zaten burada amaç; mantık oturduktan sonra devamı üzerine koyularak geliştirilebilir bir temel oluşturmak.

Burada dikkat edilmesi gereken bazı noktalar var. Eğer bir DevOps ekibinde görev alıyor iseniz bu terraform'u düzenleyecek tek kişi değilsiniz demektir. Bu yüzden .tfstate dosyanızı s3'te saklamanızda fayda olacaktır. Ek olarak ekipteki herkesin AWS console üzerinde bir değişiklik yapmayıp, eklenen/çıkarılan işleri terraform dosyalarınızda güncellemesi gerekmektedir. AWS console üzerinde yapılan manuel işlemler, IaC yapınıza zarar vermekte ve geri döndüğünüz noktalarda ise verimini azaltacaktır.

EKS cluster oluşturmak için terraform;
resource "aws_eks_cluster" "default" {
  name = "kubernetes-turkiye"
  version = "1.21"

  # Kubernetes control plane node groups

  node_group_count = 2
  node_group_name_prefix = "my-eks-node-group"
  node_group_min_size = 1
  node_group_max_size = 3
  node_group_desired_capacity = 2

  # Kubernetes worker node types

  node_type_name = "t3.medium"

  # Kubernetes worker node labels

  node_labels = {
    "k8s.io/role/worker" = "true"
  }
}

Bu dosya, kubernetes-turkiye adlı bir EKS cluster'ı oluşturur. Cluster'ın Kubernetes versiyonu 1.21'dir ve t3.medium node'dan oluşan iki adet node group'u vardır.

RDS ile PostgreSQL DB oluşturma;
resource "aws_rds_instance" "default" {
  identifier = "kubernetes-turkiye-rds"
  allocated_storage = 20
  engine = "postgres"
  engine_version = "14.4"
  instance_class = "db.t3.medium"
  name = "my-rds-database"
  username = "postgres"
  password = "my-secret-password"
  db_name = "my-database"
  port = 5432

  subnet_ids = ["subnet-12345678", "subnet-90123456"]
  security_group_ids = ["sg-12345678"]
}

Bu dosya, kubernetes-turkiye-rds adlı bir RDS database'i oluşturur. Database, 20 GB disk alanı, PostgreSQL 14.4 sürümü, db.t3.medium instance sınıfı, my-rds-database adı, root kullanıcısı, my-secret-password parolası ve my-database veritabanı adı ile oluşturulur. Database, subnet-12345678 ve subnet-90123456 alt ağlarında ve sg-12345678 güvenlik grubunda bulunur.

Buradaki terraform dosyalarını kendi isterlerinize göre güncelleyebilir ve eklemeler yapabilirsiniz. Bunlar çok basit ve giriş seviye kodlardır. Bu şekilde altyapınızı IaC ile kurguladığınızda failover, rollback, taşınabilirlik, otomasyon ve izlenebilirlik gibi konularda elimizi oldukça güçlendirmektedir.

.tfstate dosyasını s3'te saklama;
  resource "aws_s3_bucket" "terraform_state" {
    bucket = "my-terraform-state-bucket"
    acl = "private"
    policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow Terraform to manage state",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/terraform"
      },
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::${aws_s3_bucket.terraform_state.bucket}/*"
      ]
    }
  ]
}
EOF
  }

  # Terraform state

  resource "aws_s3_object" "terraform_state" {
    bucket = aws_s3_bucket.terraform_state.bucket
    key = "terraform.tfstate"
    source = "terraform.tfstate"
  }

Bu kodlar, bir aws_s3_bucket kaynağı oluşturur ve my-terraform-state-bucket adını verir. Oluşan bucket, private ACL'ye ve Terraform tarafından yönetilmesi için bir politikaya sahip olacaktır. Bir aws_s3_object kaynağı oluşturur ve terraform.tfstate adını verir. Bu kaynak, Terraform state dosyasını S3 bucket'a kopyalar. Bu sayede de ekibinizle ortak bir şekilde bu terraform'u sorunsuz düzenleyebilirsiniz.

Bu yazıda örnek olarak AWS ve terraform kullandım. Buradaki cloud platformu veya kullanılan IaC aracı değişebilir fakat mantık değişmez 🙂 Bu yapıyı sadece cloud'ta değil on-prem yapılarınızda da kurgulayabilirsiniz. Unutmayın ki, infrastracture as code'u benimsemek, altyapınızın daha güvenilir, ölçeklenebilir ve yönetilebilir olmasını sağlayarak işinizde önemli faydalar sağlayacaktır.

Yazıyı çok uzatmadan temel seviyede mantığı anlatmaya çalıştım. Umarım faydalı olmuştur. Görüşmek üzere. 🙂

Yorum Yapın