Terraform ile Başlarken¶
Bu makalede
- Terraform ile çalışmak için ihtiyacınız olanlar
- Adım 1. Terraform kurulumu
- Adım 2. Bir API key oluşturun
- Adım 3. Yapılandırmayı hazırlayın
- Adım 4. Provider'ı başlatın
- Adım 5. Yapılandırmayı doğrulayın
- Adım 6. Sunucuyu sipariş edin
- Adım 7. Yapılandırmayı değiştirin
- Adım 8. Kaynakları yok edin
- Mevcut sunucuları içe aktarma (Import)
- Sorun Giderme
Bilgi
Terraform, HashiCorp tarafından geliştirilen bir "infrastructure as code" (kod olarak altyapı) aracıdır. Altyapının istenen durumu, HCL dilinde yazılmış yapılandırma dosyalarında tanımlanır ve Terraform, bir "provider" olarak bilinen özel bir modül aracılığıyla hizmet sağlayıcının API'sini çağırarak gerçek kaynakları bu tanımla uyumlu hale getirir. Gerçekleştirdiği her işlem bir durum (state) dosyasında kaydedilir, böylece araç halihazırda neyin mevcut olduğunu bilir ve bir sonraki çalıştırmada yalnızca eksik olan değişiklikleri uygular. Terraform, değişiklikleri uygulamadan önce önizlemeyi, yapılandırmayı sürüm kontrolünde tutmayı ve özdeş ortamları yeniden oluşturmayı destekler; bu da sunucuları, ağları ve hizmetleri, onları kimin barındırdığına bakılmaksızın yönetmek için kullanışlı bir yol sağlar.
Yalnızca bir sunucu çalıştırıyorsanız, onu elle sipariş etmek daha hızlıdır. İşin içine farklı zamanlarda farklı yöneticiler tarafından oluşturulmuş on beş sunucu girdiğinde, kimse neden birinin Ubuntu 20.04, yanındakinin ise 22.04 çalıştırdığını hatırlamaz. Bir yapılandırma dosyası bu geçmişi kendi içinde tutar ve ayrıca hafızanızdaki tıklama dizisini yeniden oluşturmanıza gerek kalmadan aynı ortamı tekrar ayağa kaldırmanızı sağlar.
Bizim provider'ımız ile iş akışı şu şekilde görünür: Dosya; ön ayarı (preset), konumu, işletim sistemini ve trafik planını listeler, ardından terraform apply siparişi verir ve dağıtımın (deployment) tamamlanmasını bekler. Terraform oluşturduğu kaynakları hatırladığı için, komutu tekrar çalıştırmak hiçbir şeyi çoğaltmaz. terraform plan komutu, herhangi birini gerçekleştirmeden yaklaşan değişiklikleri gösterir.
Provider; VPS, VDS, dedicated ve GPU sunucuları, ek IP adresleri, SSH anahtarları ve DNS bölgeleri dahil olmak üzere tüm katalog ile çalışır. Kaynaklar ve veri kaynakları için tam referans Terraform Registry adresinde ve hostkey-cloud/terraform-provider-hostkey-com deposunda mevcuttur. Aşağıda temel senaryo olan sanal sunucu siparişi yer almaktadır.
Terraform ile çalışmak için ihtiyacınız olanlar¶
- Sunucu siparişi ücretli bir işlem olduğundan, Invapi kontrol panelinde bakiyede bakiye bulunan bir hesap;
- bir API key;
- bir SSH key;
- Terraform 1.0 veya daha yeni bir sürüm.
Dikkat
Hesapta en az bir sunucu bulunmalıdır. Invapi, hizmeti olmayan bir hesap için oturum açılmasına izin vermez ve kimlik doğrulama No appropriate servers found hatasıyla başarısız olur. Eğer hesap yeniyse, ilk sunucuyu kontrol paneli üzerinden sipariş edin ve geri kalanını Terraform ile oluşturun.
Adım 1. Terraform kurulumu¶
Terraform; Linux, macOS ve Windows üzerinde çalışır; bir paket yöneticisi aracılığıyla veya önceden derlenmiş binary dosyasını indirip açarak manuel olarak iki şekilde kurulabilir.
Windows¶
Arşivi indirin, terraform.exe dosyasını C:\terraform gibi özel bir klasöre çıkartın ve bu klasörü Path ortam değişkenine ekleyin.
Ardından terminali kapatıp yeniden açın, çünkü yeni Path değeri ancak bu şekilde uygulanır. Kurulumu doğrulamak için:
Linux¶
wget https://releases.hashicorp.com/terraform/1.15.8/terraform_1.15.8_linux_amd64.zip
unzip ./terraform_1.15.8_linux_amd64.zip
sudo mv ./terraform /usr/local/bin
terraform -v
macOS¶
Adım 2. Bir API key oluşturun¶
Key, Invapi kontrol panelinde oluşturulur. Sağ üst köşedeki kullanıcı adınıza tıklayın ve API keys seçeneğini seçin:

