{"id":36381,"date":"2025-12-15T00:40:50","date_gmt":"2025-12-14T21:40:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36381"},"modified":"2025-12-15T00:40:50","modified_gmt":"2025-12-14T21:40:50","slug":"node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/","title":{"rendered":"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, uygulamalar\u0131n h\u0131zl\u0131 ve tutarl\u0131 bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 b\u00fcy\u00fck \u00f6nem ta\u015f\u0131maktad\u0131r. Bu s\u00fcre\u00e7te otomasyon, hem zaman tasarrufu hem de hata oran\u0131n\u0131 d\u00fc\u015f\u00fcrme a\u00e7\u0131s\u0131ndan kilit bir rol oynar. Bu makalede, pop\u00fcler bir JavaScript \u00e7al\u0131\u015fma zaman\u0131 olan Node.js uygulamas\u0131n\u0131, altyap\u0131y\u0131 kod olarak y\u00f6netmemizi sa\u011flayan Terraform arac\u0131yla, belirli bir gereksinim olan Ubuntu 14.04 i\u015fletim sistemi \u00fczerine nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Ubuntu 14.04&#8217;\u00fcn ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn sona ermi\u015f (End of Life &#8211; EOL) oldu\u011funu ve g\u00fcvenlik riskleri ta\u015f\u0131d\u0131\u011f\u0131n\u0131 belirtmekle birlikte, bu makale belirli bir senaryo veya eski bir sistemle uyumluluk gereksinimi olan durumlar i\u00e7in pratik bir rehber sunmaktad\u0131r.<\/p>\n<h3>Giri\u015f: Node.js, Terraform ve Ubuntu 14.04 Neden Bir Arada?<\/h3>\n<p>Node.js, sunucu taraf\u0131 uygulamalar geli\u015ftirmek i\u00e7in yayg\u0131n olarak kullan\u0131lan a\u00e7\u0131k kaynakl\u0131, \u00e7apraz platform bir JavaScript \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. H\u0131zl\u0131 I\/O i\u015flemleri ve olay tabanl\u0131 mimarisi sayesinde y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir uygulamalar olu\u015fturmak i\u00e7in idealdir.<\/p>\n<p>Terraform, HashiCorp taraf\u0131ndan geli\u015ftirilen, altyap\u0131y\u0131 kod olarak (Infrastructure as Code &#8211; IaC) tan\u0131mlaman\u0131za ve sa\u011flaman\u0131za olanak tan\u0131yan bir ara\u00e7t\u0131r. AWS, Azure, Google Cloud gibi bir\u00e7ok bulut sa\u011flay\u0131c\u0131s\u0131n\u0131 ve di\u011fer bir\u00e7ok hizmeti destekler. Terraform ile sanal makinelerden a\u011f yap\u0131land\u0131rmalar\u0131na, veritabanlar\u0131ndan depolama birimlerine kadar t\u00fcm altyap\u0131n\u0131z\u0131 kod dosyalar\u0131yla y\u00f6netebilir, versiyonlayabilir ve tekrar kullan\u0131labilir hale getirebilirsiniz. Bu, altyap\u0131 da\u011f\u0131t\u0131m\u0131n\u0131 otomatize etmenin, tutarl\u0131l\u0131\u011f\u0131 sa\u011flaman\u0131n ve insan hatalar\u0131n\u0131 azaltman\u0131n en etkili yollar\u0131ndan biridir.<\/p>\n<p>Ubuntu 14.04 &#8220;Trusty Tahr&#8221;, Canonical taraf\u0131ndan 2014 y\u0131l\u0131nda yay\u0131nlanm\u0131\u015f bir Uzun S\u00fcreli Destek (LTS) s\u00fcr\u00fcm\u00fcd\u00fcr. Her ne kadar standart deste\u011fi Nisan 2019&#8217;da, ESM (Extended Security Maintenance) deste\u011fi ise Nisan 2022&#8217;de sona ermi\u015f olsa da, baz\u0131 eski sistemler, belirli ba\u011f\u0131ml\u0131l\u0131klar veya uyumluluk testleri nedeniyle hala bu s\u00fcr\u00fcm\u00fc kullanma ihtiyac\u0131 duyabilir. Bu makale, tam da b\u00f6yle bir senaryoyu ele alarak, eski bir i\u015fletim sistemi \u00fczerinde modern bir da\u011f\u0131t\u0131m yakla\u015f\u0131m\u0131n\u0131 nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 g\u00f6sterecektir.<\/p>\n<p>Bu kombinasyonun amac\u0131, Node.js uygulaman\u0131z i\u00e7in gerekli olan bulut altyap\u0131s\u0131n\u0131 (sanal makine, a\u011f, g\u00fcvenlik ayarlar\u0131 vb.) Terraform ile tamamen otomatik bir \u015fekilde olu\u015fturmak ve ard\u0131ndan uygulaman\u0131z\u0131 bu sanal makineye yine otomatize edilmi\u015f bir s\u00fcre\u00e7le da\u011f\u0131tmakt\u0131r. Bu yakla\u015f\u0131m, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131r\u0131r, tekrarlanabilir hale getirir ve &#8220;altyap\u0131 drifti&#8221; (altyap\u0131 ayarlar\u0131n\u0131n zamanla birbirinden farkl\u0131la\u015fmas\u0131) sorununu ortadan kald\u0131r\u0131r.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Bu rehberi takip edebilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6n gereksinimlere sahip olman\u0131z gerekmektedir:<\/p>\n<p>*   <strong>AWS Hesab\u0131:<\/strong> Terraform ile AWS kaynaklar\u0131 olu\u015fturaca\u011f\u0131m\u0131z i\u00e7in aktif bir AWS hesab\u0131na ihtiyac\u0131n\u0131z var.<br \/>\n*   <strong>AWS CLI Kurulumu ve Yap\u0131land\u0131rmas\u0131:<\/strong> AWS CLI&#8217;nin bilgisayar\u0131n\u0131zda kurulu ve AWS hesab\u0131n\u0131zla kimlik do\u011frulamas\u0131 yap\u0131lm\u0131\u015f olmas\u0131 gerekir. <code>aws configure<\/code> komutu ile eri\u015fim anahtarlar\u0131n\u0131z\u0131 ve varsay\u0131lan b\u00f6lgenizi ayarlayabilirsiniz.<br \/>\n*   <strong>Terraform Kurulumu:<\/strong> Terraform&#8217;un bilgisayar\u0131n\u0131zda kurulu olmas\u0131 gerekmektedir. Terraform&#8217;un resmi web sitesinden i\u015fletim sisteminize uygun kurulum y\u00f6nergelerini bulabilirsiniz.<br \/>\n*   <strong>Node.js Uygulamas\u0131:<\/strong> Da\u011f\u0131t\u0131lacak basit bir Node.js uygulamas\u0131na ihtiyac\u0131n\u0131z var. Bu uygulama bir Git deposunda (\u00f6rne\u011fin GitHub) bar\u0131nd\u0131r\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong>SSH Anahtar \u00c7ifti:<\/strong> EC2 \u00f6rne\u011fine SSH ile ba\u011flanabilmek i\u00e7in bir SSH anahtar \u00e7iftine (public\/private key) ihtiyac\u0131n\u0131z olacak. Genel anahtar\u0131n\u0131z AWS&#8217;de bir key pair olarak tan\u0131mlanmal\u0131, \u00f6zel anahtar\u0131n\u0131z ise yerel makinenizde bulunmal\u0131d\u0131r.<\/p>\n<h3>Mimariye Genel Bak\u0131\u015f<\/h3>\n<p>Da\u011f\u0131t\u0131m\u0131n\u0131 yapaca\u011f\u0131m\u0131z Node.js uygulamas\u0131 i\u00e7in a\u015fa\u011f\u0131daki AWS kaynaklar\u0131n\u0131 Terraform ile olu\u015fturaca\u011f\u0131z:<\/p>\n<p>1.  <strong>VPC (Virtual Private Cloud):<\/strong> Uygulamam\u0131z\u0131n \u00e7al\u0131\u015faca\u011f\u0131 izole edilmi\u015f sanal a\u011f ortam\u0131.<br \/>\n2.  <strong>Subnet:<\/strong> VPC i\u00e7inde bir IP adresi aral\u0131\u011f\u0131. Uygulamam\u0131z\u0131n genel eri\u015fime a\u00e7\u0131k olmas\u0131 i\u00e7in public subnet kullanaca\u011f\u0131z.<br \/>\n3.  <strong>Internet Gateway:<\/strong> VPC&#8217;mizin internete \u00e7\u0131k\u0131\u015f\u0131n\u0131 ve internetten gelen trafi\u011fi kabul etmesini sa\u011flayan bile\u015fen.<br \/>\n4.  <strong>Route Table:<\/strong> A\u011f trafi\u011finin nereye y\u00f6nlendirilece\u011fini belirleyen kurallar b\u00fct\u00fcn\u00fc. Internet Gateway&#8217;e giden bir varsay\u0131lan rota i\u00e7erecek.<br \/>\n5.  <strong>Security Group:<\/strong> EC2 \u00f6rne\u011fimize gelen ve giden a\u011f trafi\u011fini kontrol eden sanal g\u00fcvenlik duvar\u0131. SSH (Port 22) ve Node.js uygulamas\u0131n\u0131n dinledi\u011fi port (\u00f6rn. Port 3000) i\u00e7in eri\u015fime izin verecek.<br \/>\n6.  <strong>EC2 Instance:<\/strong> Ubuntu 14.04 i\u015fletim sistemine sahip sanal makine. Bu makineye Node.js uygulamam\u0131z da\u011f\u0131t\u0131lacak. Kullan\u0131c\u0131 verisi (User Data) scriptleri arac\u0131l\u0131\u011f\u0131yla Node.js kurulumu ve uygulama da\u011f\u0131t\u0131m\u0131 otomatikle\u015ftirilecek.<\/p>\n<h3>Node.js Uygulama \u00d6rne\u011fi<\/h3>\n<p>Da\u011f\u0131taca\u011f\u0131m\u0131z Node.js uygulamas\u0131 i\u00e7in basit bir Express.js &#8220;Hello World&#8221; uygulamas\u0131 kullanal\u0131m. Bu uygulamay\u0131 bir Git deposuna y\u00fcklemeniz gerekmektedir (\u00f6rne\u011fin <code>https:\/\/github.com\/kullaniciadi\/node-hello-world-app.git<\/code>).<\/p>\n<p><code>app.js<\/code> dosyas\u0131:<\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\nconst app = express();\nconst port = 3000;\n\napp.get('\/', (req, res) => {\n  res.send('Merhaba D\u00fcnya! Node.js uygulamam Terraform ile Ubuntu 14.04 \u00fczerinde \u00e7al\u0131\u015f\u0131yor!');\n});\n\napp.listen(port, () => {\n  console.log(<code>Uygulama http:\/\/localhost:${port} adresinde dinliyor.<\/code>);\n});<\/code><\/pre>\n<p><code>package.json<\/code> dosyas\u0131:<\/p>\n<pre><code class=\"language-json\">{\n  \"name\": \"node-hello-world-app\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A simple Node.js Express app for Terraform deployment.\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"start\": \"node app.js\"\n  },\n  \"dependencies\": {\n    \"express\": \"^4.17.1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}<\/code><\/pre>\n<p>Bu uygulamay\u0131 bir Git deposuna y\u00fckledi\u011finizden emin olun.<\/p>\n<h3>Terraform Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Terraform yap\u0131land\u0131rma dosyalar\u0131n\u0131z\u0131 d\u00fczenli tutmak i\u00e7in bir proje dizini olu\u015fturun. \u00d6rne\u011fin, <code>terraform-nodejs-ubuntu1404<\/code>. Bu dizin i\u00e7inde a\u015fa\u011f\u0131daki dosyalar\u0131 olu\u015fturaca\u011f\u0131z:<\/p>\n<p>*   <code>versions.tf<\/code>: Terraform ve sa\u011flay\u0131c\u0131 versiyonlar\u0131n\u0131 tan\u0131mlar.<br \/>\n*   <code>variables.tf<\/code>: De\u011fi\u015fkenleri tan\u0131mlar.<br \/>\n*   <code>main.tf<\/code>: AWS kaynaklar\u0131n\u0131n ana tan\u0131m\u0131n\u0131 i\u00e7erir.<br \/>\n*   <code>outputs.tf<\/code>: Da\u011f\u0131t\u0131m sonras\u0131 \u00e7\u0131kt\u0131lar\u0131 (\u00f6rn. EC2 IP adresi) tan\u0131mlar.<\/p>\n<h4>1. <code>versions.tf<\/code><\/h4>\n<p>Bu dosya, Terraform&#8217;un kullanaca\u011f\u0131 s\u00fcr\u00fcm\u00fc ve AWS sa\u011flay\u0131c\u0131s\u0131n\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirtir.<\/p>\n<pre><code class=\"language-terraform\">terraform {\n  required_version = \">= 1.0.0\"\n\n  required_providers {\n    aws = {\n      source  = \"hashicorp\/aws\"\n      version = \"~> 4.0\" # AWS sa\u011flay\u0131c\u0131s\u0131n\u0131n 4.x s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131n\n    }\n  }\n}\n\nprovider \"aws\" {\n  region = var.region\n}<\/code><\/pre>\n<h4>2. <code>variables.tf<\/code><\/h4>\n<p>Bu dosya, yap\u0131land\u0131rmay\u0131 daha esnek ve tekrar kullan\u0131labilir hale getirmek i\u00e7in \u00e7e\u015fitli de\u011fi\u015fkenleri tan\u0131mlar.<\/p>\n<pre><code class=\"language-terraform\">variable \"region\" {\n  description = \"AWS b\u00f6lgesi\"\n  type        = string\n  default     = \"eu-central-1\" # Frankfurt b\u00f6lgesi\n}\n\nvariable \"project_name\" {\n  description = \"Proje ad\u0131 i\u00e7in etiket\"\n  type        = string\n  default     = \"NodejsApp\"\n}\n\nvariable \"vpc_cidr_block\" {\n  description = \"VPC i\u00e7in CIDR blo\u011fu\"\n  type        = string\n  default     = \"10.0.0.0\/16\"\n}\n\nvariable \"subnet_cidr_block\" {\n  description = \"Public Subnet i\u00e7in CIDR blo\u011fu\"\n  type        = string\n  default     = \"10.0.1.0\/24\"\n}\n\nvariable \"ami_id\" {\n  description = \"Ubuntu 14.04 LTS (HVM) AMI ID'si\"\n  type        = string\n  # Bu AMI ID'si eu-central-1 b\u00f6lgesindeki 64-bit (x86) Ubuntu 14.04 LTS HVM EBS destekli AMI'sidir.\n  # Farkl\u0131 bir b\u00f6lge veya mimari i\u00e7in g\u00fcncel AMI ID'sini kontrol etmeniz gerekebilir.\n  # AWS konsolundan (EC2 -> AMIs -> Public Images) \"ubuntu\/images\/hvm-ssd\/ubuntu-trusty-14.04-amd64-server-*\" \u015feklinde arayarak bulabilirsiniz.\n  default     = \"ami-0e137682\" # eu-central-1 i\u00e7in \u00f6rnek AMI ID. G\u00fcncelini kontrol edin.\n}\n\nvariable \"instance_type\" {\n  description = \"EC2 instance tipi\"\n  type        = string\n  default     = \"t2.micro\"\n}\n\nvariable \"key_name\" {\n  description = \"EC2 instance'a ba\u011flanmak i\u00e7in kullan\u0131lacak SSH anahtar\u0131n\u0131n ad\u0131\"\n  type        = string\n  # AWS konsolunuzda tan\u0131ml\u0131 olan SSH anahtar\u0131n\u0131z\u0131n ad\u0131n\u0131 buraya yaz\u0131n.\n  default     = \"my-ssh-key\"\n}\n\nvariable \"app_port\" {\n  description = \"Node.js uygulamas\u0131n\u0131n dinledi\u011fi port\"\n  type        = number\n  default     = 3000\n}\n\nvariable \"git_repo_url\" {\n  description = \"Node.js uygulamas\u0131n\u0131n bulundu\u011fu Git deposunun URL'si\"\n  type        = string\n  # Kendi uygulaman\u0131z\u0131n Git deposu URL'sini buraya ekleyin.\n  default     = \"https:\/\/github.com\/kullaniciadi\/node-hello-world-app.git\"\n}<\/code><\/pre>\n<p><strong>\u00d6nemli Not:<\/strong> <code>ami_id<\/code> ve <code>key_name<\/code> de\u011fi\u015fkenlerinin de\u011ferlerini kendi AWS ortam\u0131n\u0131za ve b\u00f6lgenize g\u00f6re g\u00fcncellemeniz kritik \u00f6neme sahiptir. \u00d6zellikle <code>ami_id<\/code> i\u00e7in AWS konsolunuzdan &#8220;EC2 -> AMIs&#8221; b\u00f6l\u00fcm\u00fcne giderek &#8220;Public images&#8221; filtresiyle &#8220;ubuntu\/images\/hvm-ssd\/ubuntu-trusty-14.04-amd64-server-*&#8221; gibi bir arama yaparak g\u00fcncel ve do\u011fru AMI ID&#8217;sini bulman\u0131z \u00f6nerilir.<\/p>\n<h4>3. <code>main.tf<\/code><\/h4>\n<p>Bu dosya, t\u00fcm AWS kaynaklar\u0131n\u0131 tan\u0131mlayan ana Terraform yap\u0131land\u0131rmas\u0131n\u0131 i\u00e7erir.<\/p>\n<pre><code class=\"language-terraform\"># --- VPC (Virtual Private Cloud) ---\nresource \"aws_vpc\" \"main\" {\n  cidr_block           = var.vpc_cidr_block\n  enable_dns_support   = true\n  enable_dns_hostnames = true\n\n  tags = {\n    Name        = \"${var.project_name}-VPC\"\n    Environment = \"Development\"\n  }\n}\n\n<h2>--- Internet Gateway ---<\/h2>\nresource \"aws_internet_gateway\" \"main\" {\n  vpc_id = aws_vpc.main.id\n\n  tags = {\n    Name = \"${var.project_name}-IGW\"\n  }\n}\n\n<h2>--- Public Subnet ---<\/h2>\nresource \"aws_subnet\" \"public\" {\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = var.subnet_cidr_block\n  availability_zone = \"${var.region}a\" # \u0130lk kullan\u0131labilirlik b\u00f6lgesini kullan\u0131n\n  map_public_ip_on_launch = true # Bu subnet'teki instance'lara otomatik public IP ata\n\n  tags = {\n    Name = \"${var.project_name}-PublicSubnet\"\n  }\n}\n\n<h2>--- Route Table ---<\/h2>\nresource \"aws_route_table\" \"public\" {\n  vpc_id = aws_vpc.main.id\n\n  route {\n    cidr_block = \"0.0.0.0\/0\" # T\u00fcm internet trafi\u011fini\n    gateway_id = aws_internet_gateway.main.id # Internet Gateway'e y\u00f6nlendir\n  }\n\n  tags = {\n    Name = \"${var.project_name}-PublicRouteTable\"\n  }\n}\n\n<h2>--- Route Table Association ---<\/h2>\nresource \"aws_route_table_association\" \"public\" {\n  subnet_id      = aws_subnet.public.id\n  route_table_id = aws_route_table.public.id\n}\n\n<h2>--- Security Group ---<\/h2>\nresource \"aws_security_group\" \"nodejs_app_sg\" {\n  name        = \"${var.project_name}-NodejsAppSG\"\n  description = \"Node.js uygulamas\u0131 ve SSH eri\u015fimi i\u00e7in g\u00fcvenlik grubu\"\n  vpc_id      = aws_vpc.main.id\n\n  # SSH eri\u015fimine izin ver (Port 22)\n  ingress {\n    from_port   = 22\n    to_port     = 22\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"] # Her yerden SSH eri\u015fimi (g\u00fcvenlik i\u00e7in kendi IP'nizi k\u0131s\u0131tlay\u0131n)\n  }\n\n  # Node.js uygulamas\u0131 portuna eri\u015fime izin ver (\u00f6rn. Port 3000)\n  ingress {\n    from_port   = var.app_port\n    to_port     = var.app_port\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"] # Her yerden uygulama eri\u015fimi\n  }\n\n  # T\u00fcm giden trafi\u011fe izin ver\n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\" # T\u00fcm protokoller\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n\n  tags = {\n    Name = \"${var.project_name}-NodejsAppSG\"\n  }\n}\n\n<h2>--- EC2 Instance (Ubuntu 14.04) ---<\/h2>\nresource \"aws_instance\" \"nodejs_server\" {\n  ami                         = var.ami_id\n  instance_type               = var.instance_type\n  key_name                    = var.key_name\n  subnet_id                   = aws_subnet.public.id\n  vpc_security_group_ids      = [aws_security_group.nodejs_app_sg.id]\n  associate_public_ip_address = true # Public IP atamas\u0131n\u0131 manuel olarak etkinle\u015ftir\n\n  tags = {\n    Name = \"${var.project_name}-NodejsServer\"\n  }\n\n  # --- User Data Script ---\n  # Bu script, EC2 instance ilk ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r.\n  user_data = <<-EOF\n    #!\/bin\/bash\n    # Ubuntu 14.04 i\u00e7in Node.js ve PM2 kurulumu\n    \n    # Sistem g\u00fcncellemeleri\n    apt-get update -y\n    \n    # Git kurulumu\n    apt-get install -y git\n    \n    # Node.js kurulumu i\u00e7in NVM kullan\u0131n\n    # Ubuntu 14.04 \u00fczerinde Node.js kurulumu biraz farkl\u0131 olabilir.\n    # NVM (Node Version Manager) kullanmak daha esneklik sa\u011flar.\n    \n    # NVM'i indir ve kur\n    # NVM'in en g\u00fcncel s\u00fcr\u00fcm\u00fcn\u00fc veya Ubuntu 14.04 ile uyumlu bir s\u00fcr\u00fcm\u00fcn\u00fc kontrol edin.\n    # Burada v0.39.1 kullan\u0131lm\u0131\u015ft\u0131r, bu s\u00fcr\u00fcm eski Node.js versiyonlar\u0131n\u0131 destekler.\n    curl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.1\/install.sh | bash\n    \n    # NVM'i mevcut shell'e y\u00fckle\n    export NVM_DIR=\"$HOME\/.nvm\"\n    [ -s \"$NVM_DIR\/nvm.sh\" ] &#038;&#038; \\. \"$NVM_DIR\/nvm.sh\"  # This loads nvm\n    [ -s \"$NVM_DIR\/bash_completion\" ] &#038;&#038; \\. \"$NVM_DIR\/bash_completion\"  # This loads nvm bash_completion\n\n    # Node.js 10 LTS s\u00fcr\u00fcm\u00fcn\u00fc kur ve varsay\u0131lan yap\n    # Ubuntu 14.04 i\u00e7in Node.js 10 veya 12 daha uygun olabilir.\n    # Daha yeni Node.js s\u00fcr\u00fcmleri eski glibc versiyonlar\u0131 nedeniyle sorun \u00e7\u0131karabilir.\n    nvm install 10\n    nvm use 10\n    nvm alias default 10\n    \n    # npm ve nvm'in PATH'e eklendi\u011finden emin olun\n    echo 'export NVM_DIR=\"$HOME\/.nvm\"' >> ~\/.bashrc\n    echo '[ -s \"$NVM_DIR\/nvm.sh\" ] && \\. \"$NVM_DIR\/nvm.sh\"' >> ~\/.bashrc\n    echo '[ -s \"$NVM_DIR\/bash_completion\" ] && \\. \"$NVM_DIR\/bash_completion\"' >> ~\/.bashrc\n    source ~\/.bashrc\n\n    # PM2'yi global olarak kur (Node.js s\u00fcre\u00e7 y\u00f6neticisi)\n    npm install -g pm2\n    \n    # Uygulama dizinini olu\u015ftur ve uygulamay\u0131 klonla\n    mkdir -p \/home\/ubuntu\/app\n    cd \/home\/ubuntu\/app\n    git clone ${var.git_repo_url} .\n    \n    # Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle\n    npm install\n    \n    # PM2 ile uygulamay\u0131 ba\u015flat ve ba\u015flang\u0131\u00e7ta otomatik \u00e7al\u0131\u015facak \u015fekilde ayarla\n    pm2 start app.js --name \"nodejs-app\"\n    pm2 startup systemd # veya upstart, Ubuntu 14.04 i\u00e7in upstart daha yayg\u0131n olabilir\n    # Ubuntu 14.04 upstart kulland\u0131\u011f\u0131 i\u00e7in pm2 startup upstart kullanmak daha do\u011fru olabilir.\n    # Ancak systemd script'i de genellikle uyumluluk katman\u0131 sayesinde \u00e7al\u0131\u015f\u0131r.\n    # E\u011fer sorun ya\u015farsan\u0131z pm2 startup upstart komutunu deneyin.\n    # pm2 save komutu, pm2'nin mevcut s\u00fcre\u00e7lerini kaydeder ve startup script'i bunlar\u0131 y\u00fckler.\n    pm2 save\n    \n    # Uygulaman\u0131n \u00e7al\u0131\u015f\u0131r durumda oldu\u011funu kontrol etmek i\u00e7in\n    # curl http:\/\/localhost:${var.app_port}\n  EOF\n}<\/code><\/pre>\n<p><strong>User Data Script A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>*   <strong><code>#!\/bin\/bash<\/code><\/strong>: Script&#8217;in bash ile \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <strong><code>apt-get update -y<\/code><\/strong>: Paket listelerini g\u00fcnceller.<br \/>\n*   <strong><code>apt-get install -y git<\/code><\/strong>: Git&#8217;i kurar, b\u00f6ylece uygulaman\u0131z\u0131 Git deposundan \u00e7ekebilirsiniz.<br \/>\n*   <strong>NVM Kurulumu<\/strong>: Node Version Manager (NVM) indirilir ve kurulur. Bu, farkl\u0131 Node.js s\u00fcr\u00fcmlerini y\u00f6netmek i\u00e7in idealdir. Ubuntu 14.04&#8217;\u00fcn eski \u00e7ekirdek ve glibc versiyonlar\u0131 nedeniyle, Node.js&#8217;in daha yeni s\u00fcr\u00fcmleri derleme veya \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131 verebilir. Bu nedenle, <code>nvm install 10<\/code> ile Node.js 10 LTS s\u00fcr\u00fcm\u00fcn\u00fc kurmak daha g\u00fcvenli bir yakla\u015f\u0131md\u0131r.<br \/>\n*   <strong>PM2 Kurulumu<\/strong>: Node.js uygulamalar\u0131n\u0131 \u00fcretim ortam\u0131nda y\u00f6netmek i\u00e7in kullan\u0131lan bir s\u00fcre\u00e7 y\u00f6neticisi olan PM2 global olarak kurulur. PM2, uygulaman\u0131z\u0131n \u00e7\u00f6kmesini engeller, yeniden ba\u015flat\u0131r ve CPU \u00e7ekirdeklerini kullanarak \u00f6l\u00e7eklenmesini sa\u011flar.<br \/>\n*   <strong>Uygulama Klonlama ve Ba\u011f\u0131ml\u0131l\u0131k Y\u00fckleme<\/strong>: Git deposundan uygulaman\u0131z <code>\/home\/ubuntu\/app<\/code> dizinine klonlan\u0131r ve <code>npm install<\/code> ile ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklenir.<br \/>\n*   <strong>Uygulama Ba\u015flatma<\/strong>: <code>pm2 start app.js --name \"nodejs-app\"<\/code> komutu ile uygulama PM2 taraf\u0131ndan ba\u015flat\u0131l\u0131r.<br \/>\n*   <strong>PM2 Ba\u015flang\u0131\u00e7 Ayar\u0131<\/strong>: <code>pm2 startup systemd<\/code> (veya <code>upstart<\/code>) ve <code>pm2 save<\/code> komutlar\u0131, sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda Node.js uygulamas\u0131n\u0131n otomatik olarak PM2 taraf\u0131ndan tekrar ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar. Ubuntu 14.04 genellikle <code>upstart<\/code> kullan\u0131r, bu nedenle <code>pm2 startup upstart<\/code> daha uygun olabilir, ancak <code>systemd<\/code> script&#8217;i de \u00e7o\u011fu zaman uyumluluk katman\u0131 sayesinde \u00e7al\u0131\u015f\u0131r. E\u011fer sorun ya\u015farsan\u0131z bu k\u0131sm\u0131 kontrol edin.<\/p>\n<h4>4. <code>outputs.tf<\/code><\/h4>\n<p>Bu dosya, Terraform uyguland\u0131ktan sonra elde etmek istedi\u011fimiz \u00f6nemli bilgileri tan\u0131mlar.<\/p>\n<pre><code class=\"language-terraform\">output \"instance_public_ip\" {\n  description = \"Node.js uygulamas\u0131n\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 EC2 instance'\u0131n Public IP adresi\"\n  value       = aws_instance.nodejs_server.public_ip\n}\n\noutput \"instance_public_dns\" {\n  description = \"Node.js uygulamas\u0131n\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 EC2 instance'\u0131n Public DNS ad\u0131\"\n  value       = aws_instance.nodejs_server.public_dns\n}\n\noutput \"app_url\" {\n  description = \"Node.js uygulamas\u0131n\u0131n eri\u015filebilir URL'si\"\n  value       = \"http:\/\/${aws_instance.nodejs_server.public_dns}:${var.app_port}\"\n}<\/code><\/pre>\n<h3>Da\u011f\u0131t\u0131m Ad\u0131mlar\u0131<\/h3>\n<p>Terraform yap\u0131land\u0131rma dosyalar\u0131n\u0131z\u0131 olu\u015fturduktan sonra, uygulamay\u0131 da\u011f\u0131tmak i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyin:<\/p>\n<h4>1. Terraform Projesini Ba\u015flatma<\/h4>\n<p>Terraform dizininize gidin ve gerekli sa\u011flay\u0131c\u0131 eklentilerini indirmek i\u00e7in <code>terraform init<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">cd terraform-nodejs-ubuntu1404\nterraform init<\/code><\/pre>\n<h4>2. Da\u011f\u0131t\u0131m Plan\u0131n\u0131 G\u00f6zden Ge\u00e7irme<\/h4>\n<p>Terraform&#8217;un olu\u015fturaca\u011f\u0131, de\u011fi\u015ftirece\u011fi veya silece\u011fi kaynaklar\u0131 g\u00f6rmek i\u00e7in <code>terraform plan<\/code> komutunu kullan\u0131n. Bu, ger\u00e7ek bir de\u011fi\u015fiklik yapmadan \u00f6nce altyap\u0131 de\u011fi\u015fikliklerini do\u011frulaman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">terraform plan<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131y\u0131 dikkatlice inceleyin. <code>+<\/code> ile ba\u015flayan sat\u0131rlar olu\u015fturulacak kaynaklar\u0131, <code>-<\/code> ile ba\u015flayanlar silinecekleri ve <code>~<\/code> ile ba\u015flayanlar ise de\u011fi\u015ftirilecekleri g\u00f6sterir.<\/p>\n<h4>3. Kaynaklar\u0131 Uygulama<\/h4>\n<p>Plan\u0131 onaylad\u0131ktan sonra, Terraform&#8217;un AWS kaynaklar\u0131n\u0131 olu\u015fturmas\u0131 i\u00e7in <code>terraform apply<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Terraform, sizden onay isteyecektir; <code>yes<\/code> yazarak devam edin.<\/p>\n<pre><code class=\"language-bash\">terraform apply<\/code><\/pre>\n<p>Bu i\u015flem birka\u00e7 dakika s\u00fcrebilir. Terraform t\u00fcm kaynaklar\u0131 olu\u015fturacak ve EC2 instance&#8217;\u0131n\u0131n <code>user_data<\/code> script&#8217;ini \u00e7al\u0131\u015ft\u0131racakt\u0131r.<\/p>\n<h4>4. Da\u011f\u0131t\u0131m\u0131 Do\u011frulama<\/h4>\n<p><code>terraform apply<\/code> i\u015flemi ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda, <code>outputs.tf<\/code> dosyas\u0131nda tan\u0131mlad\u0131\u011f\u0131n\u0131z \u00e7\u0131kt\u0131lar\u0131 g\u00f6receksiniz. \u00d6zellikle <code>instance_public_ip<\/code> veya <code>app_url<\/code> \u00e7\u0131kt\u0131s\u0131n\u0131 kontrol edin.<\/p>\n<pre><code class=\"language-\">Apply complete! Resources: 10 added, 0 changed, 0 destroyed.\n\nOutputs:\n\napp_url = \"http:\/\/ec2-XX-XX-XX-XX.eu-central-1.compute.amazonaws.com:3000\"\ninstance_public_dns = \"ec2-XX-XX-XX-XX.eu-central-1.compute.amazonaws.com\"\ninstance_public_ip = \"XX.XX.XX.XX\"<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve <code>app_url<\/code> \u00e7\u0131kt\u0131s\u0131nda verilen adrese gidin (\u00f6rne\u011fin <code>http:\/\/XX.XX.XX.XX:3000<\/code>). Node.js uygulaman\u0131z\u0131n &#8220;Merhaba D\u00fcnya!&#8221; mesaj\u0131n\u0131 g\u00f6rmeniz gerekir.<\/p>\n<p>Ayr\u0131ca, SSH ile EC2 instance&#8217;\u0131na ba\u011flanarak uygulaman\u0131n durumunu kontrol edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ssh -i \/path\/to\/your\/private_key.pem ubuntu@XX.XX.XX.XX<\/code><\/pre>\n<p>Ba\u011fland\u0131ktan sonra PM2 s\u00fcre\u00e7lerini kontrol edin:<\/p>\n<pre><code class=\"language-bash\">pm2 list<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve PM2 taraf\u0131ndan y\u00f6netildi\u011fini g\u00f6rmelisiniz.<\/p>\n<h3>Uygulaman\u0131n Y\u00f6netimi ve G\u00fcncellenmesi<\/h3>\n<p>Uygulaman\u0131z\u0131 g\u00fcncelledi\u011finizde (Git deposunda de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda), EC2 instance&#8217;\u0131ndaki uygulamay\u0131 da g\u00fcncellemeniz gerekir. Bunun birka\u00e7 yolu vard\u0131r:<\/p>\n<p>1.  <strong>SSH ile Manuel G\u00fcncelleme:<\/strong> Instance&#8217;a SSH ile ba\u011flan\u0131p Git deposunu \u00e7ekebilir (<code>git pull<\/code>), ba\u011f\u0131ml\u0131l\u0131klar\u0131 yeniden y\u00fckleyebilir (<code>npm install<\/code>) ve PM2 s\u00fcrecini yeniden ba\u015flatabilirsiniz (<code>pm2 restart nodejs-app<\/code>). Bu basit bir y\u00f6ntemdir ancak otomasyonun ruhuna ayk\u0131r\u0131d\u0131r.<br \/>\n2.  <strong>Terraform User Data Yeniden \u00c7al\u0131\u015ft\u0131rma (Destructive):<\/strong> <code>user_data<\/code> script&#8217;i yaln\u0131zca instance ilk olu\u015fturuldu\u011funda \u00e7al\u0131\u015f\u0131r. E\u011fer <code>user_data<\/code> i\u00e7eri\u011fini de\u011fi\u015ftirirseniz ve Terraform&#8217;u tekrar uygularsan\u0131z, Terraform EC2 instance&#8217;\u0131n\u0131 yeniden olu\u015fturmaya karar verebilir (bu, mevcut verileri kaybetmenize neden olur). Bu genellikle istenen bir durum de\u011fildir.<br \/>\n3.  <strong>CI\/CD Boru Hatt\u0131:<\/strong> En iyi yakla\u015f\u0131m, bir CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatt\u0131 kurmakt\u0131r. Uygulaman\u0131z\u0131n Git deposuna her push yapt\u0131\u011f\u0131n\u0131zda, boru hatt\u0131 otomatik olarak EC2 instance&#8217;\u0131na SSH ile ba\u011flanarak veya bir da\u011f\u0131t\u0131m arac\u0131 (\u00f6rne\u011fin CodeDeploy, Ansible) kullanarak uygulamay\u0131 g\u00fcnceller.<\/p>\n<h3>Kaynaklar\u0131 Yok Etme<\/h3>\n<p>Art\u0131k uygulaman\u0131za ihtiyac\u0131n\u0131z kalmad\u0131\u011f\u0131nda, Terraform ile olu\u015fturdu\u011funuz t\u00fcm AWS kaynaklar\u0131n\u0131 tek bir komutla g\u00fcvenli bir \u015fekilde silebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">terraform destroy<\/code><\/pre>\n<p>Yine onay isteyecektir; <code>yes<\/code> yazarak devam edin. Bu, olu\u015fturulan t\u00fcm VPC, subnet, internet gateway, g\u00fcvenlik grubu ve EC2 instance&#8217;\u0131 dahil olmak \u00fczere t\u00fcm kaynaklar\u0131 temizleyecektir.<\/p>\n<h3>Dikkate Al\u0131nmas\u0131 Gerekenler ve En \u0130yi Uygulamalar<\/h3>\n<p>Bu rehber, Node.js uygulamas\u0131n\u0131 Ubuntu 14.04 \u00fczerine Terraform ile da\u011f\u0131tmak i\u00e7in temel bir \u00e7er\u00e7eve sunmaktad\u0131r. Ancak \u00fcretim ortamlar\u0131 i\u00e7in veya daha karma\u015f\u0131k senaryolar i\u00e7in ek hususlar ve en iyi uygulamalar bulunmaktad\u0131r:<\/p>\n<h4>Ubuntu 14.04 ve G\u00fcvenlik<\/h4>\n<p><strong>Tekrar Vurgulamak Gerekir:<\/strong> Ubuntu 14.04&#8217;\u00fcn ya\u015fam d\u00f6ng\u00fcs\u00fc sona ermi\u015ftir. Bu, Canonical&#8217;\u0131n art\u0131k bu i\u015fletim sistemi i\u00e7in g\u00fcvenlik g\u00fcncellemeleri veya hata d\u00fczeltmeleri sa\u011flamad\u0131\u011f\u0131 anlam\u0131na gelir. <strong>\u00dcretim ortamlar\u0131nda Ubuntu 14.04 kullanmak ciddi g\u00fcvenlik riskleri ta\u015f\u0131r ve kesinlikle \u00f6nerilmez.<\/strong> Bu rehber, yaln\u0131zca belirli bir eski sistem gereksinimi olan durumlar i\u00e7in veya e\u011fitim ama\u00e7l\u0131 kullan\u0131lmal\u0131d\u0131r. M\u00fcmk\u00fcnse, daha g\u00fcncel bir Ubuntu LTS s\u00fcr\u00fcm\u00fc (\u00f6rn. 20.04 veya 22.04) kullanmay\u0131 tercih edin. Daha yeni s\u00fcr\u00fcmlerde Node.js kurulumu da genellikle daha kolayd\u0131r.<\/p>\n<h4>G\u00fcvenlik En \u0130yi Uygulamalar\u0131<\/h4>\n<p>*   <strong>SSH Anahtarlar\u0131:<\/strong> SSH \u00f6zel anahtar\u0131n\u0131z\u0131 g\u00fcvende tutun ve asla payla\u015fmay\u0131n.<br \/>\n*   <strong>G\u00fcvenlik Gruplar\u0131:<\/strong> G\u00fcvenlik gruplar\u0131ndaki <code>cidr_blocks<\/code> k\u0131s\u0131tlamalar\u0131n\u0131 <code>0.0.0.0\/0<\/code> yerine yaln\u0131zca bilinen IP adresleriyle (\u00f6rne\u011fin kendi ofis IP&#8217;niz) s\u0131n\u0131rlay\u0131n. Bu, yetkisiz eri\u015fimi engeller.<br \/>\n*   <strong>IAM Rolleri:<\/strong> EC2 instance&#8217;lar\u0131na do\u011frudan eri\u015fim anahtarlar\u0131 yerine IAM rolleri atayarak AWS kaynaklar\u0131na eri\u015fim yetkisi verin.<br \/>\n*   <strong>Gizli Bilgiler:<\/strong> Veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 gibi hassas bilgileri <code>user_data<\/code> script&#8217;inde do\u011frudan saklamay\u0131n. Bunun yerine AWS Secrets Manager veya AWS Systems Manager Parameter Store gibi hizmetleri kullan\u0131n.<\/p>\n<h4>\u00d6l\u00e7eklenebilirlik ve Y\u00fcksek Eri\u015filebilirlik<\/h4>\n<p>Bu rehber tek bir EC2 instance&#8217;\u0131 \u00fczerinde \u00e7al\u0131\u015f\u0131r. \u00dcretim ortamlar\u0131nda daha y\u00fcksek \u00f6l\u00e7eklenebilirlik ve eri\u015filebilirlik i\u00e7in:<\/p>\n<p>*   <strong>Auto Scaling Groups (ASG):<\/strong> Trafik y\u00fck\u00fcne g\u00f6re otomatik olarak EC2 instance&#8217;lar\u0131 ekleyip \u00e7\u0131karmak i\u00e7in ASG&#8217;leri kullan\u0131n.<br \/>\n*   <strong>Load Balancer (ELB\/ALB):<\/strong> Gelen trafi\u011fi birden fazla EC2 instance&#8217;\u0131na da\u011f\u0131tmak i\u00e7in bir Y\u00fck Dengeleyici kullan\u0131n.<br \/>\n*   <strong>\u00c7oklu Kullan\u0131labilirlik B\u00f6lgeleri (Multi-AZ):<\/strong> Uygulaman\u0131z\u0131 birden fazla kullan\u0131labilirlik b\u00f6lgesine da\u011f\u0131tarak tek bir b\u00f6lge hatas\u0131ndan kaynaklanan kesintileri \u00f6nleyin.<\/p>\n<h4>Terraform Durum Y\u00f6netimi (State Management)<\/h4>\n<p>Yerel olarak saklanan <code>terraform.tfstate<\/code> dosyas\u0131, Terraform&#8217;un altyap\u0131n\u0131z\u0131n mevcut durumu hakk\u0131ndaki bilgisini i\u00e7erir. Ekip ortamlar\u0131nda veya \u00fcretimde bu dosyay\u0131 uzak bir depoda (\u00f6rne\u011fin AWS S3 bucket) saklamak ve kilit mekanizmalar\u0131yla (\u00f6rne\u011fin DynamoDB) e\u015fzamanl\u0131 de\u011fi\u015fiklikleri \u00f6nlemek \u00f6nemlidir. Bu, &#8220;remote state&#8221; olarak bilinir.<\/p>\n<pre><code class=\"language-terraform\">terraform {\n  backend \"s3\" {\n    bucket         = \"my-terraform-state-bucket\" # Kendi benzersiz bucket ad\u0131n\u0131z\u0131 girin\n    key            = \"nodejs-app\/terraform.tfstate\"\n    region         = \"eu-central-1\"\n    encrypt        = true\n    dynamodb_table = \"my-terraform-lock-table\" # Opsiyonel, kilit mekanizmas\u0131 i\u00e7in\n  }\n}<\/code><\/pre>\n<h4>Yap\u0131land\u0131rma Y\u00f6netimi<\/h4>\n<p><code>user_data<\/code> script&#8217;leri basit ba\u015flang\u0131\u00e7 g\u00f6revleri i\u00e7in uygundur. Ancak daha karma\u015f\u0131k yap\u0131land\u0131rma, uygulama g\u00fcncellemeleri ve sunucu y\u00f6netimi i\u00e7in Ansible, Chef veya Puppet gibi ayr\u0131 bir yap\u0131land\u0131rma y\u00f6netim arac\u0131 kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu ara\u00e7lar, EC2 instance&#8217;\u0131 ba\u015flat\u0131ld\u0131ktan sonra daha ayr\u0131nt\u0131l\u0131 yap\u0131land\u0131rma ad\u0131mlar\u0131n\u0131 otomatikle\u015ftirebilir.<\/p>\n<h4>\u0130zleme ve G\u00fcnl\u00fckleme<\/h4>\n<p>Uygulaman\u0131z\u0131n ve sunucunuzun sa\u011fl\u0131\u011f\u0131n\u0131 izlemek i\u00e7in AWS CloudWatch gibi hizmetleri kullan\u0131n. Uygulama g\u00fcnl\u00fcklerini merkezi bir g\u00fcnl\u00fckleme sistemine (\u00f6rne\u011fin CloudWatch Logs, ELK Stack) y\u00f6nlendirin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, bir Node.js uygulamas\u0131n\u0131 Terraform kullanarak Ubuntu 14.04 i\u015fletim sistemine sahip bir AWS EC2 instance&#8217;\u0131 \u00fczerine nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele ald\u0131k. VPC&#8217;den EC2 instance&#8217;\u0131na, g\u00fcvenlik grubundan <code>user_data<\/code> script&#8217;ine kadar t\u00fcm altyap\u0131 bile\u015fenlerini kod olarak tan\u0131mlad\u0131k ve otomatik da\u011f\u0131t\u0131m s\u00fcrecini g\u00f6sterdik.<\/p>\n<p>Terraform, altyap\u0131 da\u011f\u0131t\u0131m\u0131n\u0131 tutarl\u0131, tekrarlanabilir ve y\u00f6netilebilir hale getirerek geli\u015ftirme ve operasyon ekipleri i\u00e7in paha bi\u00e7ilmez bir ara\u00e7t\u0131r. Her ne kadar Ubuntu 14.04 gibi eski bir i\u015fletim sistemiyle \u00e7al\u0131\u015fmak belirli zorluklar ve g\u00fcvenlik endi\u015feleri i\u00e7erse de, Terraform&#8217;un g\u00fcc\u00fc sayesinde bu t\u00fcr senaryolar bile otomatize edilebilir.<\/p>\n<p>Bu rehber, temel bir da\u011f\u0131t\u0131m senaryosunu kapsamakla birlikte, \u00fcretim ortamlar\u0131nda dikkate al\u0131nmas\u0131 gereken bir\u00e7ok ek optimizasyon, g\u00fcvenlik \u00f6nlemi ve \u00f6l\u00e7eklenebilirlik stratejisi bulunmaktad\u0131r. Altyap\u0131n\u0131z\u0131 s\u00fcrekli olarak iyile\u015ftirmek ve en iyi uygulamalar\u0131 takip etmek, g\u00fcvenli ve verimli uygulamalar sa\u011flaman\u0131n anahtar\u0131d\u0131r. Unutmay\u0131n, modern uygulamalar i\u00e7in her zaman g\u00fcncel ve desteklenen i\u015fletim sistemlerini tercih etmek en do\u011fru yakla\u015f\u0131md\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi\nG\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, uygulamalar\u0131n h\u0131zl\u0131 ve","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-36381","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, uygulamalar\u0131n h\u0131zl\u0131 ve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-14T21:40:50+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi\",\"datePublished\":\"2025-12-14T21:40:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/\"},\"wordCount\":2552,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/\",\"name\":\"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-14T21:40:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi","og_description":"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, uygulamalar\u0131n h\u0131zl\u0131 ve","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-14T21:40:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi","datePublished":"2025-12-14T21:40:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/"},"wordCount":2552,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/","name":"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-14T21:40:50+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-terraform-ile-ubuntu-14-04-uzerine-dagitma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js Uygulamas\u0131n\u0131 Terraform ile Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36381","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36381"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36381\/revisions"}],"predecessor-version":[{"id":36382,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36381\/revisions\/36382"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36381"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36381"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}