Node.js Uygulamasını Terraform ile Ubuntu 14.04 Üzerine Dağıtma Rehberi
Günümüz yazılım geliştirme dünyasında, uygulamaların hızlı ve tutarlı bir şekilde dağıtılması büyük önem taşımaktadır. Bu süreçte otomasyon, hem zaman tasarrufu hem de hata oranını düşürme açısından kilit bir rol oynar. Bu makalede, popüler bir JavaScript çalışma zamanı olan Node.js uygulamasını, altyapıyı kod olarak yönetmemizi sağlayan Terraform aracıyla, belirli bir gereksinim olan Ubuntu 14.04 işletim sistemi üzerine nasıl dağıtacağımızı adım adım inceleyeceğiz. Ubuntu 14.04’ün yaşam döngüsünün sona ermiş (End of Life – EOL) olduğunu ve güvenlik riskleri taşıdığını belirtmekle birlikte, bu makale belirli bir senaryo veya eski bir sistemle uyumluluk gereksinimi olan durumlar için pratik bir rehber sunmaktadır.
Giriş: Node.js, Terraform ve Ubuntu 14.04 Neden Bir Arada?
Node.js, sunucu tarafı uygulamalar geliştirmek için yaygın olarak kullanılan açık kaynaklı, çapraz platform bir JavaScript çalışma zamanı ortamıdır. Hızlı I/O işlemleri ve olay tabanlı mimarisi sayesinde yüksek performanslı ve ölçeklenebilir uygulamalar oluşturmak için idealdir.
Terraform, HashiCorp tarafından geliştirilen, altyapıyı kod olarak (Infrastructure as Code – IaC) tanımlamanıza ve sağlamanıza olanak tanıyan bir araçtır. AWS, Azure, Google Cloud gibi birçok bulut sağlayıcısını ve diğer birçok hizmeti destekler. Terraform ile sanal makinelerden ağ yapılandırmalarına, veritabanlarından depolama birimlerine kadar tüm altyapınızı kod dosyalarıyla yönetebilir, versiyonlayabilir ve tekrar kullanılabilir hale getirebilirsiniz. Bu, altyapı dağıtımını otomatize etmenin, tutarlılığı sağlamanın ve insan hatalarını azaltmanın en etkili yollarından biridir.
Ubuntu 14.04 “Trusty Tahr”, Canonical tarafından 2014 yılında yayınlanmış bir Uzun Süreli Destek (LTS) sürümüdür. Her ne kadar standart desteği Nisan 2019’da, ESM (Extended Security Maintenance) desteği ise Nisan 2022’de sona ermiş olsa da, bazı eski sistemler, belirli bağımlılıklar veya uyumluluk testleri nedeniyle hala bu sürümü kullanma ihtiyacı duyabilir. Bu makale, tam da böyle bir senaryoyu ele alarak, eski bir işletim sistemi üzerinde modern bir dağıtım yaklaşımını nasıl uygulayacağımızı gösterecektir.
Bu kombinasyonun amacı, Node.js uygulamanız için gerekli olan bulut altyapısını (sanal makine, ağ, güvenlik ayarları vb.) Terraform ile tamamen otomatik bir şekilde oluşturmak ve ardından uygulamanızı bu sanal makineye yine otomatize edilmiş bir süreçle dağıtmaktır. Bu yaklaşım, dağıtım süreçlerinizi standartlaştırır, tekrarlanabilir hale getirir ve “altyapı drifti” (altyapı ayarlarının zamanla birbirinden farklılaşması) sorununu ortadan kaldırır.
Ön Gereksinimler
Bu rehberi takip edebilmek için aşağıdaki ön gereksinimlere sahip olmanız gerekmektedir:
* AWS Hesabı: Terraform ile AWS kaynakları oluşturacağımız için aktif bir AWS hesabına ihtiyacınız var.
* AWS CLI Kurulumu ve Yapılandırması: AWS CLI’nin bilgisayarınızda kurulu ve AWS hesabınızla kimlik doğrulaması yapılmış olması gerekir. aws configure komutu ile erişim anahtarlarınızı ve varsayılan bölgenizi ayarlayabilirsiniz.
* Terraform Kurulumu: Terraform’un bilgisayarınızda kurulu olması gerekmektedir. Terraform’un resmi web sitesinden işletim sisteminize uygun kurulum yönergelerini bulabilirsiniz.
* Node.js Uygulaması: Dağıtılacak basit bir Node.js uygulamasına ihtiyacınız var. Bu uygulama bir Git deposunda (örneğin GitHub) barındırılmalıdır.
* SSH Anahtar Çifti: EC2 örneğine SSH ile bağlanabilmek için bir SSH anahtar çiftine (public/private key) ihtiyacınız olacak. Genel anahtarınız AWS’de bir key pair olarak tanımlanmalı, özel anahtarınız ise yerel makinenizde bulunmalıdır.
Mimariye Genel Bakış
Dağıtımını yapacağımız Node.js uygulaması için aşağıdaki AWS kaynaklarını Terraform ile oluşturacağız:
1. VPC (Virtual Private Cloud): Uygulamamızın çalışacağı izole edilmiş sanal ağ ortamı.
2. Subnet: VPC içinde bir IP adresi aralığı. Uygulamamızın genel erişime açık olması için public subnet kullanacağız.
3. Internet Gateway: VPC’mizin internete çıkışını ve internetten gelen trafiği kabul etmesini sağlayan bileşen.
4. Route Table: Ağ trafiğinin nereye yönlendirileceğini belirleyen kurallar bütünü. Internet Gateway’e giden bir varsayılan rota içerecek.
5. Security Group: EC2 örneğimize gelen ve giden ağ trafiğini kontrol eden sanal güvenlik duvarı. SSH (Port 22) ve Node.js uygulamasının dinlediği port (örn. Port 3000) için erişime izin verecek.
6. EC2 Instance: Ubuntu 14.04 işletim sistemine sahip sanal makine. Bu makineye Node.js uygulamamız dağıtılacak. Kullanıcı verisi (User Data) scriptleri aracılığıyla Node.js kurulumu ve uygulama dağıtımı otomatikleştirilecek.
Node.js Uygulama Örneği
Dağıtacağımız Node.js uygulaması için basit bir Express.js “Hello World” uygulaması kullanalım. Bu uygulamayı bir Git deposuna yüklemeniz gerekmektedir (örneğin https://github.com/kullaniciadi/node-hello-world-app.git).
app.js dosyası:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Merhaba Dünya! Node.js uygulamam Terraform ile Ubuntu 14.04 üzerinde çalışıyor!');
});
app.listen(port, () => {
console.log(Uygulama http://localhost:${port} adresinde dinliyor.);
});
package.json dosyası:
{
"name": "node-hello-world-app",
"version": "1.0.0",
"description": "A simple Node.js Express app for Terraform deployment.",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.17.1"
},
"author": "",
"license": "ISC"
}
Bu uygulamayı bir Git deposuna yüklediğinizden emin olun.
Terraform Yapılandırması
Terraform yapılandırma dosyalarınızı düzenli tutmak için bir proje dizini oluşturun. Örneğin, terraform-nodejs-ubuntu1404. Bu dizin içinde aşağıdaki dosyaları oluşturacağız:
* versions.tf: Terraform ve sağlayıcı versiyonlarını tanımlar.
* variables.tf: Değişkenleri tanımlar.
* main.tf: AWS kaynaklarının ana tanımını içerir.
* outputs.tf: Dağıtım sonrası çıktıları (örn. EC2 IP adresi) tanımlar.
1. versions.tf
Bu dosya, Terraform’un kullanacağı sürümü ve AWS sağlayıcısının sürümünü belirtir.
terraform {
required_version = ">= 1.0.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0" # AWS sağlayıcısının 4.x sürümünü kullanın
}
}
}
provider "aws" {
region = var.region
}
2. variables.tf
Bu dosya, yapılandırmayı daha esnek ve tekrar kullanılabilir hale getirmek için çeşitli değişkenleri tanımlar.
variable "region" {
description = "AWS bölgesi"
type = string
default = "eu-central-1" # Frankfurt bölgesi
}
variable "project_name" {
description = "Proje adı için etiket"
type = string
default = "NodejsApp"
}
variable "vpc_cidr_block" {
description = "VPC için CIDR bloğu"
type = string
default = "10.0.0.0/16"
}
variable "subnet_cidr_block" {
description = "Public Subnet için CIDR bloğu"
type = string
default = "10.0.1.0/24"
}
variable "ami_id" {
description = "Ubuntu 14.04 LTS (HVM) AMI ID'si"
type = string
# Bu AMI ID'si eu-central-1 bölgesindeki 64-bit (x86) Ubuntu 14.04 LTS HVM EBS destekli AMI'sidir.
# Farklı bir bölge veya mimari için güncel AMI ID'sini kontrol etmeniz gerekebilir.
# AWS konsolundan (EC2 -> AMIs -> Public Images) "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*" şeklinde arayarak bulabilirsiniz.
default = "ami-0e137682" # eu-central-1 için örnek AMI ID. Güncelini kontrol edin.
}
variable "instance_type" {
description = "EC2 instance tipi"
type = string
default = "t2.micro"
}
variable "key_name" {
description = "EC2 instance'a bağlanmak için kullanılacak SSH anahtarının adı"
type = string
# AWS konsolunuzda tanımlı olan SSH anahtarınızın adını buraya yazın.
default = "my-ssh-key"
}
variable "app_port" {
description = "Node.js uygulamasının dinlediği port"
type = number
default = 3000
}
variable "git_repo_url" {
description = "Node.js uygulamasının bulunduğu Git deposunun URL'si"
type = string
# Kendi uygulamanızın Git deposu URL'sini buraya ekleyin.
default = "https://github.com/kullaniciadi/node-hello-world-app.git"
}
Önemli Not: ami_id ve key_name değişkenlerinin değerlerini kendi AWS ortamınıza ve bölgenize göre güncellemeniz kritik öneme sahiptir. Özellikle ami_id için AWS konsolunuzdan “EC2 -> AMIs” bölümüne giderek “Public images” filtresiyle “ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*” gibi bir arama yaparak güncel ve doğru AMI ID’sini bulmanız önerilir.
3. main.tf
Bu dosya, tüm AWS kaynaklarını tanımlayan ana Terraform yapılandırmasını içerir.
# --- VPC (Virtual Private Cloud) ---
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr_block
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "${var.project_name}-VPC"
Environment = "Development"
}
}
--- Internet Gateway ---
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = {
Name = "${var.project_name}-IGW"
}
}
--- Public Subnet ---
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = var.subnet_cidr_block
availability_zone = "${var.region}a" # İlk kullanılabilirlik bölgesini kullanın
map_public_ip_on_launch = true # Bu subnet'teki instance'lara otomatik public IP ata
tags = {
Name = "${var.project_name}-PublicSubnet"
}
}
--- Route Table ---
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0" # Tüm internet trafiğini
gateway_id = aws_internet_gateway.main.id # Internet Gateway'e yönlendir
}
tags = {
Name = "${var.project_name}-PublicRouteTable"
}
}
--- Route Table Association ---
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
--- Security Group ---
resource "aws_security_group" "nodejs_app_sg" {
name = "${var.project_name}-NodejsAppSG"
description = "Node.js uygulaması ve SSH erişimi için güvenlik grubu"
vpc_id = aws_vpc.main.id
# SSH erişimine izin ver (Port 22)
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # Her yerden SSH erişimi (güvenlik için kendi IP'nizi kısıtlayın)
}
# Node.js uygulaması portuna erişime izin ver (örn. Port 3000)
ingress {
from_port = var.app_port
to_port = var.app_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # Her yerden uygulama erişimi
}
# Tüm giden trafiğe izin ver
egress {
from_port = 0
to_port = 0
protocol = "-1" # Tüm protokoller
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "${var.project_name}-NodejsAppSG"
}
}
--- EC2 Instance (Ubuntu 14.04) ---
resource "aws_instance" "nodejs_server" {
ami = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.nodejs_app_sg.id]
associate_public_ip_address = true # Public IP atamasını manuel olarak etkinleştir
tags = {
Name = "${var.project_name}-NodejsServer"
}
# --- User Data Script ---
# Bu script, EC2 instance ilk başlatıldığında çalışır.
user_data = <<-EOF
#!/bin/bash
# Ubuntu 14.04 için Node.js ve PM2 kurulumu
# Sistem güncellemeleri
apt-get update -y
# Git kurulumu
apt-get install -y git
# Node.js kurulumu için NVM kullanın
# Ubuntu 14.04 üzerinde Node.js kurulumu biraz farklı olabilir.
# NVM (Node Version Manager) kullanmak daha esneklik sağlar.
# NVM'i indir ve kur
# NVM'in en güncel sürümünü veya Ubuntu 14.04 ile uyumlu bir sürümünü kontrol edin.
# Burada v0.39.1 kullanılmıştır, bu sürüm eski Node.js versiyonlarını destekler.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
# NVM'i mevcut shell'e yükle
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
# Node.js 10 LTS sürümünü kur ve varsayılan yap
# Ubuntu 14.04 için Node.js 10 veya 12 daha uygun olabilir.
# Daha yeni Node.js sürümleri eski glibc versiyonları nedeniyle sorun çıkarabilir.
nvm install 10
nvm use 10
nvm alias default 10
# npm ve nvm'in PATH'e eklendiğinden emin olun
echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc
echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc
echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> ~/.bashrc
source ~/.bashrc
# PM2'yi global olarak kur (Node.js süreç yöneticisi)
npm install -g pm2
# Uygulama dizinini oluştur ve uygulamayı klonla
mkdir -p /home/ubuntu/app
cd /home/ubuntu/app
git clone ${var.git_repo_url} .
# Bağımlılıkları yükle
npm install
# PM2 ile uygulamayı başlat ve başlangıçta otomatik çalışacak şekilde ayarla
pm2 start app.js --name "nodejs-app"
pm2 startup systemd # veya upstart, Ubuntu 14.04 için upstart daha yaygın olabilir
# Ubuntu 14.04 upstart kullandığı için pm2 startup upstart kullanmak daha doğru olabilir.
# Ancak systemd script'i de genellikle uyumluluk katmanı sayesinde çalışır.
# Eğer sorun yaşarsanız pm2 startup upstart komutunu deneyin.
# pm2 save komutu, pm2'nin mevcut süreçlerini kaydeder ve startup script'i bunları yükler.
pm2 save
# Uygulamanın çalışır durumda olduğunu kontrol etmek için
# curl http://localhost:${var.app_port}
EOF
}
User Data Script Açıklaması:
* #!/bin/bash: Script’in bash ile çalışacağını belirtir.
* apt-get update -y: Paket listelerini günceller.
* apt-get install -y git: Git’i kurar, böylece uygulamanızı Git deposundan çekebilirsiniz.
* NVM Kurulumu: Node Version Manager (NVM) indirilir ve kurulur. Bu, farklı Node.js sürümlerini yönetmek için idealdir. Ubuntu 14.04’ün eski çekirdek ve glibc versiyonları nedeniyle, Node.js’in daha yeni sürümleri derleme veya çalışma zamanı hataları verebilir. Bu nedenle, nvm install 10 ile Node.js 10 LTS sürümünü kurmak daha güvenli bir yaklaşımdır.
* PM2 Kurulumu: Node.js uygulamalarını üretim ortamında yönetmek için kullanılan bir süreç yöneticisi olan PM2 global olarak kurulur. PM2, uygulamanızın çökmesini engeller, yeniden başlatır ve CPU çekirdeklerini kullanarak ölçeklenmesini sağlar.
* Uygulama Klonlama ve Bağımlılık Yükleme: Git deposundan uygulamanız /home/ubuntu/app dizinine klonlanır ve npm install ile bağımlılıkları yüklenir.
* Uygulama Başlatma: pm2 start app.js --name "nodejs-app" komutu ile uygulama PM2 tarafından başlatılır.
* PM2 Başlangıç Ayarı: pm2 startup systemd (veya upstart) ve pm2 save komutları, sunucu yeniden başlatıldığında Node.js uygulamasının otomatik olarak PM2 tarafından tekrar başlatılmasını sağlar. Ubuntu 14.04 genellikle upstart kullanır, bu nedenle pm2 startup upstart daha uygun olabilir, ancak systemd script’i de çoğu zaman uyumluluk katmanı sayesinde çalışır. Eğer sorun yaşarsanız bu kısmı kontrol edin.
4. outputs.tf
Bu dosya, Terraform uygulandıktan sonra elde etmek istediğimiz önemli bilgileri tanımlar.
output "instance_public_ip" {
description = "Node.js uygulamasının çalıştığı EC2 instance'ın Public IP adresi"
value = aws_instance.nodejs_server.public_ip
}
output "instance_public_dns" {
description = "Node.js uygulamasının çalıştığı EC2 instance'ın Public DNS adı"
value = aws_instance.nodejs_server.public_dns
}
output "app_url" {
description = "Node.js uygulamasının erişilebilir URL'si"
value = "http://${aws_instance.nodejs_server.public_dns}:${var.app_port}"
}
Dağıtım Adımları
Terraform yapılandırma dosyalarınızı oluşturduktan sonra, uygulamayı dağıtmak için aşağıdaki adımları izleyin:
1. Terraform Projesini Başlatma
Terraform dizininize gidin ve gerekli sağlayıcı eklentilerini indirmek için terraform init komutunu çalıştırın:
cd terraform-nodejs-ubuntu1404
terraform init
2. Dağıtım Planını Gözden Geçirme
Terraform’un oluşturacağı, değiştireceği veya sileceği kaynakları görmek için terraform plan komutunu kullanın. Bu, gerçek bir değişiklik yapmadan önce altyapı değişikliklerini doğrulamanızı sağlar.
terraform plan
Çıktıyı dikkatlice inceleyin. + ile başlayan satırlar oluşturulacak kaynakları, - ile başlayanlar silinecekleri ve ~ ile başlayanlar ise değiştirilecekleri gösterir.
3. Kaynakları Uygulama
Planı onayladıktan sonra, Terraform’un AWS kaynaklarını oluşturması için terraform apply komutunu çalıştırın. Terraform, sizden onay isteyecektir; yes yazarak devam edin.
terraform apply
Bu işlem birkaç dakika sürebilir. Terraform tüm kaynakları oluşturacak ve EC2 instance’ının user_data script’ini çalıştıracaktır.
4. Dağıtımı Doğrulama
terraform apply işlemi başarıyla tamamlandığında, outputs.tf dosyasında tanımladığınız çıktıları göreceksiniz. Özellikle instance_public_ip veya app_url çıktısını kontrol edin.
Apply complete! Resources: 10 added, 0 changed, 0 destroyed.
Outputs:
app_url = "http://ec2-XX-XX-XX-XX.eu-central-1.compute.amazonaws.com:3000"
instance_public_dns = "ec2-XX-XX-XX-XX.eu-central-1.compute.amazonaws.com"
instance_public_ip = "XX.XX.XX.XX"
Tarayıcınızı açın ve app_url çıktısında verilen adrese gidin (örneğin http://XX.XX.XX.XX:3000). Node.js uygulamanızın “Merhaba Dünya!” mesajını görmeniz gerekir.
Ayrıca, SSH ile EC2 instance’ına bağlanarak uygulamanın durumunu kontrol edebilirsiniz:
ssh -i /path/to/your/private_key.pem ubuntu@XX.XX.XX.XX
Bağlandıktan sonra PM2 süreçlerini kontrol edin:
pm2 list
Uygulamanızın çalıştığını ve PM2 tarafından yönetildiğini görmelisiniz.
Uygulamanın Yönetimi ve Güncellenmesi
Uygulamanızı güncellediğinizde (Git deposunda değişiklik yaptığınızda), EC2 instance’ındaki uygulamayı da güncellemeniz gerekir. Bunun birkaç yolu vardır:
1. SSH ile Manuel Güncelleme: Instance’a SSH ile bağlanıp Git deposunu çekebilir (git pull), bağımlılıkları yeniden yükleyebilir (npm install) ve PM2 sürecini yeniden başlatabilirsiniz (pm2 restart nodejs-app). Bu basit bir yöntemdir ancak otomasyonun ruhuna aykırıdır.
2. Terraform User Data Yeniden Çalıştırma (Destructive): user_data script’i yalnızca instance ilk oluşturulduğunda çalışır. Eğer user_data içeriğini değiştirirseniz ve Terraform’u tekrar uygularsanız, Terraform EC2 instance’ını yeniden oluşturmaya karar verebilir (bu, mevcut verileri kaybetmenize neden olur). Bu genellikle istenen bir durum değildir.
3. CI/CD Boru Hattı: En iyi yaklaşım, bir CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) boru hattı kurmaktır. Uygulamanızın Git deposuna her push yaptığınızda, boru hattı otomatik olarak EC2 instance’ına SSH ile bağlanarak veya bir dağıtım aracı (örneğin CodeDeploy, Ansible) kullanarak uygulamayı günceller.
Kaynakları Yok Etme
Artık uygulamanıza ihtiyacınız kalmadığında, Terraform ile oluşturduğunuz tüm AWS kaynaklarını tek bir komutla güvenli bir şekilde silebilirsiniz:
terraform destroy
Yine onay isteyecektir; yes yazarak devam edin. Bu, oluşturulan tüm VPC, subnet, internet gateway, güvenlik grubu ve EC2 instance’ı dahil olmak üzere tüm kaynakları temizleyecektir.
Dikkate Alınması Gerekenler ve En İyi Uygulamalar
Bu rehber, Node.js uygulamasını Ubuntu 14.04 üzerine Terraform ile dağıtmak için temel bir çerçeve sunmaktadır. Ancak üretim ortamları için veya daha karmaşık senaryolar için ek hususlar ve en iyi uygulamalar bulunmaktadır:
Ubuntu 14.04 ve Güvenlik
Tekrar Vurgulamak Gerekir: Ubuntu 14.04’ün yaşam döngüsü sona ermiştir. Bu, Canonical’ın artık bu işletim sistemi için güvenlik güncellemeleri veya hata düzeltmeleri sağlamadığı anlamına gelir. Üretim ortamlarında Ubuntu 14.04 kullanmak ciddi güvenlik riskleri taşır ve kesinlikle önerilmez. Bu rehber, yalnızca belirli bir eski sistem gereksinimi olan durumlar için veya eğitim amaçlı kullanılmalıdır. Mümkünse, daha güncel bir Ubuntu LTS sürümü (örn. 20.04 veya 22.04) kullanmayı tercih edin. Daha yeni sürümlerde Node.js kurulumu da genellikle daha kolaydır.
Güvenlik En İyi Uygulamaları
* SSH Anahtarları: SSH özel anahtarınızı güvende tutun ve asla paylaşmayın.
* Güvenlik Grupları: Güvenlik gruplarındaki cidr_blocks kısıtlamalarını 0.0.0.0/0 yerine yalnızca bilinen IP adresleriyle (örneğin kendi ofis IP’niz) sınırlayın. Bu, yetkisiz erişimi engeller.
* IAM Rolleri: EC2 instance’larına doğrudan erişim anahtarları yerine IAM rolleri atayarak AWS kaynaklarına erişim yetkisi verin.
* Gizli Bilgiler: Veritabanı şifreleri, API anahtarları gibi hassas bilgileri user_data script’inde doğrudan saklamayın. Bunun yerine AWS Secrets Manager veya AWS Systems Manager Parameter Store gibi hizmetleri kullanın.
Ölçeklenebilirlik ve Yüksek Erişilebilirlik
Bu rehber tek bir EC2 instance’ı üzerinde çalışır. Üretim ortamlarında daha yüksek ölçeklenebilirlik ve erişilebilirlik için:
* Auto Scaling Groups (ASG): Trafik yüküne göre otomatik olarak EC2 instance’ları ekleyip çıkarmak için ASG’leri kullanın.
* Load Balancer (ELB/ALB): Gelen trafiği birden fazla EC2 instance’ına dağıtmak için bir Yük Dengeleyici kullanın.
* Çoklu Kullanılabilirlik Bölgeleri (Multi-AZ): Uygulamanızı birden fazla kullanılabilirlik bölgesine dağıtarak tek bir bölge hatasından kaynaklanan kesintileri önleyin.
Terraform Durum Yönetimi (State Management)
Yerel olarak saklanan terraform.tfstate dosyası, Terraform’un altyapınızın mevcut durumu hakkındaki bilgisini içerir. Ekip ortamlarında veya üretimde bu dosyayı uzak bir depoda (örneğin AWS S3 bucket) saklamak ve kilit mekanizmalarıyla (örneğin DynamoDB) eşzamanlı değişiklikleri önlemek önemlidir. Bu, “remote state” olarak bilinir.
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket" # Kendi benzersiz bucket adınızı girin
key = "nodejs-app/terraform.tfstate"
region = "eu-central-1"
encrypt = true
dynamodb_table = "my-terraform-lock-table" # Opsiyonel, kilit mekanizması için
}
}
Yapılandırma Yönetimi
user_data script’leri basit başlangıç görevleri için uygundur. Ancak daha karmaşık yapılandırma, uygulama güncellemeleri ve sunucu yönetimi için Ansible, Chef veya Puppet gibi ayrı bir yapılandırma yönetim aracı kullanmayı düşünebilirsiniz. Bu araçlar, EC2 instance’ı başlatıldıktan sonra daha ayrıntılı yapılandırma adımlarını otomatikleştirebilir.
İzleme ve Günlükleme
Uygulamanızın ve sunucunuzun sağlığını izlemek için AWS CloudWatch gibi hizmetleri kullanın. Uygulama günlüklerini merkezi bir günlükleme sistemine (örneğin CloudWatch Logs, ELK Stack) yönlendirin.
Sonuç
Bu makalede, bir Node.js uygulamasını Terraform kullanarak Ubuntu 14.04 işletim sistemine sahip bir AWS EC2 instance’ı üzerine nasıl dağıtacağımızı ayrıntılı bir şekilde ele aldık. VPC’den EC2 instance’ına, güvenlik grubundan user_data script’ine kadar tüm altyapı bileşenlerini kod olarak tanımladık ve otomatik dağıtım sürecini gösterdik.
Terraform, altyapı dağıtımını tutarlı, tekrarlanabilir ve yönetilebilir hale getirerek geliştirme ve operasyon ekipleri için paha biçilmez bir araçtır. Her ne kadar Ubuntu 14.04 gibi eski bir işletim sistemiyle çalışmak belirli zorluklar ve güvenlik endişeleri içerse de, Terraform’un gücü sayesinde bu tür senaryolar bile otomatize edilebilir.
Bu rehber, temel bir dağıtım senaryosunu kapsamakla birlikte, üretim ortamlarında dikkate alınması gereken birçok ek optimizasyon, güvenlik önlemi ve ölçeklenebilirlik stratejisi bulunmaktadır. Altyapınızı sürekli olarak iyileştirmek ve en iyi uygulamaları takip etmek, güvenli ve verimli uygulamalar sağlamanın anahtarıdır. Unutmayın, modern uygulamalar için her zaman güncel ve desteklenen işletim sistemlerini tercih etmek en doğru yaklaşımdır.