Add new düğmesine tıklayın ve formu doldurun.

| Field | Value |
|---|---|
| Name | Sadece 5-30 karakter, Latin harfleri, rakamlar, _ ve - |
| Restrict a new API key only for the server | Any |
| IP ACL | Herhangi bir adresten erişime izin vermek için boş bırakın |
| Set login notification method | None |
| Active | Selected |
Restrict a new API key only for the server alanı, key'i tek bir hizmete bağlar; provider'ın yeni sunucular sipariş etmesi gerektiğinden, değer Any olmalıdır.
IP ACL alanı, erişimi listelenen adreslerle sınırlar. Güvenliği artırır, ancak dinamik bir IP adresinde key, adres değiştiği anda çalışmayı durdurur; bu nedenle başlangıçta bu alanı boş bırakın ve sürekli entegrasyon (CI) için derleme sunucularınızın adreslerini listeleyin.
Create düğmesine tıklayın. Key yalnızca bir kez görüntülenir.

Dikkat
Key'i hemen saklayın, çünkü biz yalnızca hash bilgisini tutuyoruz ve değer geri getirilemez. Eğer kaybederseniz, yenisini oluşturmanız gerekecektir.
Adım 3. Yapılandırmayı hazırlayın¶
Yapılandırma örnekleri
Kullanıma hazır yapılandırma örnekleri provider deposunda mevcuttur. Temel bir kurulum için examples/basic örneğine bakın.
Bir proje dizini oluşturun, örneğin hostkey-terraform. Yapılandırma dosyaları .tf uzantısını kullanır ve isimleri rastgeledir, çünkü Terraform dizindeki her .tf dosyasını tek bir yapılandırmada birleştirir. Örneğimiz üç dosya kullanmaktadır.
main.tf¶
İlk blok, provider'ı ve gerekli Terraform sürümünü belirler.
terraform {
required_providers {
hostkey = {
source = "hostkey-cloud/hostkey-com"
version = "~> 0.2"
}
}
required_version = ">= 1.0"
}
provider "hostkey" {}
Not
0.2 sürümünden itibaren provider, her bir faturalandırma sistemi için ayrı olarak yayınlanmaktadır. hostkey-com paketi invapi.hostkey.com ile çalışır, bu nedenle seçilecek bir API endpoint'i yoktur ve provider bloğu boş kalır.
Ardından katalog kontrolü gelir. Bu bloklar kaynak oluşturmaz ve faturalandırılmaz; yalnızca API'den sipariş edilebilecek mevcut preset ve trafik planı listelerini isterler:
data "hostkey_presets" "selected" {
location = var.location
name = var.preset_name
}
data "hostkey_traffic_plans" "for_preset" {
location = var.location
instance_id = data.hostkey_presets.selected.presets[0].id
}
output "catalog_preset" {
value = data.hostkey_presets.selected.presets
}
output "catalog_traffic_plans" {
value = data.hostkey_traffic_plans.for_preset.traffic_plans
}
Bu kontrolün yapılmaya değer olmasının iki nedeni vardır: Provider tam isim eşleşmesi gerektirir ve katalog benzer trafik planı isimlerine sahiptir (örneğin 3 TB / 1 Gbps VM ve 3Tb traffic (1Gbps) VM). Ayrıca, kataloğun içeriği konuma bağlıdır ve zamanla değişebilir, bu nedenle bugün mevcut olan bir preset yarın mevcut olmayabilir.
Ardından sunucunun kendisi tanımlanır:
resource "hostkey_server" "web" {
preset_name = var.preset_name
location_name = var.location
traffic_plan_name = var.traffic_plan_name
deploy_period = "monthly"
os_name = "Ubuntu 22.04"
root_pass = var.root_pass
ssh_key = file(pathexpand(var.ssh_public_key_path))
power_state = "on"
cancellation_type = 1
cancellation_reason = "terraform"
tags = {
env = "demo"
}
timeouts {
create = "90m"
update = "90m"
delete = "30m"
}
}
timeouts bloğu, Terraform'un bir işlemin tamamlanması için ne kadar bekleyeceğini ayarlar. Dağıtım genellikle birkaç dakika sürer, ancak bekleme bir timeout nedeniyle kesintiye uğrarsa, Terraform takibi kaybettiği için sipariş ödenmiş olarak kalır.
cancellation_type argümanı 1 olarak ayarlandığında hizmeti hemen iptal eder, 0 ise ödenmiş dönemin sonuna kadar çalıştırmaya devam eder.
Not
hostname argümanı örnekten bilerek çıkarılmıştır. Dışarıda bırakıldığında, provider tf-44067425 gibi benzersiz bir isim oluşturur ve hizmet kontrol panelinde bu isim altında görünür. İşletim sistemi içindeki isim farklılık gösterebilir, çünkü Invapi bunu konuk işletim sistemine iletmez; bu nedenle kontrol etmenin tek yolu sunucunun kendisinde hostname komutunu çalıştırmaktır.
Hesap depolama alanındaki SSH key ayrı olarak oluşturulur:
resource "hostkey_ssh_key" "deploy" {
name = "tf-deploy"
key = file(pathexpand(var.ssh_public_key_path))
}
Bu, hostkey_server içindeki ssh_key özniteliği ile aynı şey değildir. Sunucu özniteliği, işletim sistemi kurulumu sırasında anahtarı makineye yazar; hostkey_ssh_key kaynağı ise anahtarı daha sonra kullanılmak üzere hesapta saklar.
Dosya output blokları ile sona erer. Siparişten sonra Terraform sunucu adresini, tanımlayıcısını (identifier) ve fatura numarasını yazdırır; terraform output main_ipv4 komutu ise herhangi bir zamanda adresi döndürür, bu da bir sonraki adımda başka bir şey çalışırken oldukça kullanışlıdır:
output "server_id" {
value = hostkey_server.web.id
}
output "main_ipv4" {
value = hostkey_server.web.main_ipv4
}
output "invoice" {
value = hostkey_server.web.invoice
}
variables.tf¶
variable "location" {
type = string
default = "FI"
}
variable "preset_name" {
type = string
default = "vm.v2-pico"
}
variable "traffic_plan_name" {
type = string
default = "3 TB / 1 Gbps VM"
}
variable "root_pass" {
type = string
sensitive = true
}
variable "ssh_public_key_path" {
type = string
default = "~/.ssh/id_ed25519.pub"
}
terraform.tfvars¶
Bu dosya şifreyi tutar, bu nedenle sürüm kontrolüne (version control) eklenmez:
root_pass = "StrongPass1%"
# Varsayılan değerler burada geçersiz kılınabilir
# location = "NL"
# preset_name = "vm.v3-pico"
# traffic_plan_name = "5 TB / 1 Gbps VM"
Dikkat
Root şifresi 8 ile 30 karakter uzunluğunda olmalı; bir büyük harf, bir küçük harf, bir rakam ve %, -, _, + karakterlerinden birini içermelidir. @ ve # karakterlerine izin verilmez. Şifre Terraform state dosyasında saklanır ve sunucu hazır olduğunda gönderilen e-postada düz metin olarak iletilir, bu nedenle sunucu kurulduktan sonra şifreyi değiştirin.
Adım 4. Provider'ı başlatın¶
Key, proje dosyalarının dışında kalması için bir ortam değişkeni (environment variable) aracılığıyla iletilir:
Windows komut istemcisinde set HOSTKEY_API_KEY=your-key, Linux ve macOS'ta ise export HOSTKEY_API_KEY="your-key" kullanın. Değişken yalnızca mevcut terminal oturumu için geçerlidir.
Not
Key, planlama aşamasında zaten gereklidir; çünkü provider, yapılandırmadaki isimleri katalog ile eşleştirir ve API erişimi olmadan işlem başarısız olur.
Ardından provider indirilmelidir:

