Terraform, Amazon Web Services, Microsoft Azure, Google Cloud Platform gibi bulut hizmetleri için ortamların yönetimi ve konfigürasyonunun otomatikleştirilmesini sağlayan bir açık kaynaklı araçtır. Bu makalede, Terraform’un temel kavramlarını ve özelliklerini anlatacağım ve bunları örnek kodlar ve komutlarla destekleyeceğim. Bu makalede aşağıdaki bölümleri ele alacağım:

  1. Terraform’un ne işe yaradığı
  2. Terraform kurulumu ve konfigürasyonu
  3. Terraform projesi oluşturma ve yapılandırma
  4. Terraform komut satırı arayüzünün kullanımı
  5. Terraform kodunun yazımı ve kullanımı
  6. Terraform kodunun test edilmesi ve yönetimi
  7. Terraform ile bulut hizmetleri ortamlarının otomatikleştirilmesi
terraform

Terraform ne işe yarıyor?

Terraform, bir bulut hizmeti sağlayıcısı (örneğin AWS, Azure veya GCP) üzerinde konfigürasyon değişiklikleri yapmak için kullanılan bir araçtır. Örneğin, bir AWS VPC (Virtual Private Cloud) oluşturmak, EC2 (Elastic Compute Cloud) örnekleri başlatmak veya RDS (Relational Database Service) veritabanı oluşturmak gibi görevleri otomatikleştirebilir ve bunların yönetimini kolaylaştırabilir.

Terraform, yapılandırma dosyaları kullanarak bu tür değişiklikleri tanımlar. Bu dosyalar, değiştirilecek kaynakları ve bu kaynakların nasıl yapılandırılacağını belirtir. Örneğin, bir EC2 örneği oluşturmak için aşağıdaki gibi bir yapılandırma dosyası oluşturulabilir:

resource "aws_instance" "web_server" {
  ami           = "ami-0ff8a91507f77f867"
  instance_type = "t2.micro"
  key_name      = "my_key_pair"

  tags = {
    Name = "web_server"
  }
}

Bu yapılandırma dosyasında, “aws_instance” türünde bir kaynak oluşturulmaktadır ve bu kaynağa “web_server” adı verilmiştir. Bu kaynak, “ami-0ff8a91507f77f867” adlı Amazon Machine Image (AMI) kullanılarak bir t2.micro tipinde EC2 örneği oluşturacaktır. Bu örnek için “my_key_pair” adlı bir anahtar eşleşmesi kullanılacak ve örneğe “web_server” adı verilecektir.

Bu yapılandırma dosyası, Terraform komut satırı arayüzünü kullanarak çalıştırıldığında, AWS üzerinde bu örnek oluşturulacak ve yönetilebilecektir.

Terraform kurulumu ve konfigürasyonu

Terraform’u kullanmaya başlamadan önce, bilgisayarınıza kurulu olması gerekir. Terraform’un en son sürümünü resmi web sitesinden indirebilirsiniz. İndirme işlemini tamamladıktan sonra, dosyayı çalıştırarak kurulumu tamamlayın.

Terraform’u kullanmaya başlamadan önce, bulut hizmeti sağlayıcısına bağlantı kurmak için gerekli olan API anahtarlarını ve kimlik bilgilerini sağlamanız gerekir. Bu bilgiler, bulut hizmeti sağlayıcısının konsolundan veya komut satırı aracılığıyla elde edilebilir. Örneğin, AWS için, IAM (Identity and Access Management) kullanıcısı oluşturarak ve bu kullanıcıya API anahtarı ve gizli anahtarını veren bir IAM rolü oluşturulması gerekir.

Terraform’a bu bilgileri sağlamak için, bir ayar dosyası oluşturmanız gerekir. Bu dosya, aşağıdaki gibi olabilir:

provider "aws" {
  access_key = "ACCESS_KEY"
  secret_key = "SECRET_KEY"
  region     = "us-east-1"
}

