<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Citadel Cloud Management</title>
    <description>The latest articles on DEV Community by Citadel Cloud Management (@citadel_cloudmanagement_).</description>
    <link>https://dev.to/citadel_cloudmanagement_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3886536%2F3de4898c-d155-4468-a139-59d2ec084f6b.jpg</url>
      <title>DEV Community: Citadel Cloud Management</title>
      <link>https://dev.to/citadel_cloudmanagement_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/citadel_cloudmanagement_"/>
    <language>en</language>
    <item>
      <title>Why Your Kubernetes Cluster is Costing 3x Too Much (And How to Fix It)</title>
      <dc:creator>Citadel Cloud Management</dc:creator>
      <pubDate>Sat, 18 Apr 2026 23:33:49 +0000</pubDate>
      <link>https://dev.to/citadel_cloudmanagement_/why-your-kubernetes-cluster-is-costing-3x-too-much-and-how-to-fix-it-3dg3</link>
      <guid>https://dev.to/citadel_cloudmanagement_/why-your-kubernetes-cluster-is-costing-3x-too-much-and-how-to-fix-it-3dg3</guid>
      <description>&lt;p&gt;After auditing Kubernetes costs at 12 companies last year, I found the same 5 problems everywhere. The average cluster was spending 3x what it should.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 1: Missing Resource Requests (saves 30-40%)
&lt;/h2&gt;

&lt;p&gt;Most pods run without resource requests. Kubernetes can't bin-pack efficiently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# BAD: No limits = every pod gets a whole node's worth of resources reserved&lt;/span&gt;
&lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp:latest&lt;/span&gt;

&lt;span class="c1"&gt;# GOOD: Right-sized limits&lt;/span&gt;
&lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp:latest&lt;/span&gt;
    &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;250m&lt;/span&gt;
        &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;256Mi&lt;/span&gt;
      &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;500m&lt;/span&gt;
        &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512Mi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to find right-size values:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl top pods &lt;span class="nt"&gt;--all-namespaces&lt;/span&gt; &lt;span class="nt"&gt;--sort-by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;memory | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Problem 2: Wrong Instance Types (saves 20-30%)
&lt;/h2&gt;

&lt;p&gt;Everyone defaults to m5.xlarge. But most workloads are memory-bound, not CPU-bound:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API servers&lt;/strong&gt;: r6i (memory optimized) — 15% cheaper for same workload&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch jobs&lt;/strong&gt;: Spot instances — 60-70% cheaper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev/staging&lt;/strong&gt;: t3 burstable — 40% cheaper&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Problem 3: No Pod Disruption Budgets (causes overspend)
&lt;/h2&gt;

&lt;p&gt;Without PDBs, autoscaler can't safely remove nodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;policy/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PodDisruptionBudget&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-pdb&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;minAvailable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Problem 4: Orphaned PVCs (hidden cost)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find PVCs not bound to any pod&lt;/span&gt;
kubectl get pvc &lt;span class="nt"&gt;--all-namespaces&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="s1"&gt;'.items[] | select(.status.phase=="Bound") | select(.metadata.deletionTimestamp==null) | .metadata.name'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At $0.10/GB/month for gp3, a forgotten 100GB PVC costs $10/month doing nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 5: No Cost Allocation Tags
&lt;/h2&gt;

&lt;p&gt;Without tags, you can't track which team/service is spending what:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Tag all namespaces with cost center&lt;/span&gt;
kubectl label namespace production cost-center&lt;span class="o"&gt;=&lt;/span&gt;engineering
kubectl label namespace staging cost-center&lt;span class="o"&gt;=&lt;/span&gt;engineering-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Full K8s Cost Optimization Guide
&lt;/h2&gt;

