[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:devops-cloud\u002Fterraform-testing-policy-cicd":4,"config":256},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":151,"samples":171},"devops-cloud","DevOps \u002F Cloud","","terraform-testing-policy-cicd","Terraform Testing Policy Cicd","tr",75,3375,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150],{"key":19,"name":20,"count":11},"aws-compute-ec2-lambda","Aws Compute Ec2 Lambda",{"key":22,"name":23,"count":11},"aws-databases-rds-dynamodb","Aws Databases Rds Dynamodb",{"key":25,"name":26,"count":11},"aws-iam-security","Aws Iam Security",{"key":28,"name":29,"count":11},"aws-messaging-eventing","Aws Messaging Eventing",{"key":31,"name":32,"count":11},"aws-networking-vpc","Aws Networking Vpc",{"key":34,"name":35,"count":11},"aws-storage-s3-ebs","Aws Storage S3 Ebs",{"key":37,"name":38,"count":11},"azure-compute-vm-appservice","Azure Compute Vm Appservice",{"key":40,"name":41,"count":11},"azure-databases-sql-cosmosdb","Azure Databases Sql Cosmosdb",{"key":43,"name":44,"count":11},"azure-iam-security","Azure Iam Security",{"key":46,"name":47,"count":11},"azure-messaging-eventing","Azure Messaging Eventing",{"key":49,"name":50,"count":11},"azure-networking-vnet","Azure Networking Vnet",{"key":52,"name":53,"count":11},"azure-storage-blob-managed-disk","Azure Storage Blob Managed Disk",{"key":55,"name":56,"count":11},"ci-cd-pipelines","Ci Cd Pipelines",{"key":58,"name":59,"count":11},"cloud-architecture-scaling","Cloud Architecture Scaling",{"key":61,"name":62,"count":11},"containers-orchestration","Containers Orchestration",{"key":64,"name":65,"count":11},"deployment-release-strategies","Deployment Release Strategies",{"key":67,"name":68,"count":11},"gcp-compute-gce-cloudrun","Gcp Compute Gce Cloudrun",{"key":70,"name":71,"count":11},"gcp-databases-cloudsql-spanner-firestore","Gcp Databases Cloudsql Spanner Firestore",{"key":73,"name":74,"count":11},"gcp-iam-security","Gcp Iam Security",{"key":76,"name":77,"count":11},"gcp-messaging-eventing","Gcp Messaging Eventing",{"key":79,"name":80,"count":11},"gcp-networking-vpc","Gcp Networking Vpc",{"key":82,"name":83,"count":11},"gcp-storage-gcs-persistent-disk","Gcp Storage Gcs Persistent Disk",{"key":85,"name":86,"count":11},"infrastructure-as-code","Infrastructure As Code",{"key":88,"name":89,"count":11},"k8s-config-secrets","K8s Config Secrets",{"key":91,"name":92,"count":11},"k8s-observability-troubleshooting","K8s Observability Troubleshooting",{"key":94,"name":95,"count":11},"k8s-scheduling-resources","K8s Scheduling Resources",{"key":97,"name":98,"count":11},"k8s-services-networking","K8s Services Networking",{"key":100,"name":101,"count":11},"k8s-storage","K8s Storage",{"key":103,"name":104,"count":11},"k8s-workloads","K8s Workloads",{"key":106,"name":107,"count":11},"linux-filesystem-permissions-links","Linux Filesystem Permissions Links",{"key":109,"name":110,"count":11},"linux-networking-tools-troubleshooting","Linux Networking Tools Troubleshooting",{"key":112,"name":113,"count":11},"linux-performance-monitoring-resource-limits","Linux Performance Monitoring Resource Limits",{"key":115,"name":116,"count":11},"linux-process-management-signals","Linux Process Management Signals",{"key":118,"name":119,"count":11},"linux-shell-scripting-ops-automation","Linux Shell Scripting Ops Automation",{"key":121,"name":122,"count":11},"linux-systemd-service-management","Linux Systemd Service Management",{"key":124,"name":125,"count":11},"networking-dns-loadbalancing","Networking Dns Loadbalancing",{"key":127,"name":128,"count":11},"observability-monitoring","Observability Monitoring",{"key":130,"name":131,"count":11},"reliability-incident-sre","Reliability Incident Sre",{"key":133,"name":134,"count":11},"security-iam-secrets","Security Iam Secrets",{"key":136,"name":137,"count":11},"terraform-hcl-language-expressions","Terraform Hcl Language Expressions",{"key":139,"name":140,"count":11},"terraform-modules-workspaces","Terraform Modules Workspaces",{"key":142,"name":143,"count":11},"terraform-plan-apply-drift-import","Terraform Plan Apply Drift Import",{"key":145,"name":146,"count":11},"terraform-providers-lifecycle-provisioners","Terraform Providers Lifecycle Provisioners",{"key":148,"name":149,"count":11},"terraform-state-backend-locking","Terraform State Backend Locking",{"key":8,"name":9,"count":11},[152,156,159,162,165,168],{"key":153,"name":154,"count":155},"aws","AWS",450,{"key":157,"name":158,"count":155},"azure","Azure",{"key":160,"name":161,"count":155},"gcp","GCP",{"key":163,"name":164,"count":155},"kubernetes","Kubernetes",{"key":166,"name":167,"count":155},"linux","Linux",{"key":169,"name":170,"count":155},"terraform","Terraform",[172,190,203,217,230,243],{"id":173,"topic":9,"difficulty":174,"body":175,"options":176,"correct_key":181,"explanation":189},"019f8ebc-ded1-7b8f-84fd-51472079c4e0",1,"`terraform fmt` ne yapar?",[177,180,183,186],{"key":178,"text":179},"a","Yapılandırmayı biçimlendirdikten sonra hedef altyapıya uygular",{"key":181,"text":182},"b","Yapılandırma dosyalarını mantığını değiştirmeden standart bir stile yeniden yazar.",{"key":184,"text":185},"c","Resource argümanlarının gerçek provider attribute'larına referans verdiğini doğrular",{"key":187,"text":188},"d","Provider sürümlerini indirip bir lock dosyasına kilitler","`terraform fmt` yalnızca bir stil aracıdır: .tf dosyalarını standart HCL biçimine (girinti, hizalama, boşluk) yeniden yazar, gerçek mantığa dokunmaz veya doğruluğu kontrol etmez. Apply, validate ve provider kilitleme ayrı komutlardır (`apply`, `validate`, `init`).",{"id":191,"topic":9,"difficulty":174,"body":192,"options":193,"correct_key":184,"explanation":202},"019f8ebc-ded2-7a63-97af-051f9038bfa0","`terraform validate` öncelikle neyi kontrol eder?",[194,196,198,200],{"key":178,"text":195},"Hedef cloud hesabının planlanan resource'ları oluşturacak yeterli kotaya sahip olup olmadığını",{"key":181,"text":197},"Tanımlanan resource'ların zaten var olup olmadığını ve gerçek altyapıyla eşleşip eşleşmediğini",{"key":184,"text":199},"Yapılandırmanın iç sözdizimi ve tutarlılığı.",{"key":187,"text":201},"CI pipeline'ının `terraform apply` çalıştırma iznine sahip olup olmadığını","`terraform validate`, bir sözdizimi ve iç-tutarlılık kontrolü yapar: yapılandırmanın geçerli bir HCL yapısı olduğunu, zorunlu argümanların mevcut olduğunu ve referans verilen değerlerin yapılandırma içinde çözüldüğünü doğrular. Gerçek altyapıyla karşılaştırmak için cloud provider ile konuşmaz — bu `terraform plan`'ın işidir.",{"id":204,"topic":9,"difficulty":205,"body":206,"options":207,"correct_key":178,"explanation":216},"019f8ebc-ded4-784f-a659-a0f71ffb0a32",2,"Bir pipeline, cloud credential'ları hiç yapılandırmadan `terraform validate` çalıştırıyor ve yine de başarılı oluyor. Bu neden mümkün?",[208,210,212,214],{"key":178,"text":209},"Validate yalnızca yapılandırmanın iç yapısını kontrol eder, provider API'sine authenticate olması gerekmez.",{"key":181,"text":211},"Validate, authenticate olamadığı tüm resource'ları sessizce atlar, bazı takımların dayandığı bir bug'dır bu",{"key":184,"text":213},"Validate credential olmadan her zaman başarısız olur, bu senaryo imkânsızdır",{"key":187,"text":215},"Validate otomatik olarak son başarılı plan'ın önbelleğe alınmış bir kopyasına döner","Çünkü `terraform validate` tamamen yerel\u002Fstatik bir kontroldür (tipler, zorunlu argümanlar, iç referanslar), provider API'sine ulaşmasına gerek yoktur. `terraform plan` ve `terraform apply` ise gerçek credential'lara ihtiyaç duyar çünkü yapılandırmayı gerçek uzak state ile karşılaştırırlar.",{"id":218,"topic":9,"difficulty":205,"body":219,"options":220,"correct_key":187,"explanation":229},"019f8ebc-ded6-707d-9c3d-3c955738221f","tflint, CI pipeline'ında sıklıkla `terraform validate` ile birlikte çalıştırılır. tflint, validate'in zaten kontrol ettiğine ek olarak ne katar?",[221,223,225,227],{"key":178,"text":222},"Anlamlı bir şey katmaz — tflint ve validate tam olarak aynı şeyleri kontrol eder, ikisini de çalıştırmak gereksizdir",{"key":181,"text":224},"tflint, gerçek altyapı değişikliklerini simüle edebildiği için `terraform plan` ihtiyacını tamamen ortadan kaldırır",{"key":184,"text":226},"tflint, production'dan önce runtime hatalarını yakalamak için yapılandırmayı bir sandbox hesabına uygular",{"key":187,"text":228},"tflint, genel HCL sözdizimi geçerliliğinin ötesine geçen provider'a özgü en-iyi-uygulama ve doğruluk kontrolleri ekler.","`terraform validate` yalnızca yapılandırmanın yapısal olarak geçerli HCL olduğunu doğrular. tflint ise çekirdek kuralları ve provider'a özgü plugin'leri (ör. AWS için) aracılığıyla, sözdizimsel olarak sorunsuz ama anlamsal olarak yanlış olan deprecated syntax, kullanılmayan tanımlar veya geçersiz provider'a özgü değerler gibi sorunları ek olarak işaretler.",{"id":231,"topic":9,"difficulty":174,"body":232,"options":233,"correct_key":181,"explanation":242},"019f8ebc-ded7-7a7b-a4e2-d849e176c1cf","Bir Terraform pipeline'ında 'policy as code' fikrinin genel mantığı nedir?",[234,236,238,240],{"key":178,"text":235},"Altyapı politikaları hakkında iç dokümantasyonu pipeline'dan ayrı bir wiki'de yazmak",{"key":181,"text":237},"Kurumsal kuralları, pipeline'ın bir plan'a karşı otomatik değerlendirdiği makine tarafından kontrol edilebilir kurallar olarak ifade etmek.",{"key":184,"text":239},"Her apply'dan önce her plan çıktısını otomasyon olmadan satır satır manuel olarak incelemek",{"key":187,"text":241},"`terraform validate`'in yerini tamamen almak, çünkü policy araçları da HCL sözdizimini kontrol eder","Policy as code, kurumsal veya uyumluluk kurallarının (ör. Sentinel veya OPA ile) çalıştırılabilir kurallar olarak yazılması ve bir pipeline'ın bunları bir plan'a karşı otomatik olarak çalıştırması demektir, böylece ihlaller (ör. herkese açık bir resource) bir insanın kontrol etmeyi hatırlamasına bağlı kalmadan tutarlı ve otomatik biçimde yakalanır.",{"id":244,"topic":9,"difficulty":205,"body":245,"options":246,"correct_key":184,"explanation":255},"019f8ebc-deda-7255-b19e-1afc67299de4","Merge etmeden önce bir pull-request kontrolünün parçası olarak `terraform plan` çalıştırıp çıktısını bir PR yorumu olarak paylaşmak neden yaygın bir uygulamadır?",[247,249,251,253],{"key":178,"text":248},"Çünkü `terraform plan` gerçek altyapıyı değiştirir, bu yüzden zaman kazanmak için merge'den önce yapılmalıdır",{"key":181,"text":250},"Çünkü plan'ı paylaşmak Terraform'un kendisi tarafından zorunlu kılınır; CLI aksi halde apply'ı reddeder",{"key":184,"text":252},"Böylece reviewer'lar, bir PR'ın altyapı etkisini merge'i onaylamadan önce görebilir.",{"key":187,"text":254},"Çünkü `terraform plan`, HCL sözdizimi hatalarını yakalayabilen tek komuttur","Plan çıktısını PR'da paylaşmak, reviewer'lara bir değişikliğin somut altyapı etkisini (ne oluşturulacak, değiştirilecek veya yok edilecek) normal kod review akışının bir parçası olarak görünürlük sağlar, istenmeyen değişiklikleri merge edilip sonradan apply edilmeden önce yakalar.",{"fields":257,"seniorities":429,"interview_shapes":430,"locales":435,"oauth":437,"question_count":440,"coach_enabled":441,"jd_match_enabled":441},[258,283,303,320,330,343,362,381,403,410,416,423],{"key":259,"name_tr":260,"name_en":260,"sort":174,"specializations":261},"backend","Backend",[262,265,268,271,274,277,280],{"key":263,"name":264,"field":259},"general","Genel",{"key":266,"name":267,"field":259},"go","Go",{"key":269,"name":270,"field":259},"python","Python",{"key":272,"name":273,"field":259},"java","Java",{"key":275,"name":276,"field":259},"csharp","C#\u002F.NET",{"key":278,"name":279,"field":259},"nodejs","Node.js",{"key":281,"name":282,"field":259},"php","PHP",{"key":284,"name_tr":285,"name_en":285,"sort":205,"specializations":286},"frontend","Frontend",[287,288,291,294,297,300],{"key":263,"name":264,"field":284},{"key":289,"name":290,"field":284},"javascript","JavaScript",{"key":292,"name":293,"field":284},"typescript","TypeScript",{"key":295,"name":296,"field":284},"react","React",{"key":298,"name":299,"field":284},"vue","Vue",{"key":301,"name":302,"field":284},"angular","Angular",{"key":304,"name_tr":305,"name_en":305,"sort":306,"specializations":307},"fullstack","Fullstack",3,[308,309,310,311,312,313,314,315,316,317,318,319],{"key":263,"name":264,"field":304},{"key":266,"name":267,"field":259},{"key":269,"name":270,"field":259},{"key":272,"name":273,"field":259},{"key":275,"name":276,"field":259},{"key":278,"name":279,"field":259},{"key":281,"name":282,"field":259},{"key":289,"name":290,"field":284},{"key":292,"name":293,"field":284},{"key":295,"name":296,"field":284},{"key":298,"name":299,"field":284},{"key":301,"name":302,"field":284},{"key":5,"name_tr":6,"name_en":6,"sort":321,"specializations":322},4,[323,324,325,326,327,328,329],{"key":263,"name":264,"field":5},{"key":153,"name":154,"field":5},{"key":160,"name":161,"field":5},{"key":157,"name":158,"field":5},{"key":163,"name":164,"field":5},{"key":169,"name":170,"field":5},{"key":166,"name":167,"field":5},{"key":331,"name_tr":332,"name_en":332,"sort":333,"specializations":334},"ai-engineer","AI Engineer",5,[335,336,337,340],{"key":263,"name":264,"field":331},{"key":269,"name":270,"field":331},{"key":338,"name":339,"field":331},"llm-rag","LLM\u002FRAG",{"key":341,"name":342,"field":331},"mlops","MLOps",{"key":344,"name_tr":345,"name_en":346,"sort":347,"specializations":348},"database","Veritabanı","Database",6,[349,350,353,356,359],{"key":263,"name":264,"field":344},{"key":351,"name":352,"field":344},"postgresql","PostgreSQL",{"key":354,"name":355,"field":344},"mysql","MySQL",{"key":357,"name":358,"field":344},"mongodb","MongoDB",{"key":360,"name":361,"field":344},"redis","Redis",{"key":363,"name_tr":364,"name_en":365,"sort":366,"specializations":367},"mobile","Mobil","Mobile",7,[368,369,372,375,378],{"key":263,"name":264,"field":363},{"key":370,"name":371,"field":363},"ios-swift","iOS (Swift)",{"key":373,"name":374,"field":363},"android-kotlin","Android (Kotlin)",{"key":376,"name":377,"field":363},"flutter","Flutter",{"key":379,"name":380,"field":363},"react-native","React Native",{"key":382,"name_tr":383,"name_en":384,"sort":385,"specializations":386},"security","Güvenlik","Security",8,[387,388,391,394,397,400],{"key":263,"name":264,"field":382},{"key":389,"name":390,"field":382},"appsec","AppSec",{"key":392,"name":393,"field":382},"offensive-pentest","Offensive \u002F Pentest",{"key":395,"name":396,"field":382},"cloud-security","Cloud Security",{"key":398,"name":399,"field":382},"devsecops","DevSecOps",{"key":401,"name":402,"field":382},"blue-team-incident","Blue Team \u002F Incident",{"key":404,"name_tr":405,"name_en":406,"sort":407,"specializations":408},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[409],{"key":263,"name":264,"field":404},{"key":411,"name_tr":412,"name_en":412,"sort":413,"specializations":414},"data-engineer","Data Engineer",10,[415],{"key":263,"name":264,"field":411},{"key":417,"name_tr":418,"name_en":419,"sort":420,"specializations":421},"game-dev","Oyun Geliştirme","Game Development",11,[422],{"key":263,"name":264,"field":417},{"key":424,"name_tr":425,"name_en":425,"sort":426,"specializations":427},"ml-engineer","ML Engineer",12,[428],{"key":263,"name":264,"field":424},[14,15,16],{"junior":431,"mid":433,"senior":434},{"questions":432,"median_sec":3},20,{"questions":432,"median_sec":3},{"questions":432,"median_sec":3},[10,436],"en",[438,439],"google","github",21750,true]