Bu ayar dosyası, AWS için bir sağlayıcı tanımlar ve bu sağlayıcıya ait API anahtarı ve gizli anahtarı sağlar. Ayrıca, bu sağlayıcının çalıştırılacağı bölge de belirtilmiştir (“us-east-1”).

Bu ayar dosyası, Terraform kodunuzu çalıştırmadan önce Terraform’a sağlanmalıdır. Bu ayar dosyasını, Terraform komut satırı arayüzünün “init” komutu ile çalıştırarak Terraform’a sağlayabilirsiniz:

terraform init -reconfigure -backend-config="access_key=ACCESS_KEY" -backend-config="secret_key=SECRET_KEY"

Bu komut, Terraform’a API anahtarlarını ve bulut hizmeti sağlayıcısı bölgesini sağlar ve bu bilgileri kullanarak bir çalışma alanı (workspace) oluşturur.

Terraform projesi oluşturma ve yapılandırma

Terraform projesi, bir oluşturulacak ortamın tüm kaynaklarını içeren bir dizi yapılandırma dosyasından oluşur. Bu dosyalar, Terraform komut satırı arayüzünü kullanarak çalıştırılarak ortamı oluşturulmasını ve yönetilmesini sağlar.

Terraform projesi oluşturmak için, proje dizinine gidin ve “main.tf” adında bir yapılandırma dosyası oluşturun. Bu dosya, projeniz için gereken tüm kaynakları ve bunların yapılandırmalarını içerecektir. Örneğin, bir EC2 örneği oluşturmak için aşağıdaki gibi bir yapılandırma dosyası oluşturulabilir:

resource "aws_instance" "web_server" {
  ami           = "ami-0ff8a91507f77f867"
  instance_type = "t2.micro"
  key_name      = "my_key_pair"

  tags = {
    Name = "web_server"
  }
}

Bu yapılandırma dosyasında, “aws_instance” türünde bir kaynak oluşturulmaktadır ve bu kaynağa “web_server” adı verilmiştir. Bu kaynak, “ami-0ff8a91507f77f867” adlı Amazon Machine Image (AMI) kullanılarak bir t2.micro tipinde EC2 örneği oluşturacaktır. Bu örnek için “my_key_pair” adlı bir anahtar eşleşmesi kullanılacak ve örneğe “web_server” adı verilecektir.

Bu yapılandırma dosyasının yanısıra, projeniz için gereken diğer kaynakları da ekleyebilirsiniz. Örneğin, bir RDS veritabanı oluşturmak için aşağıdaki gibi bir yapılandırma dosyası oluşturulabilir:

resource "aws_db_instance" "database" {
  allocated_storage = 20
  storage_type      = "gp2"
  engine            = "mysql"
  engine_version    = "5.7"
  instance_class    = "db.t2.micro"
  name              = "mydatabase"
  username          = "myuser"
  password          = "mypass"
  vpc_security_group_ids = [aws_security_group.rds_sg.id]
}

resource "aws_security_group" "rds_sg" {
  name   = "rds_sg"
  vpc_id = aws_vpc.vpc.id

  ingress {
    from_port   = 3306
    to_port     = 3306
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "myvpc"
  }
}

Bu yapılandırma dosyasında, öncelikle bir “aws_db_instance” türünde bir kaynak oluşturulmaktadır ve bu kaynağa “database” adı verilmiştir. Bu kaynak, MySQL veritabanı motoru kullanılarak bir db.t2.micro tipinde RDS veritabanı oluşturacaktır. Veritabanına “mydatabase” adı verilecek ve “myuser” adlı bir kullanıcı ve “mypass” şifresi ile oturum açılabilecektir. Veritabanına erişim için, bir “aws_security_group” türünde bir kaynak oluşturulmuş ve bu kaynağa “rds_sg” adı verilmiştir. Bu güvenlik grubu, MySQL üzerinden 3306 portuna erişim sağlar ve erişimin herhangi bir IP adresinden yapılabileceğini belirtir. Veritabanı ve güvenlik grubunun çalıştırılacağı bir VPC (Virtual Private Cloud) oluşturulmuştur ve bu VPC’ye “myvpc” adı verilmiştir.