&lt;p&gt;I maintain production-ready DevOps resources including K8s cost optimization playbooks at &lt;a href="https://www.citadelcloudmanagement.com/collections/devops-pipelines" rel="noopener noreferrer"&gt;Citadel Cloud Management&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;17 free cloud courses including Kubernetes: &lt;a href="https://www.citadelcloudmanagement.com/pages/free-courses" rel="noopener noreferrer"&gt;Free Courses&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's your biggest K8s cost challenge?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From Zero to AWS Solutions Architect: A 90-Day Plan That Actually Works</title>
      <dc:creator>Citadel Cloud Management</dc:creator>
      <pubDate>Sat, 18 Apr 2026 23:32:17 +0000</pubDate>
      <link>https://dev.to/citadel_cloudmanagement_/from-zero-to-aws-solutions-architect-a-90-day-plan-that-actually-works-243i</link>
      <guid>https://dev.to/citadel_cloudmanagement_/from-zero-to-aws-solutions-architect-a-90-day-plan-that-actually-works-243i</guid>
      <description>&lt;p&gt;I passed the AWS Solutions Architect Associate exam on my first attempt after 90 days of focused study while working full-time. Here's the exact plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework: 3 Phases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Foundations (Days 1-30)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Week 1-2: Core Services&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2, S3, VPC, IAM — understand these cold&lt;/li&gt;
&lt;li&gt;Create a VPC from scratch with public/private subnets&lt;/li&gt;
&lt;li&gt;Set up an EC2 instance with proper security groups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 3-4: Networking &amp;amp; Storage&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route 53, CloudFront, ELB/ALB&lt;/li&gt;
&lt;li&gt;EBS vs EFS vs S3 — know when to use each&lt;/li&gt;
&lt;li&gt;Build a static website with S3 + CloudFront + Route 53&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Daily routine:&lt;/strong&gt; 1 hour study + 30 min hands-on lab&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Architecture Patterns (Days 31-60)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Week 5-6: High Availability&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-AZ deployments&lt;/li&gt;
&lt;li&gt;Auto Scaling groups&lt;/li&gt;
&lt;li&gt;RDS Multi-AZ vs Read Replicas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 7-8: Serverless &amp;amp; Decoupling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda + API Gateway&lt;/li&gt;
&lt;li&gt;SQS, SNS, EventBridge&lt;/li&gt;
&lt;li&gt;Step Functions for orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Daily routine:&lt;/strong&gt; 1 hour study + 1 hour practice exams&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Exam Prep (Days 61-90)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Week 9-10: Practice Exams&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take 3 full practice exams (Tutorials Dojo recommended)&lt;/li&gt;
&lt;li&gt;Score below 75%? Go back to weak areas&lt;/li&gt;
&lt;li&gt;Review every wrong answer — understand WHY&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 11-12: Final Push&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focus on your 3 weakest domains&lt;/li&gt;
&lt;li&gt;Take 2 more practice exams&lt;/li&gt;
&lt;li&gt;Score 80%+ consistently? You're ready&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5 Mistakes That Fail Candidates
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Studying theory without labs&lt;/strong&gt; — you need hands-on&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring the Well-Architected Framework&lt;/strong&gt; — it's 30% of the exam&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping networking&lt;/strong&gt; — VPC questions are the most common trap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only using one study resource&lt;/strong&gt; — combine video + reading + practice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not timing practice exams&lt;/strong&gt; — 65 questions in 130 minutes is tight&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resources I Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Cloud Guru (video course)&lt;/li&gt;
&lt;li&gt;Tutorials Dojo (practice exams — essential)&lt;/li&gt;
&lt;li&gt;AWS Free Tier (hands-on labs)&lt;/li&gt;
&lt;li&gt;AWS Well-Architected Framework whitepaper&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free Cloud Courses
&lt;/h2&gt;

&lt;p&gt;We offer 17 free cloud courses covering AWS, Azure, GCP, Kubernetes, Terraform, and more. No login required, no credit card: &lt;a href="https://www.citadelcloudmanagement.com/pages/free-courses" rel="noopener noreferrer"&gt;Free Courses&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For production-ready architecture blueprints and study materials: &lt;a href="https://www.citadelcloudmanagement.com/collections/architecture-blueprints" rel="noopener noreferrer"&gt;Architecture Blueprints&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's your AWS certification journey been like?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Cloud Security Checklist I Use at Every Enterprise Engagement</title>
      <dc:creator>Citadel Cloud Management</dc:creator>
      <pubDate>Sat, 18 Apr 2026 20:23:38 +0000</pubDate>
      <link>https://dev.to/citadel_cloudmanagement_/the-cloud-security-checklist-i-use-at-every-enterprise-engagement-6lj</link>
      <guid>https://dev.to/citadel_cloudmanagement_/the-cloud-security-checklist-i-use-at-every-enterprise-engagement-6lj</guid>
      <description>&lt;p&gt;After securing infrastructure at healthcare companies, defense contractors, and energy firms, I've distilled my cloud security review into 27 checks across 6 domains. Here's the checklist I run on Day 1 of every engagement.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Identity &amp;amp; Access (6 checks)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check root account MFA&lt;/span&gt;
