Kısaca Terraform
Merhabalar, bu yazının amacı; terraform komutlarından bahsetmek ve kendi notlarımı aktarmak.
Terraform, kodsuz bir şekilde (Infrastructure as Code) alt yapıları oluşturmayı/yönetmeyi sağlayan bir tool dur. Cloud ortamların (AWS, Google Cloud vs.) kendilerine ait alt yapı yönetim araçları vardır ancak terraform, tüm cloud ortamlarını destekleyen aynı zamanda on-premise sistemlerde de çalışabilen (milti-vendor) bir araçtır. Diğer multi-vendor araçlardan ayrılan en büyük özelliği ise sadece mevcut alt yapıları yönetmeyi değil aynı zamanda alt yapı oluşturmayı da sağlamasıdır. Bu sebeple en çok tercih edilen Devops araçlarından biridir.
Terraform Nasıl Çalışır
Terraform .tf dosyalarıyla ya da .tf.json dosyalarıyla kullanılır. Terraform .tfstate adında bir dosya içinde yapılan tüm işlemleri kaydeder. Bununla birlikte içerisinde bir lock dosyası bulundurur, olası bir aynı dosyada çalışma anında conflict süreçlerini yönetmeyi sağlar. Her bir işlemden sonra, bir önceki haline (versiyona) geçebilmek için backup dosyası oluşturur. Bir diğer önemli özelliği ise Terraform kullanmadan önceki hazırlanmış alt yapıyı, kendi bünyesine taşıyabilir.
Terraform Main Commands
init: Terraform dosyaları hazırlandıktan sonra, ilgili resource’ların yardımcı paketlerini, pluginleri vs indirmek için ilk bu komut kullanılır. Ortamı çalışmaya hazır hale getirir.
validate: Yapılan configurations ların geçerli olup olmadığını kontrol eder, hata varsa uyarı verir.
plan: Oluşturulan konfigrasyonların nasıl çalıştırılacağına dair plan yapar (Eğer oluşturulan planın kaydedilmesini istiyorsak: terraform plan -out fileName).
apply: Oluşan planın uygulanması için girilen komuttur
(Eğer terraform apply -auto-approve şeklinde çalıştırırsak işlem için emin misiniz sorusunu sormaz).
destroy: Silme komutudur, apply komutuyla yapılan işlemleri siler. Oluşturulan tüm resource ları silmek için kullanılır (oluşturduğu resource ları siler ancak projedeki .tf dosyaları silmez). (sadece tek bir resource silmek için: terraform destroy -target=resourceType.resourceName)
Daha birçok komut mevcuttur ancak bunlar arasında en önemli olanlardan,
fmt: format kelimesinin kısaltılmış halidir, hazırladığınız dosyaları standart hale getirir. Yapılan boşluk hatalarını vs. siler.
refresh: state dosyasını günceller (Eğer deploy edilen resource’lar değişikliğe uğradıysa, .tfstate dosyasına yapılan değişiklikleri eklemek için terraform’un refresh komutu kullanılır).
graph: Yapılan işlemleri grafik üzerinde gösterir (komutun verdiği çıktı online görüntüleme sitelerinde diagrama dönüştürüldüğünde tüm resource etkileşim ağı kolayca görünebilir).
state list: Oluşturulan resource ları listeler.
show: Resource larla ilgili detaylı bilgi görüntüler.
workspace: Projedeki resource ları küçük alanlar altında yönetmeyi sağlar (terraform workspace show komutuyla hangi workspace de çalışıldığı görüntülenebilir).
Terraform Main Keys
provider: region ayarları için kullanılan keydir.
resource: Kullanılacak kaynağın türünü belirlediğimiz keydir.
output: Terraform dosyalarında dışarıya output verilmesi istenen değerleri terminale çıktı olarak vermeyi sağlar.
data: ilgili value lar için data keyini kullanarak resource değerlerini oluşturmayı sağlar.
module: terraform da multiple resource ları barındıran konteynıra verilen isimdir. Terraform içinde resource ları ayrı ayrı oluşturmak yerine bir module içinde tek seferde oluşturmayı sağlar.
variable: Kullanılan değişikenleri tanımlamamızı sağlar.
Terraform Örnekler
Örneğin bir AWS instance içine terraform ile user oluşturalım (bir AWS instance oluşturup ssh ile bağlanın. Ardından içine terraformu indirin).
Projelerde terraform kullanmak için yapılması gereken ilk işlem, terraform için proje içinde bir dizin oluşturup; region ayarları için provider yaratmaktır. Terraform üzerindeki tüm provider listesi için buraya tıklayın.
Proje dizininde bir provider.tf dosyası oluşturalım. AWS provider ı için buradaki örnek kodu kullanabiliriz.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
}
# Configure the AWS Provider
provider "aws" {
region = "us-east-1"
}
User oluşturalım; Proje dizininde user.tf adında bir dosya oluşturalım. Bir aws user oluşturmak için ise aşağıdaki gibi bir format kullanılır. Buradaki örnek kodu dosyamıza dahil edelim.
resource "aws_iam_user" "lb" {
name = "loadbalancer"
path = "/system/"
tags = {
tag-key = "tag-value"
}
}
Burada resource keyinin önünde bulunan aws_iam_user kullanacağımız kaynağın türünü işaret ediyor. Hemen yanında bulunan lb ise bu kaynağa verilen isimdir. Bu isim güncellenebilir. Birden fazla user oluşturmak istersek, her birine farklı isim vermemiz gerekecektir. name keyi ise oluşturacağımız user a verilen isimdir. path ise user ın nerede oluşturulacağını belirler. tags kısmı ise ihtiyaç halinde ilgili resource için tag eklemeyi sağlar.
Şimdi burada terminalde terraform init komutunu çalıştıralım, ardından terraform plan komutunu çalıştıralım. En son terraform apply komutunu çalıştırıyoruz. Artık resource oluşturuldu. AWS hesabınızdan user ın oluşup oluşmadığını kontrol edin.
Tüm süreçler bu döngü ile devam eder. Terraform üzerinde resource lar belirlenir, ayarları yapılır ve terraform plan, terraform apply komutları çalıştırılır. Bu şekilde terraform resource ları oluşturur.
Örneğin, grup resource oluşturmayı deneyin, group.tf adında bir dosya oluşturup ilgili komutları döküman dosyasından kopyalıyoruz. Aynı komutları takip ediyoruz, terraform init, plan, apply.
Bir diğer örnek;
AWS üzerinde S3 bucket oluşturalım, ilgili döküman için buraya tıklayın. s3.tf adında bir dosya oluşturup aşağıdaki kodu içine yapıştıralım.
resource "aws_s3_bucket" "b" {
bucket = "my-tf-test-bucket"
tags = {
Name = "My bucket"
Environment = "Dev"
}
}
bucket key değeri AWS üzerindeki bucket ismidir ve benzersizdir. Ardından terraform plan, apply komutlarını çalıştıralım init yapmamıza gerek yok her seferinde init çalıştırmayacağız.
Terraform data örnek;
İlgili value lar için data keyini kullanarak resource değerlerini oluşturmayı sağlar. Şimdi bir data.tf dosyası oluşturalım. İlgili döküman için buraya bakabilirsiniz. data keyi ile ilgili tüm değerler dosyanın en yukarısında olması gerekir.
data "aws_ami" "web" {
filter {
name = "state"
values = ["available"]
}filter {
name = "tag:Component"
values = ["web"]
}most_recent = true
}resource "aws_instance" "web" {
ami = data.aws_ami.web.id
instance_type = "t1.micro"
}output "CENTOS_ID" { value = data.aws_ami.centos.id }
Bu örnekte instance ami değeri için bir data oluşturulmuş ve ilgili ami id sini bulabilmesi için filtreler belirlenmiş. Terraform AWS üzerinde, instance için ami değerini bu filtrelerle bulacak ve resource ami değeri olarak bulduğu değeri kaydedecek. output ile instance için oluşturulan ami değerini dışarıya açtık.
Terraform module örnek;
Terraform içinde resource ları ayrı ayrı oluşturmak yerine bir module içinde tek seferde oluşturmayı sağlar. Örnek döküman için buraya bakabilirsiniz. module.tf adında bir dosya oluşturalım.
module "vpc" {
source = "terraform-aws-modules/vpc/aws"name = "my-vpc"
cidr = "10.0.0.0/16"azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]enable_nat_gateway = true
enable_vpn_gateway = truetags = {
Terraform = "true"
Environment = "dev"
}
}
Variable ile Kullanım Yöntemi
Terraform ile VPC (virtual private cloud) oluşturalım. VPC, oluşturduğumuz tüm resource ların bir alan içinde olmasını sağlar. İlgili döküman için buraya tıklayın.
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"tags = {
Name = "main"
}
}
Burada her farklı ortam için tekrar tekrar tf dosyaları oluşturmak yerine, keylere verilen değerleri dışardan ekleyerek, dosyaları template haline çevirebiliriz bu sayede her seferinde tf dosyalarını güncellemek yerine sadece ilgili değerler için güncelleme yaparız.
resource "aws_vpc" "main" {
cidr_block = var.cidr_block
tags = var.tags
}
Bu şekildeki kullanımlar için dizinde variable.tf adında bir dosya oluştururuz. Dosyamıza ilgili value ları aşağıdaki formatta ekleriz.
variable "cidr_block" {}
variable "tags" {}
Burada variable dosyamızı da template formatında tutup alması gereken değerleri başka bir dosyadan verebiliriz. Bu sayede projede variable dosyası, ihtiyaç duyulan tüm değerlerin listesi olur ve yönetimi kolaylaştırır.
variable.tfvars adında bir dosya oluşturalım. Artık vermemiz gereken değerleri bu dosyadan verelim.
region = "us-east-1"
cidr_block = "10.0.0.0/16"
tags = {
Name = "VPC"
Team = "DevOps"
Billing = "CFO"
Quarter = "3"
AppName = "Wordpress"
}
Bu bir configration dosyası olmadığı için terraform bu formatı anlamaz bu sebeple uzantısını tf yapmıyoruz. Farklı istenilen bir şey yazılabilir.
Şimdi terraform init komutunu çalıştırdıktan sonra, terraform plan -var-file=variable.tfvars komutuyla birlikte, variable ları nereden alacağını terraform a bildirmiş olduk. Ardından terraform apply komutuyla tüm süreçler create edilebilir.
Workspace ile Kullanım Yöntemi
Terraform da küçük alanlar oluşturup o alanlarda resource ları yönetmeyi sağlar. Örneğin bir VPC ortamımız var ve hem dev ortamı için hem prod ortamı için resource larımız var. Her environment için ayrı ayrı resource lar oluşturduğumuz bu senaryoda, bu alanları yönetebilmek için workspace kullanırız. Herhangi bir workspace oluşturulmadığında default workspace altında çalışmış oluruz.
terraform workspace show, list, select, new ve delete komutlarını alır.
terraform workspace new dev komutuyla bir workspace oluşturalım. terraform workspace show komutunu girdiğimizde dev workspace inde olduğumuzu görebiliriz. Hangi folder dizininde çalışılıyorsa orada workspace düzenlemesi yapılmalıdır. Farklı workspace lere geçiş yapmak için select komutu kullanılır.
Okuduğunuz için teşekkür ederim. Lütfen yanlış ifade ettiğim, tam açıklayamadığım kısımlar olduysa benimle iletişime geçin. İyi çalışmalar.
Kaynaklar
https://cloudskills.io/blog/terraform-aws-1
https://www.baeldung.com/ops/terraform-intro
https://blog.gruntwork.io/an-introduction-to-terraform-f17df9c6d180
https://www.youtube.com/watch?v=3WmYXH4ITBA&list=PLdryHJhAOJSJZnB-pf3tsmDOLgc4TpFgb&ab_channel=DevOpsEnver
https://www.mshowto.org/terraform-part-4-modul-kullanimi.html
https://medium.com/devopsturkiye/terraform-ile-aws-ec2-uygulaması-infrastructure-as-code-nedir-3-e23bb5eb406c
https://www.omeroner.com/terraform-kullanarak-aws-data-lifecycle-manager-kullanmak/