PortvMind Terraform - Webserver ve DB Kurulum Rehberi

PortvMind Terraform - 01 Webserver with DB Kurulum Rehberi

Genel Bakış

Bu doküman, PortvMind üzerinde Terraform kullanarak aynı network içinde çalışan web ve database katmanlarını ayrı subnetlerde oluşturma adımlarını açıklar.

01-webserver-with-db şablonu aşağıdaki kaynakları oluşturur. Repoya, Ek Kaynaklar bölümündeki PortvMind GitHub bağlantısından ulaşabilirsiniz:

  • Network
  • Public subnet
  • Private subnet
  • Router
  • Bastion security group
  • Database security group
  • Key pair
  • Bastion / web erişim instance’ı
  • Database instance
  • Bastion için Floating IP

Bu şablon özellikle şu durumlar için uygundur:

  • Çok katmanlı mimari örneği kurmak istediğinizde
  • WordPress + DB gibi senaryoları test ederken
  • Subnet ve security group segmentasyonu göstermek istediğinizde

Ön Koşullar

Gereksinim Açıklama
PortvMind Account Aktif bir PortvMind hesabı
Terraform Terraform CLI kurulu olmalı
Provider Access PortvMind username, password ve project bilgileri hazır olmalı
Resource ID Bilgileri Image, flavor, external network ve project ID bilgileri hazır olmalı
Local CLI Terraform komutlarını çalıştırabileceğiniz bir terminal

Şablon İçeriği

Dosya Açıklama
providers.tf Terraform ve OpenStack provider ayarları
variables.tf Input değişken tanımları
network.tf Network, public subnet, private subnet ve router yapılandırması
security.tf Web/bastion ve DB katmanları için security group kuralları
keypair.tf Sunucu erişimi için key pair tanımları
compute.tf Bastion / web erişim instance’ı ve DB compute kaynakları
.gitignore Terraform state ve tfvars dosyalarının git’e dahil edilmemesi için

Mimari Notu

  • Web/bastion katmanı ve DB katmanı ayrı subnetlerde çalışır.
  • Bastion / web erişim instance’ı public subnet içinde konumlanır ve Floating IP alır.
  • DB instance private subnet içinde konumlanır ve doğrudan public erişime açık tutulmaz.
  • Security group kuralları ile DB erişimi sadece gerekli portlar üzerinden sınırlandırılır.
  • DB sunucusuna erişim bastion üzerinden yapılır.

Terraform Kurulumu

Terraform kurulu değilse işletim sisteminize göre aşağıdaki adımları kullanabilirsiniz.

Ubuntu / Debian

sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt-get update && sudo apt-get install -y terraform
terraform version

macOS

brew tap hashicorp/tap
brew install hashicorp/tap/terraform
terraform version

Windows

choco install terraform -y
terraform version

PortvMind Kimlik Bilgileri ve Değişkenler

Bu projede provider erişimi için gerekli değerler terraform.tfvars dosyasında tutulur.

Önemli: terraform.tfvars dosyası repoda varsayılan olarak gelmez. Repoyu klonladıktan sonra kendi değerlerinizle oluşturun ve commit etmeyin.

Resource ID referansı: Image, flavor veya external network ID değerlerine ihtiyacınız varsa birleşik kaynak rehberine bakabilirsiniz: RESOURCES.md.

Örnek terraform.tfvars:

portvmind_username  = "YOUR_USERNAME"
portvmind_password  = "YOUR_PASSWORD"
ubuntu_image_id     = "YOUR_IMAGE_ID"
standard_flavor_id  = "YOUR_FLAVOR_ID"
external_network_id = "YOUR_EXTERNAL_NETWORK_ID"
project_id          = "YOUR_PROJECT_ID"

Değişken açıklamaları:

Değişken Açıklama
portvmind_username PortvMind kullanıcı adınız
portvmind_password PortvMind kullanıcı parolanız
ubuntu_image_id Kullanılacak Ubuntu image ID değeri
standard_flavor_id Instance’lar için kullanılacak flavor ID değeri
external_network_id Floating IP ve dış erişim için external network ID değeri
project_id Kaynakların oluşturulacağı project ID değeri

Güvenlik notu: portvmind_password gibi hassas alanları public repo içinde paylaşmayın. terraform.tfvars dosyasının .gitignore içinde olduğundan emin olun.


Kurulum Adımları

1. Şablon Klasörüne Geçin

cd 01-webserver-with-db

2. Terraform’u Başlatın

terraform init

Bu komut, gerekli provider dosyalarını indirir ve Terraform çalışma dizinini hazırlar.

3. Konfigürasyonu Doğrulayın

terraform validate

Bu adım, Terraform dosyalarında temel syntax ve yapılandırma hatası olup olmadığını kontrol eder.

4. Oluşturulacak Kaynakları Önceden İnceleyin

terraform plan -var-file="terraform.tfvars"

terraform plan çıktısında oluşturulacak network, public subnet, private subnet, router, security group, key pair, bastion / web erişim instance’ı, database instance ve Floating IP kaynaklarını kontrol edin.