Terraform provider'ı indirir ve tam sürümle birlikte bir .terraform.lock.hcl dosyası oluşturur. Bu dosya, projedeki herkesin aynı sürümün yüklü olduğundan emin olmak için depoya (repository) eklenir.
Adım 5. Yapılandırmayı doğrulayın¶
Sözdizimi (syntax) API çağrısı yapılmadan kontrol edilir:
Başarılı bir kontrol Success! The configuration is valid. çıktısını verir.
Ardından, herhangi birini gerçekleştirmeden yaklaşan değişiklikleri gösteren plan gelir:
Özet satırı. Plan: 2 to add, 0 to change, 0 to destroy çıktısını bekleyin; bu, sunucu ve SSH key demektir.
Çözümlenmiş tanımlayıcılar. Provider, isimlerin yanına preset_id, os_id ve traffic_plan_id bilgilerini doldurur ve eğer katalogda bir isim bulunamazsa, plan herhangi bir ücretlendirme yapılmadan önce başarısız olur.
Katalog. Changes to Outputs bölümü presetleri ve trafik planlarını listeler ve yapılandırmadaki değerler birebir aynı şekilde yazılmalıdır.
Adım 6. Sunucuyu sipariş edin¶
Terraform planı bir kez daha gösterir ve onay ister; yes yazın ve Enter tuşuna basın.