aws iam get-account-summary | &lt;span class="nb"&gt;grep &lt;/span&gt;AccountMFAEnabled

&lt;span class="c"&gt;# Find users without MFA&lt;/span&gt;
aws iam generate-credential-report
aws iam get-credential-report &lt;span class="nt"&gt;--output&lt;/span&gt; text | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;, &lt;span class="s1"&gt;'$4=="false" {print $1}'&lt;/span&gt;

&lt;span class="c"&gt;# Find overprivileged roles&lt;/span&gt;
aws iam list-policies &lt;span class="nt"&gt;--only-attached&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Policies[?PolicyName==`AdministratorAccess`]'&lt;/span&gt;

&lt;span class="c"&gt;# Check for access keys older than 90 days&lt;/span&gt;
aws iam list-access-keys &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'AccessKeyMetadata[?CreateDate&amp;lt;`2026-01-18`]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Network Security (5 checks)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Security groups with 0.0.0.0/0 on SSH&lt;/span&gt;
aws ec2 describe-security-groups &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ip-permission.from-port,Values&lt;span class="o"&gt;=&lt;/span&gt;22 &lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ip-permission.cidr,Values&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0/0

&lt;span class="c"&gt;# Check for public subnets without NAT&lt;/span&gt;
aws ec2 describe-route-tables &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'RouteTables[*].Routes[?GatewayId!=`local`]'&lt;/span&gt;

&lt;span class="c"&gt;# VPC Flow Logs enabled?&lt;/span&gt;
aws ec2 describe-flow-logs &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'FlowLogs[*].{VPC:ResourceId,Status:FlowLogStatus}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Data Protection (5 checks)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# S3 buckets without encryption&lt;/span&gt;
aws s3api list-buckets &lt;span class="nt"&gt;--query&lt;/span&gt; Buckets[].Name &lt;span class="nt"&gt;--output&lt;/span&gt; text | xargs &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; aws s3api get-bucket-encryption &lt;span class="nt"&gt;--bucket&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; 2&amp;gt;&amp;amp;1

&lt;span class="c"&gt;# Public S3 buckets&lt;/span&gt;
aws s3api list-buckets &lt;span class="nt"&gt;--query&lt;/span&gt; Buckets[].Name &lt;span class="nt"&gt;--output&lt;/span&gt; text | xargs &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; aws s3api get-public-access-block &lt;span class="nt"&gt;--bucket&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;# EBS volumes without encryption&lt;/span&gt;
aws ec2 describe-volumes &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Volumes[?!Encrypted].VolumeId'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Detection &amp;amp; Monitoring (4 checks)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CloudTrail enabled in all regions&lt;/li&gt;
&lt;li&gt;GuardDuty active&lt;/li&gt;
&lt;li&gt;Config rules recording&lt;/li&gt;
&lt;li&gt;CloudWatch alarms on root login&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Incident Response (4 checks)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Runbooks documented&lt;/li&gt;
&lt;li&gt;Automated containment playbooks&lt;/li&gt;
&lt;li&gt;Contact escalation matrix&lt;/li&gt;
&lt;li&gt;Regular tabletop exercises&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Supply Chain Security (3 checks)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Container image scanning (Trivy/Snyk)&lt;/li&gt;
&lt;li&gt;Dependency vulnerability scanning&lt;/li&gt;
&lt;li&gt;SBOM generation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Full Security Framework
&lt;/h2&gt;