Terraform komut satırı arayüzünün kullanımı

Terraform projenizi oluşturduktan ve yapılandırdıktan sonra, Terraform komut satırı arayüzünü kullanarak bu projeyi çalıştırabilir ve yönetebilirsiniz. Terraform komut satırı arayüzü, projenizdeki yapılandırma dosyalarını kullanarak ortamınızı oluşturmak, değiştirmek ve silmek gibi işlemleri yapmanızı sağlar.

Terraform komut satırı arayüzünü kullanmak için, proje dizinine gidin ve aşağıdaki gibi bir komut çalıştırın:

terraform plan

Bu komut, projenizdeki yapılandırma dosyalarını kullanarak ortamınızda hangi değişikliklerin yapılacağını gösterir. Örneğin, bir EC2 örneği oluşturmak için aşağıdaki gibi bir çıktı görülebilir:

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + aws_instance.web_server
      id:                            <computed>
      ami:                           "ami-0ff8a91507f77f867"
      instance_type:                 "t2.micro"
      key_name:                      "my_key_pair"
      tags.%:                        "1"
      tags.Name:                     "web_server"

Plan: 1 to add, 0 to change, 0 to destroy.

Bu çıktıda, bir EC2 örneği oluşturulacağı ve bu örneğe “web_server” adı verileceği gösterilmektedir.

Eğer planın doğru olduğuna eminseniz, ortamınızda bu değişiklikleri gerçekleştirmek için aşağıdaki komutu çalıştırabilirsiniz:

terraform apply

Bu komut, projenizdeki yapılandırma dosyalarını kullanarak ortamınızda belirtilen değişiklikleri gerçekleştirir. Örneğin, bir EC2 örneği oluşturmak için aşağıdaki gibi bir çıktı görülebilir:

aws_instance.web_server: Creating...
aws_instance.web_server: Still creating... [10s elapsed]
aws_instance.web_server: Still creating... [20s elapsed]
aws_instance.web_server: Creation complete after 25s [id=i-0a123456b789cdef]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Bu çıktıda, EC2 örneği oluşturulmuş ve bu örnek için bir ID verilmiştir (i-0a123456b789cdef). Ortamınızda yapılan değişiklikleri geri almak için ise, aşağıdaki komutu çalıştırabilirsiniz:

terraform destroy

Bu komut, projenizdeki yapılandırma dosyalarını kullanarak ortamınızdaki tüm kaynakları siler. Örneğin, bir EC2 örneği silmek için aşağıdaki gibi bir çıktı görülebilir:

aws_instance.web_server: Refreshing state... [id=i-0a123456b789cdef]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:

destroy
Terraform will perform the following actions:

aws_instance.web_server
Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

aws_instance.web_server: Destroying... [id=i-0a123456b789cdef]
aws_instance.web_server: Still destroying... [id=i-0a123456b789cdef, 10s elapsed]
aws_instance.web_server: Still destroying... [id=i-0a123456b789cdef, 20s elapsed]
aws_instance.web_server: Destruction complete after 25s

Destroy complete! Resources: 1 destroyed.

Bu çıktıda, EC2 örneği silinmiş ve bu işlem tamamlanmıştır.

Örnek proje: Web sunucusu oluşturma

Terraform’un nasıl kullanılabileceğini anlatmak için, bir web sunucusu oluşturma projesi örneği vereceğiz. Bu projede, bir EC2 örneği oluşturulacak ve bu örnek üzerinde Apache web sunucusu kurulacaktır. Bu proje için aşağıdaki yapılandırma dosyaları oluşturulabilir:

Dosya adı: main.tf