Dikkat
Sipariş bu noktadan itibaren ücretlendirilir. Terminal penceresini kapatmayın ve komutu kesmeyin; aksi takdirde Terraform takibi kaybettiği için sipariş kontrol panelinde asılı kalır.
Önce SSH key oluşturulur, ardından sunucu siparişi başlar; Terraform bağımlılıklardan yola çıkarak bu sırayı kendisi belirlemiştir.

Ardından, provider API'yi sorgularken ve kurulumun tamamlanmasını beklerken, her on saniyede bir yenilenen Still creating... satırları gelir. Bu sırada sunucu kontrol panelinde görünür hale gelir:

İşlem tamamlandığında değerler yazdırılır. Aldığınız adresi kullanarak SSH erişimini kontrol etmeye değer:

ssh_key özniteliğinde belirtilen anahtar sunucuda zaten mevcuttur, bu nedenle şifre istenmez. Yeni sunucu, kontrol panelinde elle sipariş edilenlerin yanında görünür:

Adım 7. Yapılandırmayı değiştirin¶
Değişiklikler üç kategoriye ayrılır:
-
Güvenli değişiklikler. Etiketler (tags) ve güç durumu (power state) çalışan bir sunucuya uygulanır ve plan bunları
update in-placeolarak gösterir. -
İşletim sistemi yeniden kurulumu.
os_name,soft_name,root_passveyassh_keydeğerlerini değiştirmek, aynı sunucuya işletim sistemini yeniden kurar; bu da diskteki tüm verilerin kaybolması anlamına gelir. -
Yeni bir sipariş.
preset_name,location_name,traffic_plan_nameveyadeploy_perioddeğerlerini değiştirmek, önceki sunucunun iptal edilmesi ve yeni bir sunucu sipariş edilmesi anlamına gelir, bu nedenle tekrar ücretlendirilirsiniz. Plan, bu tür değişiklikleriforces replacementolarak işaretler.
Dikkat
Yeniden kurulmaya yol açan değişiklikler, plan içerisinde tıpkı zararsız bir etiket değişikliği gibi update in-place olarak görünür. Provider, veri kaybı hakkında ayrı bir uyarı yazdırır; bu nedenle onaylamadan önce sadece planı değil, uyarıları da okumaya değer.
Adım 8. Kaynakları yok edin¶
terraform destroy, bu yapılandırma için mevcut Terraform durumunda (state) bulunan tüm kaynakları kaldırır. Terraform kaldırılacak kaynakların listesini görüntüler ve onay ister. yes yazın ve Enter tuşuna basın.
Yalnızca bir kaynağı kaldırmanız gerekiyorsa, -target ile belirtebilirsiniz. Örneğin:
Buradaki web, kontrol panelindeki sunucu kimliği değil, resource "hostkey_server" "web" bloğundan gelen kaynak adıdır.
Başka bir seçenek ise kaynağı .tf dosyalarından kaldırmak ve şu komutu çalıştırmaktır:
Terraform, kaynağın artık yapılandırmada bulunmadığını görecek ve onu altyapıdan kaldıracaktır.
Hizmet iptali Invapi üzerinden gerçekleştirilir ve iptal yöntemi cancellation_type parametresi ile belirlenir: 1 hizmeti hemen iptal eder, 0 ise ödenmiş dönemin sonunda iptal eder.
Bilgi
Anında iptal durumunda (cancellation_type = 1), ödenmiş dönemin kullanılmayan kısmı, hizmetin fiilen çalıştığı süreye orantılı olarak hesaplanarak hesap bakiyesine iade edilir.
Mevcut sunucuları içe aktarma (Import)¶
Kontrol paneli üzerinden sipariş edilen sunucular Terraform yönetimine dahil edilebilir. Tanımlayıcı (identifier), sunucu listesindeki ID sütunundan alınır:
İçe aktarmadan sonra durum (state), canlı verileri (yani tanımlayıcı, adres, durum ve güç durumu) tutar. Sipariş zamanı argümanları kontrol panelinden aktarılmaz, bu nedenle yapılandırmada elle tanımlanmalıdırlar. Bir içe aktarmadan sonraki ilk terraform apply işlemi yeniden kurulmaya yol açmaz.
Sorun Giderme¶
Not
Plan çalıştırılırken No appropriate servers found hatası. Hesabınızda en az bir hizmet olduğundan emin olun, çünkü Invapi hizmeti olmayan bir hesap için oturum açılmasına izin vermez.
Not
Catalog name resolve failed. Belirtilen preset, işletim sistemi veya trafik planı ismi, seçilen konum için katalogda mevcut değildir. Mevcut değerleri hostkey_presets ve hostkey_traffic_plans veri kaynakları aracılığıyla listeleyin ve yapılandırmayı onlarla uyumlu hale getirin.
Not
Durum pending:<invoice>. Sipariş ödenmiştir ancak dağıtım tamamlanmamıştır; kural olarak bağlantı kesildiği için bu durum oluşur. terraform apply komutunu tekrar çalıştırmak beklemeyi devam ettirir ve yeni bir sipariş oluşturmaz. Eğer fatura ödenmemişse, ödeyin ve terraform apply komutunu tekrar çalıştırın. Hizmetin canlı durumu kontrol panelinde gösterilir.
Bilgi
Terraform'un kendisi hakkında daha fazla bilgi resmi HashiCorp dokümanlarında bulunabilir ve kaynakların ve veri kaynaklarının özel argümanları Terraform Registry adresinde belgelenmiştir.