5. Kaynakları Oluşturun

terraform apply -var-file="terraform.tfvars"

Komut onay istediğinde planı tekrar kontrol edin ve uygunsa yes yazarak devam edin.


Beklenen Sonuç

Kurulum tamamlandığında PortvMind üzerinde aşağıdaki kaynaklar oluşmuş olmalıdır:

  • Bir private network
  • Public subnet
  • Private DB subnet
  • External network’e bağlı router
  • Bastion / web erişim instance’ı
  • Private subnet içinde DB instance
  • Bastion instance’a bağlı Floating IP
  • Bastion ve DB katmanları için security group kuralları
  • SSH bağlantısı için .pem anahtar dosyası

Sunucuya SSH ile Bağlanma

Şablon .pem anahtarı üretiyorsa dosya proje dizininde oluşur. Anahtar dosya adını kendi ortamınıza göre değiştirin.

1. Anahtar İzinlerini Ayarlayın

Linux / macOS:

chmod 600 <KEY_NAME>.pem

Windows PowerShell:

icacls.exe <KEY_NAME>.pem /reset
icacls.exe <KEY_NAME>.pem /inheritance:r
icacls.exe <KEY_NAME>.pem /grant:r "$($env:username):(R)"

2. SSH Agent Kullanın

SSH Agent kullanarak her bağlantıda -i key.pem yazmadan sunucuya bağlanabilirsiniz. Bu özellikle bastion üzerinden DB katmanına geçiş senaryolarında süreci hızlandırır.

Linux / macOS:

eval "$(ssh-agent -s)"
ssh-add /path/to/<KEY_NAME>.pem
ssh-add -l

Windows PowerShell:

Start-Service ssh-agent
ssh-add C:\path\to\<KEY_NAME>.pem
ssh-add -l

Bastion Üzerinden DB Sunucusuna Geçiş

1. Bastion’a Bağlanın

ssh ubuntu@<BASTION_PUBLIC_IP>

SSH Agent kullanmıyorsanız:

ssh -i <KEY_NAME>.pem ubuntu@<BASTION_PUBLIC_IP>

2. Bastion İçinden DB Instance’a Geçin

ssh -A ubuntu@<DB_PRIVATE_IP>

Not: DB geçişinde de aynı anahtar kullanılır. <KEY_NAME>.pem yerine kendi anahtar dosya adınızı yazın.


Opsiyonel: Anahtar Dosyasını Sunucudan Bilgisayarınıza Çekme

Bu komutu kendi bilgisayarınızın terminalinde çalıştırın.

scp -i "<MEVCUT_BAGLANTI_ANAHTARI>.pem" "ubuntu@<SUNUCU_IP_ADRESI>:/yol/to/proje/<YENI_ANAHTAR>.pem" "C:\Keys\"

Örnek:

scp -i "C:\Keys\deneme12345.pem" "[email protected]:/home/ubuntu/vmind-terraform-projesi/vmind-Deneme-anahtar.pem" "C:\Dosya-Anahtar\"

Karşılaşılabilecek Durumlar

Terraform provider indirilemiyor

Olası nedenler:

  • İnternet bağlantısı yoktur.
  • Terraform registry erişimi kısıtlıdır.
  • Proxy veya firewall provider indirmeyi engelliyordur.

Çözüm:

terraform init

Hata devam ederse network/proxy ayarlarını kontrol edin.

Bastion bağlantısı kurulamıyor

Kontrol listesi:

  • Floating IP bastion instance’a atanmış mı?
  • Bastion security group içinde SSH portu açık mı?
  • Doğru .pem dosyası kullanılıyor mu?
  • Anahtar izinleri doğru ayarlanmış mı?
  • Kullanıcı adı doğru mu? Ubuntu image için genellikle ubuntu kullanılır.

DB sunucusuna geçiş yapılamıyor

Kontrol listesi:

  • DB instance private subnet içinde çalışıyor mu?
  • Bastion’dan DB private IP adresine erişim var mı?
  • SSH Agent aktif mi?
  • ssh -A ile agent forwarding kullanılıyor mu?
  • DB security group içinde bastion subnetinden SSH erişimi açık mı?

terraform.tfvars bulunamıyor

terraform.tfvars dosyasını 01-webserver-with-db klasörü içinde oluşturduğunuzdan emin olun.

ls

Dosya yoksa örnek değişkenleri kullanarak yeniden oluşturun.


Kaynakları Silme

Destroy Uyarısı: terraform destroy güçlü bir komuttur. Tüm kaynakları kalıcı olarak siler ve geri alınamaz.
Kaynakları kota nedeniyle yeniden oluşturmanız gerekiyorsa tekrar apply etmeden önce terraform destroy çalıştırın.

Kaynakları silmek için:

terraform destroy -var-file="terraform.tfvars"

Komut onay istediğinde silinecek kaynakları dikkatlice kontrol edin.


Ek Kaynaklar