resource "aws_instance" "web_server" {
  ami = "ami-0ff8a91507f77f867"
  instance_type = "t2.micro"
  key_name = "my_key_pair"
  
  connection {
    type = "ssh"
    user = "ec2-user"
    private_key = file("~/.ssh/my_key_pair.pem")
  }
  
  provisioner "remote-exec" {
    inline = [
    "sudo yum update -y",
    "sudo yum install -y httpd"
    ]
  }
  
  tags = {
    Name = "web_server"
  }
}
  
resource "aws_security_group" "web_sg" {
  name = "web_sg"
  description = "Allow HTTP traffic"
  vpc_id = aws_vpc.vpc.id
  
  ingress {
    from_port = 80
    to_port = 80
    protocol = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"
  
  tags = {
    Name = "myvpc"
  }
}

Bu yapılandırma dosyasında, öncelikle bir EC2 örneği oluşturulmaktadır. Bu örnek için bir anahtar eşleşmesi ve bir bağlantı yapılandırması belirtilmiştir. Bağlantı yapılandırması, EC2 örneğine SSH ile nasıl bağlanılacağını belirtir. Provisioner yapılandırması, EC2 örneğine kurulacak paketleri belirtir. Bu örnekte, Apache web sunucusu kurulacaktır. Bu EC2 örneğine “web_server” adı verilmiştir. Bir güvenlik grubu oluşturulmuş ve bu güvenlik grubu, HTTP trafiğine izin verir. Bu güvenlik grubu, bir VPC içinde çalıştırılacak ve bu VPC’ye “myvpc” adı verilmiştir.

Bu projeyi çalıştırmak için, “terraform plan” ve “terraform apply” komutlarını çalıştırabilirsiniz. Proje çalıştırıldıktan sonra, EC2 örneğine “web_server” adı verilen ve Apache web sunucusu kurulu bir örnek olacaktır.

Bu örnek projeyi kaldırmak için, aşağıdaki komutu çalıştırabilirsiniz:

terraform destroy

Bu komut, projenizdeki yapılandırma dosyalarını kullanarak ortamınızdaki tüm kaynakları siler. Örneğin, EC2 örneğini ve güvenlik grubunu silmek için aşağıdaki gibi bir çıktı görülebilir:

aws_instance.web_server: Refreshing state... [id=i-0a123456b789cdef]
aws_security_group.web_sg: Refreshing state... [id=sg-12345678]
aws_vpc.vpc: Refreshing state... [id=vpc-12345678]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  - aws_instance.web_server
  - aws_security_group.web_sg
  - aws_vpc.vpc


Plan: 0 to add, 0 to change, 3 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

aws_instance.web_server: Destroying... [id=i-0a123456b789cdef]
aws_instance.web_server: Still destroying... [id=i-0a123456b789cdef, 10s elapsed]
aws_instance.web_server: Still destroying... [id=i-0a123456b789cdef, 20s elapsed]
aws_instance.web_server: Destruction complete after 25s
aws_security_group.web_sg: Destroying... [id=sg-12345678]
aws_security_group.web_sg: Destruction complete after 0s
aws_vpc.vpc: Destroying... [id=vpc-12345678]
aws_vpc.vpc: Destruction complete after 0s

Destroy complete! Resources: 3 destroyed.

Bu çıktıda, EC2 örneği, güvenlik grubu ve VPC silinmiş ve bu işlem tamamlanmıştır.

Sonuç

Bu makalede, Terraform hakkında genel bilgi verilmiş ve nasıl kullanılabileceği örneklerle açıklanmıştır. Terraform, ortamınızı yapılandırmak, çalıştırmak ve yönetmek için kullanabileceğiniz güçlü bir araçtır. Daha fazla bilgi için, Terraform belgelerine ve örnek projelere bakabilirsiniz. İlginizi çekerse kendi kendini yöneten Argo CD konuma bu bağlantıdan ulaşabilirsiniz.