&lt;p&gt;I maintain a complete collection of cybersecurity frameworks with implementation checklists, compliance templates, and detection rule sets at &lt;a href="https://www.citadelcloudmanagement.com/collections/cybersecurity-frameworks" rel="noopener noreferrer"&gt;Citadel Cloud Management&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;17 free cloud courses including Cloud Security: &lt;a href="https://www.citadelcloudmanagement.com/pages/free-courses" rel="noopener noreferrer"&gt;Free Courses&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What does your Day 1 security checklist look like?&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>infosec</category>
      <category>security</category>
    </item>
    <item>
      <title>5 Terraform Patterns Every Cloud Architect Should Know in 2026</title>
      <dc:creator>Citadel Cloud Management</dc:creator>
      <pubDate>Sat, 18 Apr 2026 20:22:32 +0000</pubDate>
      <link>https://dev.to/citadel_cloudmanagement_/5-terraform-patterns-every-cloud-architect-should-know-in-2026-5b0k</link>
      <guid>https://dev.to/citadel_cloudmanagement_/5-terraform-patterns-every-cloud-architect-should-know-in-2026-5b0k</guid>
      <description>&lt;p&gt;Terraform has evolved significantly. If you're still writing Terraform the same way you did in 2023, you're leaving performance, safety, and maintainability on the table.&lt;/p&gt;

&lt;p&gt;Here are 5 patterns I use on every engagement — from healthcare systems to defense contractors.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Provider-Defined Functions (Terraform 1.8+)
&lt;/h2&gt;

&lt;p&gt;Stop writing complex &lt;code&gt;locals&lt;/code&gt; blocks to transform data. Provider functions handle it natively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before: messy regex in locals&lt;/span&gt;
&lt;span class="nx"&gt;locals&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;account_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::(&lt;/span&gt;&lt;span class="err"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;d+):"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_caller_identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# After: provider function&lt;/span&gt;
&lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"account_id"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="err"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="err"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;arn_parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_caller_identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;account_id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Ephemeral Resources for Secrets
&lt;/h2&gt;

&lt;p&gt;Never store secrets in state again. Ephemeral resources exist only during the plan/apply cycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;ephemeral&lt;/span&gt; &lt;span class="s2"&gt;"aws_secretsmanager_secret_version"&lt;/span&gt; &lt;span class="s2"&gt;"db_password"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;secret_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_secretsmanager_secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_db_instance"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ephemeral&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_secretsmanager_secret_version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db_password&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;secret_string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The password never touches your state file.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The &lt;code&gt;moved&lt;/code&gt; Block for Safe Refactoring
&lt;/h2&gt;

&lt;p&gt;Renaming resources used to mean destroy + recreate. The &lt;code&gt;moved&lt;/code&gt; block handles it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;moved&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;from&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web_server&lt;/span&gt;
  &lt;span class="nx"&gt;to&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;application_server&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero downtime refactoring. I use this every time I restructure modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Native &lt;code&gt;terraform test&lt;/code&gt; (1.6+)
&lt;/h2&gt;

&lt;p&gt;Stop relying solely on &lt;code&gt;terraform plan&lt;/code&gt; to validate. Write actual tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# tests/vpc.tftest.hcl&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"vpc_creates_successfully"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;apply&lt;/span&gt;

  &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;condition&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cidr_block&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;
    &lt;span class="nx"&gt;error_message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"VPC CIDR block is incorrect"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Stacks for Multi-Environment Orchestration
&lt;/h2&gt;

&lt;p&gt;Terraform Stacks manage multiple configurations as a single unit — dev, staging, prod deployed together with dependency ordering.&lt;/p&gt;

&lt;p&gt;This replaces the old pattern of separate &lt;code&gt;terraform apply&lt;/code&gt; commands per environment with Terragrunt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Want More?
&lt;/h2&gt;

&lt;p&gt;I maintain a collection of 40+ production-ready DevOps pipeline resources — including Terraform module libraries, CI/CD templates, and IaC governance frameworks — at &lt;a href="https://www.citadelcloudmanagement.com/collections/devops-pipelines" rel="noopener noreferrer"&gt;Citadel Cloud Management&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We also have 17 completely free cloud courses (no login, no paywall): &lt;a href="https://www.citadelcloudmanagement.com/pages/free-courses" rel="noopener noreferrer"&gt;Free Courses&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which of these patterns are you already using? Drop a comment below.&lt;/p&gt;

</description>
      <category>terraform</category>
    </item>
  </channel>
</rss>
