<?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: Henry Niama </title>
    <description>The latest articles on DEV Community by Henry Niama  (@hsniama).</description>
    <link>https://dev.to/hsniama</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%2F3802105%2Fbcae8ae6-a4a9-49f5-96d3-60f0c7366cd1.jpeg</url>
      <title>DEV Community: Henry Niama </title>
      <link>https://dev.to/hsniama</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hsniama"/>
    <language>en</language>
    <item>
      <title>I built the AWS platform that every DevOps engineer would want to have</title>
      <dc:creator>Henry Niama </dc:creator>
      <pubDate>Wed, 04 Mar 2026 20:07:32 +0000</pubDate>
      <link>https://dev.to/hsniama/i-built-the-aws-platform-that-every-devops-engineer-would-want-to-have-11fl</link>
      <guid>https://dev.to/hsniama/i-built-the-aws-platform-that-every-devops-engineer-would-want-to-have-11fl</guid>
      <description>&lt;h2&gt;
  
  
  The Discovery
&lt;/h2&gt;

&lt;p&gt;A few months ago, while talking with a DevOps Engineer friend, he shared one of his frustrations:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"In some of the companies and projects I've worked on, I've had to build all the infrastructure: VPCs, subnets, EKS... plus set up the deployment pipeline, both for the platform and the microservice. But as a DevOps Engineer, what I really want is to focus on deploying the microservice. My dream would be to simply run kubectl apply... and have everything work.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;That's when it became clear: the DevOps Engineer ends up fighting with VPCs and subnets when they should really be focusing on automating application deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That reflection changed everything.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Missing Separation of Responsibilities
&lt;/h2&gt;

&lt;p&gt;This project was born precisely to solve that clash of responsibilities.&lt;/p&gt;

&lt;p&gt;We assume the role of &lt;strong&gt;Cloud/Platform Engineer&lt;/strong&gt; and build the base infrastructure shell so that the DevOps/App Delivery team can then deploy applications on an already prepared platform.&lt;/p&gt;

&lt;p&gt;In our approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud/Platform Engineering (this repository)&lt;/strong&gt; builds the foundation: network, infrastructure, identity, remote state, cluster, registry, and infrastructure pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps/App Delivery (application repository, later)&lt;/strong&gt; consumes outputs from this foundation to deploy microservices with speed and less risk.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not bureaucracy. It's organizational and technical design for scaling. As a &lt;strong&gt;Cloud/Platform Engineer&lt;/strong&gt;, my job isn't for every DevOps Engineer to recreate infrastructure. My job is to &lt;strong&gt;build the platform once&lt;/strong&gt; and have them consume it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuydh55nx19my656q0g8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuydh55nx19my656q0g8.png" alt="Roles diff" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I decided to materialize this vision in a real project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A complete, reusable, and open source AWS platform.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdn6ee9clbnomjdjqavac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdn6ee9clbnomjdjqavac.png" alt="AWS Architecture" width="800" height="558"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;See full diagram on&lt;/em&gt; &lt;a href="https://github.com/hsniama/infra-devops-aws/blob/dev/henry/assets/diagrams/aws/aws_infrastructure_diagram.png" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, we take responsibility for preparing the complete infrastructure shell so that a DevOps/App team can then focus on deploying product, not fighting with base infrastructure.&lt;/p&gt;

&lt;p&gt;Specifically, we leave ready:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS networks separated by environment (&lt;code&gt;test&lt;/code&gt; and &lt;code&gt;prod&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;EKS clusters per environment.&lt;/li&gt;
&lt;li&gt;ECR repositories per environment for images.&lt;/li&gt;
&lt;li&gt;Secure authentication via OIDC in GitHub Actions.&lt;/li&gt;
&lt;li&gt;Terraform remote state with locking.&lt;/li&gt;
&lt;li&gt;Infrastructure CI/CD with clear rules per environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're not trying to "do everything in one repo". We're trying to collaborate better: platform on one side, applications on the other, with a clear contract between both.&lt;/p&gt;
&lt;h2&gt;
  
  
  Technologies we use to build this foundation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS&lt;/strong&gt;: VPC, EKS, ECR, IAM, S3, DynamoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terraform&lt;/strong&gt;: to build AWS resources with reusable modules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt;: to run the infrastructure pipeline per environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OIDC&lt;/strong&gt;: Federated authentication without static Access Keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EKS Access Entries&lt;/strong&gt;: to control who enters the cluster without relying only on manual configurations&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  The 4 Pillars That Make the Difference
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Environment Separation (For Real)
&lt;/h3&gt;

&lt;p&gt;Most say "we have TEST and PROD separated" but they share a VPC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I went further:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TEST&lt;/strong&gt; → VPC &lt;code&gt;10.110.0.0/16&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PROD&lt;/strong&gt; → VPC &lt;code&gt;10.111.0.0/16&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcshg89c8v5blfz74jwjd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcshg89c8v5blfz74jwjd.png" alt="VPCs" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Completely independent&lt;/strong&gt; Terraform states per environment and separate variables per tfvars.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagd9j7mprx2fd9ypdcl3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagd9j7mprx2fd9ypdcl3.png" alt="Terraform States" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The pipeline dynamically selects backend and variables based on the branch, avoiding collisions between environments and &lt;strong&gt;zero shared resources&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jq48r0jx0lbigbtiv73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jq48r0jx0lbigbtiv73.png" alt="Pipeline" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because on a Friday at 6 PM, someone is going to make a change in TEST. And if they share resources, PROD goes down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With this separation, I can destroy/modify TEST without fear.&lt;/strong&gt; That peace of mind is priceless.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. OIDC: The Security Innovation That Changes Everything
&lt;/h3&gt;

&lt;p&gt;Here's the gem of the project. &lt;br&gt;
&lt;strong&gt;The problem everyone has:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS credentials stored in &lt;strong&gt;GitHub Secrets&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Example: 

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AWS_ACCESS_KEY_ID: AKIAXXXXX&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AWS_SECRET_ACCESS_KEY: xxxxx&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If someone commits those keys; it's a &lt;strong&gt;disaster&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My solution: OIDC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir0agcmskthbjb3ux49k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir0agcmskthbjb3ux49k.png" alt="OIDC-Flow" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No static keys in GitHub.&lt;/p&gt;

&lt;p&gt;This directly improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operational security.&lt;/li&gt;
&lt;li&gt;Credential expiration.&lt;/li&gt;
&lt;li&gt;Control via trust policy.&lt;/li&gt;
&lt;li&gt;Reduced attack surface.&lt;/li&gt;
&lt;li&gt;Zero permanent credentials: &lt;strong&gt;Zero risk&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the best part: the Trust Policy ensures that &lt;strong&gt;only my repository&lt;/strong&gt; can assume the role.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Outputs: The Bridge Between Platform and Applications
&lt;/h3&gt;

&lt;p&gt;This is where the separation of roles comes to life.&lt;br&gt;
The platform doesn't deliver "raw infrastructure", but ready-to-use outputs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECR_URL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;123456.dkr.ecr.us-east-1.amazonaws.com/app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EKS_CLUSTER&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;eksdevops1720testXX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EKS_ENDPOINT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://XXXXX.eks.amazonaws.com" rel="noopener noreferrer"&gt;https://XXXXX.eks.amazonaws.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;REGION&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;us-east-1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8k7ubu95tcnbokxpyf2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8k7ubu95tcnbokxpyf2b.png" alt="Outputs" width="800" height="508"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;See Outputs on&lt;/em&gt; &lt;a href="https://github.com/hsniama/infra-devops-aws/actions/runs/22232310474/job/64315042012" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How the DevOps Engineer consumes them in their repo (pipeline):&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;# Pipeline that leverages platform outputs&lt;/span&gt;
&lt;span class="s"&gt;docker push $ECR_URL/mi-app:latest&lt;/span&gt;
&lt;span class="s"&gt;aws eks update-kubeconfig --name $EKS_CLUSTER&lt;/span&gt;
&lt;span class="s"&gt;kubectl apply -f k8s/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Direct console example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws eks update-kubeconfig &lt;span class="nt"&gt;--name&lt;/span&gt; eksdevops1720testXX
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; deployment.yaml
&lt;span class="c"&gt;# and it works... No additional configuration.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;That's it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The DevOps Engineer,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Doesn't need to deeply understand how the VPC is configured.
&lt;/li&gt;
&lt;li&gt;Doesn't need to fully understand route tables.
&lt;/li&gt;
&lt;li&gt;Doesn't need to be an expert in EKS cluster setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;They only need to deploy their application&lt;/strong&gt; on the previously deployed platform.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Intelligent Pipeline: Fast in TEST, Safe in PROD
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8nsnhlyf2chgp0hdec0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8nsnhlyf2chgp0hdec0.png" alt="Ci-Cd" width="800" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I designed the pipeline thinking about &lt;strong&gt;speed vs control&lt;/strong&gt;: &lt;br&gt;
&lt;strong&gt;TEST (Speed)&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git push origin dev/**&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Terraform deploys automatically. &lt;/li&gt;
&lt;li&gt;No approvals. &lt;/li&gt;
&lt;li&gt;Feedback in ~15 minutes. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PROD (Control)&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull Request to &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Terraform plan (team review). &lt;/li&gt;
&lt;li&gt;Mandatory manual approval - Merge → deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's innovative:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OIDC authentication (no keys).&lt;/li&gt;
&lt;li&gt;Remote state with locking (no conflicts).&lt;/li&gt;
&lt;li&gt;Saved artifacts (easy rollback).&lt;/li&gt;
&lt;li&gt;Approvals only where they matter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This enables clean deployments with valuable artifacts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhppaul3q6dw8dozfni52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhppaul3q6dw8dozfni52.png" alt="Pipeline" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Cluster Access: EKS Access Entries
&lt;/h2&gt;

&lt;p&gt;AWS launched something revolutionary: &lt;strong&gt;Access Entries&lt;/strong&gt;. Instead of manually editing ConfigMaps, you can now define Cluster access directly in Terraform:&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;eks_access_entries&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;platform_engineer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;principal_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:iam::123456:user/henry"&lt;/span&gt;
    &lt;span class="nx"&gt;policies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;admin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AmazonEKSClusterAdminPolicy"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;devops_team&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;principal_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:iam::123456:role/gh-oidc-role"&lt;/span&gt;
    &lt;span class="nx"&gt;policies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;deploy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AmazonEKSClusterAdminPolicy"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&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;p&gt;&lt;strong&gt;What changes with Access Entries?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AWS-managed&lt;/strong&gt; - No more manual ConfigMaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native IAM integration&lt;/strong&gt; - Roles and users directly in AWS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic validation&lt;/strong&gt; - Terraform validates before applying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete audit&lt;/strong&gt; - CloudTrail logs every action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What it means in practice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a DevOps Engineer needs cluster access, I simply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add their IAM role in Terraform (in our case, in the module).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;terraform apply&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Done: They have immediate cluster access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EKS Clusters:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tx2yvotentiyuvmpxaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tx2yvotentiyuvmpxaj.png" alt=" " width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cluster Access (as DevOps Engineer):&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1rmcb57grncl7n4ed6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1rmcb57grncl7n4ed6a.png" alt=" " width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;List of configured EKS Access Entries (example):&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw3bkz3o6zfv8pwvahli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw3bkz3o6zfv8pwvahli.png" alt=" " width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what we implemented in the project. Where the separation of responsibilities comes into action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I as Cloud/Platform Engineer manage WHO has access.&lt;/li&gt;
&lt;li&gt;They use that access to deploy.&lt;/li&gt;
&lt;li&gt;Nobody touches ConfigMaps without risk of breaking anything.&lt;/li&gt;
&lt;li&gt;Everything versioned in Git.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real Scope of This Project
&lt;/h2&gt;

&lt;p&gt;This repository doesn't deploy microservices directly. Its purpose is to &lt;strong&gt;build the solid foundation&lt;/strong&gt; for that to happen well later.&lt;/p&gt;

&lt;p&gt;It also doesn't include yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;complete workload observability,&lt;/li&gt;
&lt;li&gt;app ingress/controller,&lt;/li&gt;
&lt;li&gt;application layer autoscaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defines networks, clusters, repositories (ECR), and infrastructure pipeline.&lt;/li&gt;
&lt;li&gt;Publishes ready-to-use outputs for other repos to deploy applications.&lt;/li&gt;
&lt;li&gt;Establishes modern security (OIDC, temporary IAM roles).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it doesn't include (by design):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete workload observability&lt;/li&gt;
&lt;li&gt;Application ingress/controller&lt;/li&gt;
&lt;li&gt;Application layer autoscaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not an accidental gap.&lt;br&gt;
It's a conscious scope decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The base platform ensures security and governance.&lt;/li&gt;
&lt;li&gt;Application delivery is managed in separate repos.&lt;/li&gt;
&lt;li&gt;Separation of responsibilities avoids friction and chaotic scaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Considerations Before Using in Production
&lt;/h2&gt;

&lt;p&gt;This foundation is solid, but for real production it's worth reinforcing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: EKS control plane logs, metrics, and alerts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EKS endpoint hardening&lt;/strong&gt;: restrict &lt;code&gt;public_access_cidrs&lt;/code&gt; or private-only endpoint in prod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More granular IAM&lt;/strong&gt;: reduce broad permissions and lock down to specific resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI security&lt;/strong&gt;: IaC/policy/image checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workload autoscaling&lt;/strong&gt;: HPA + Cluster Autoscaler/Karpenter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HA/cost architecture&lt;/strong&gt;: evaluate NAT per AZ based on RTO/RPO and budget.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Who This Platform Is For
&lt;/h2&gt;

&lt;h3&gt;
  
  
  If You're a Cloud/Platform Engineer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use it as a foundation for your organization or projects.&lt;/li&gt;
&lt;li&gt;Adapt the modules to your needs.&lt;/li&gt;
&lt;li&gt;Contribute improvements to the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If You're a DevOps Engineer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use it as a reference for what you need.&lt;/li&gt;
&lt;li&gt;Focus on deploying applications, not infrastructure.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This platform is the &lt;strong&gt;starting point&lt;/strong&gt;, not the final destination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next evolutions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-region (disaster recovery)&lt;/li&gt;
&lt;li&gt;Service Mesh (advanced observability)&lt;/li&gt;
&lt;li&gt;GitOps (ArgoCD/FluxCD)&lt;/li&gt;
&lt;li&gt;Security policies (OPA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But the fundamentals are already here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separation of responsibilities&lt;/li&gt;
&lt;li&gt;Security by design&lt;/li&gt;
&lt;li&gt;Real automation&lt;/li&gt;
&lt;li&gt;Reusability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;And it's ready to use today.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Repository
&lt;/h2&gt;

&lt;p&gt;Everything is documented, tested, and with steps to build and deploy:&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/hsniama/infra-devops-aws" rel="noopener noreferrer"&gt;github.com/hsniama/infra-devops-aws&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Clone. Adapt. Deploy. Contribute. *&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Open Source and Collaboration
&lt;/h2&gt;

&lt;p&gt;If you're interested in this line of work, you can collaborate with ideas or PRs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IAM hardening per resource.&lt;/li&gt;
&lt;li&gt;End-to-end observability.&lt;/li&gt;
&lt;li&gt;Policy-as-code in pipeline.&lt;/li&gt;
&lt;li&gt;Blueprint of the application repo that consumes outputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember that &lt;strong&gt;The best platform is built together.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Reflection
&lt;/h2&gt;

&lt;p&gt;The best automation isn't the one that does more things. It's the one that better defines responsibilities and reduces systemic risk.&lt;/p&gt;

&lt;p&gt;This project is about that: as a platform team, first designing the right shell so that deploying applications later is simpler, safer, and more repeatable.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;⭐ Give it a star on GitHub
&lt;/li&gt;
&lt;li&gt;🔄 Share with your team
&lt;/li&gt;
&lt;li&gt;💬 Leave me your comments
&lt;/li&gt;
&lt;li&gt;🤝 Contribute to the project
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Let's build better platforms, together.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Tags: AWS, Terraform, PlatformEngineering, DevOps, CloudArchitecture, OpenSource, OIDC, Kubernetes, AWS, Cloud&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Author:&lt;/strong&gt; Henry Niama
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role:&lt;/strong&gt; Systems Engineer
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/hsniama/infra-devops-aws" rel="noopener noreferrer"&gt;@hsniama&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://linkedin.com/in/hsniama" rel="noopener noreferrer"&gt;Henry Niama&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>terraform</category>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Construí la plataforma AWS que todos los DevOps querrían tener</title>
      <dc:creator>Henry Niama </dc:creator>
      <pubDate>Wed, 04 Mar 2026 17:42:56 +0000</pubDate>
      <link>https://dev.to/hsniama/construi-la-plataforma-aws-que-todos-los-devops-querrian-tener-2ab2</link>
      <guid>https://dev.to/hsniama/construi-la-plataforma-aws-que-todos-los-devops-querrian-tener-2ab2</guid>
      <description>&lt;h2&gt;
  
  
  El Descubrimiento
&lt;/h2&gt;

&lt;p&gt;Hace unos meses, mientras conversaba con un amigo DevOps Engineer, me contaba una de sus frustraciones:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"En algunas de las empresas y proyectos en los que he trabajado, me ha tocado construir toda la infraestructura: VPCs, subnets, EKS… además de armar el pipeline de despliegue, tanto de la plataforma como del microservicio. Pero como DevOps, lo que realmente quiero es enfocarme en desplegar el microservicio. Mi sueño sería simplemente hacer kubectl apply… y que todo funcione.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;Ahí lo vi claro: el DevOps Engineer termina peleando con VPCs y subnets cuando en realidad debería enfocarse en automatizar despliegues de aplicaciones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Esa reflexión cambió todo.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  La Separación de Responsabilidades que Falta
&lt;/h2&gt;

&lt;p&gt;Este proyecto nace justamente para resolver ese choque de responsabilidades.&lt;/p&gt;

&lt;p&gt;Nosotros asumimos el rol de &lt;strong&gt;Cloud/Platform Engineer&lt;/strong&gt; y construimos el cascarón-base de infraestructura para que luego el equipo de DevOps/App Delivery despliegue aplicaciones sobre una plataforma ya preparada.&lt;/p&gt;

&lt;p&gt;En nuestro enfoque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud/Platform Engineering (este repositorio)&lt;/strong&gt; construye la base: red, infraestructura, identidad, estado remoto, clúster, registro y pipeline de infraestructura.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps/App Delivery (repositorio de aplicaciones, después)&lt;/strong&gt; consume outputs de esta base para desplegar microservicios con velocidad y menos riesgo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No es burocracia. Es diseño organizacional y técnico para escalar. Como &lt;strong&gt;Cloud/Platform Engineer&lt;/strong&gt;, mi trabajo no es que cada DevOps recree infraestructura. Mi trabajo es &lt;strong&gt;construir la plataforma una vez&lt;/strong&gt; y que ellos la consuman.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuydh55nx19my656q0g8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuydh55nx19my656q0g8.png" alt="Roles diff" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Lo Que Construí
&lt;/h2&gt;

&lt;p&gt;Decidí materializar esta visión en un proyecto real:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Una plataforma AWS completa, reutilizable y open source.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdn6ee9clbnomjdjqavac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdn6ee9clbnomjdjqavac.png" alt="AWS Architecture" width="800" height="558"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ver diagrama completo en&lt;/em&gt; &lt;a href="https://github.com/hsniama/infra-devops-aws/blob/dev/henry/assets/diagrams/aws/aws_infrastructure_diagram.png" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se observa, tomamos la responsabilidad de preparar el cascarón completo de infraestructura para que luego un equipo DevOps/App pueda enfocarse en desplegar producto, no en pelear con infraestructura base.&lt;/p&gt;

&lt;p&gt;En concreto, dejamos listo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redes en AWS separadas por ambiente (&lt;code&gt;test&lt;/code&gt; y &lt;code&gt;prod&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Clústeres EKS por ambiente.&lt;/li&gt;
&lt;li&gt;Repositorios ECR por ambiente para imágenes.&lt;/li&gt;
&lt;li&gt;Autenticación segura por OIDC en GitHub Actions.&lt;/li&gt;
&lt;li&gt;Estado remoto de Terraform con bloqueo.&lt;/li&gt;
&lt;li&gt;CI/CD de infraestructura con reglas claras por ambiente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No buscamos “hacer todo en un repo”. Buscamos colaborar mejor: plataforma por un lado, aplicaciones por otro, con un contrato claro entre ambos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tecnologías que usamos para construir esta base
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS&lt;/strong&gt;: VPC, EKS, ECR, IAM, S3, DynamoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terraform&lt;/strong&gt;: para construir recursos de AWS con módulos reutilizables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt;: para ejecutar el pipeline de infraestructura por ambiente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OIDC&lt;/strong&gt;: Autenticación federada sin Access Keys estáticas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EKS Access Entries&lt;/strong&gt;: para controlar quién entra al clúster sin depender solo de configuraciones manuales&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Los 4 Pilares que Hacen la Diferencia
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Separación de Ambientes (De Verdad)
&lt;/h3&gt;

&lt;p&gt;La mayoría dice "tenemos TEST y PROD separados" pero comparten VPC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yo fui más allá:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TEST&lt;/strong&gt; → VPC &lt;code&gt;10.110.0.0/16&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PROD&lt;/strong&gt; → VPC &lt;code&gt;10.111.0.0/16&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcshg89c8v5blfz74jwjd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcshg89c8v5blfz74jwjd.png" alt="VPCs" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estados de Terraform &lt;strong&gt;totalmente independientes&lt;/strong&gt; por ambiente y variables separadas por tfvars.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagd9j7mprx2fd9ypdcl3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagd9j7mprx2fd9ypdcl3.png" alt="Terraform States" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El pipeline selecciona dinámicamente backend y variables según la rama, evitando colisiones entre entornos y &lt;strong&gt;cero recursos compartidos&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jq48r0jx0lbigbtiv73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jq48r0jx0lbigbtiv73.png" alt="Pipeline" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Por qué?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Porque un viernes a las 6 PM, alguien va a hacer un cambio en TEST. Y si comparten recursos, PROD se cae.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Con esta separación, puedo destruir/modificar TEST sin miedo.&lt;/strong&gt; Esa tranquilidad no tiene precio.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. OIDC: La Innovación de seguridad que cambia todo
&lt;/h3&gt;

&lt;p&gt;Aquí está la joya del proyecto. &lt;br&gt;
&lt;strong&gt;El problema que todos tienen:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Credenciales AWS guardadas en &lt;strong&gt;GitHub Secrets&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Ejemplo: 

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AWS_ACCESS_KEY_ID: AKIAXXXXX&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AWS_SECRET_ACCESS_KEY: xxxxx&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si alguien hace commit de esas keys; es un &lt;strong&gt;desastre&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mi solución: OIDC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir0agcmskthbjb3ux49k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir0agcmskthbjb3ux49k.png" alt="OIDC-Flow" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sin llaves estáticas en GitHub.&lt;/p&gt;

&lt;p&gt;Esto mejora de forma directa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seguridad operativa.&lt;/li&gt;
&lt;li&gt;Caducidad de credenciales.&lt;/li&gt;
&lt;li&gt;Control por trust policy.&lt;/li&gt;
&lt;li&gt;Reducción de superficie de ataque.&lt;/li&gt;
&lt;li&gt;Cero credenciales permanentes: &lt;strong&gt;Cero riesgo&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y lo mejor: el Trust Policy asegura que &lt;strong&gt;solo mi repositorio&lt;/strong&gt; puede asumir el rol.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Outputs: El Puente Entre Plataforma y Aplicaciones
&lt;/h3&gt;

&lt;p&gt;Aquí es donde la separación de roles cobra vida.&lt;br&gt;
La plataforma no entrega “infraestructura cruda”, sino outputs listos para usar:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Ejemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ECR_URL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;123456.dkr.ecr.us-east-1.amazonaws.com/app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EKS_CLUSTER&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;eksdevops1720testXX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EKS_ENDPOINT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://XXXXX.eks.amazonaws.com" rel="noopener noreferrer"&gt;https://XXXXX.eks.amazonaws.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;REGION&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;us-east-1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8k7ubu95tcnbokxpyf2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8k7ubu95tcnbokxpyf2b.png" alt="Outputs" width="800" height="508"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ver Outputs en&lt;/em&gt; &lt;a href="https://github.com/hsniama/infra-devops-aws/actions/runs/22232310474/job/64315042012" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cómo los consume el DevOps Engineer en su repo (pipeline):&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;# Pipeline que aprovecha los outputs de la plataforma&lt;/span&gt;
&lt;span class="s"&gt;docker push $ECR_URL/mi-app:latest&lt;/span&gt;
&lt;span class="s"&gt;aws eks update-kubeconfig --name $EKS_CLUSTER&lt;/span&gt;
&lt;span class="s"&gt;kubectl apply -f k8s/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo directo en consola:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws eks update-kubeconfig &lt;span class="nt"&gt;--name&lt;/span&gt; eksdevops1720testXX
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; deployment.yaml
&lt;span class="c"&gt;# y funciona... Sin configuración adicional.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Eso es todo.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El DevOps Engineer,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No necesita saber profundamente cómo está configurada la VPC.
&lt;/li&gt;
&lt;li&gt;No necesita entender por completo route tables.
&lt;/li&gt;
&lt;li&gt;No necesita ser experto en el levantamiento del cluster EKS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solo necesita desplegar su aplicación&lt;/strong&gt; en la plataforma previamente desplegada.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Pipeline Inteligente: Rápido en TEST, Seguro en PROD
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8nsnhlyf2chgp0hdec0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8nsnhlyf2chgp0hdec0.png" alt="Ci-Cd" width="800" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Diseñé el pipeline pensando en &lt;strong&gt;velocidad vs control&lt;/strong&gt;: &lt;br&gt;
&lt;strong&gt;TEST (Velocidad)&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git push origin dev/**&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Terraform despliega automáticamente. &lt;/li&gt;
&lt;li&gt;Sin aprobaciones. &lt;/li&gt;
&lt;li&gt;Feedback en ~15 minutos. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PROD (Control)&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull Request a &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Terraform plan (revisión del equipo). &lt;/li&gt;
&lt;li&gt;Aprobación manual obligatoria - Merge → despliegue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lo innovador:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autenticación OIDC (sin keys).&lt;/li&gt;
&lt;li&gt;Estado remoto con locking (sin conflictos).&lt;/li&gt;
&lt;li&gt;Artifacts guardados (rollback fácil).&lt;/li&gt;
&lt;li&gt;Aprobaciones solo donde importan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto permite tener despliegues limpios con artifacts de valor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhppaul3q6dw8dozfni52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhppaul3q6dw8dozfni52.png" alt="Pipeline" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Acceso al Cluster: EKS Access Entries
&lt;/h2&gt;

&lt;p&gt;AWS lanzó algo revolucionario: &lt;strong&gt;Access Entries&lt;/strong&gt;. En lugar de editar ConfigMaps manualmente, ahora se puede definir el acceso al Cluster directamente en Terraform:&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;eks_access_entries&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;platform_engineer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;principal_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:iam::123456:user/henry"&lt;/span&gt;
    &lt;span class="nx"&gt;policies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;admin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AmazonEKSClusterAdminPolicy"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;devops_team&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;principal_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:iam::123456:role/gh-oidc-role"&lt;/span&gt;
    &lt;span class="nx"&gt;policies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;deploy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AmazonEKSClusterAdminPolicy"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&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;p&gt;&lt;strong&gt;¿Qué cambia con Access Entries?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gestionado por AWS&lt;/strong&gt; - No más ConfigMaps manuales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integración nativa con IAM&lt;/strong&gt; - Roles y usuarios directamente en AWS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validación automática&lt;/strong&gt; - Terraform valida antes de aplicar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditoría completa&lt;/strong&gt; - CloudTrail registra cada acción.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Lo que significa en la práctica&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cuando un DevOps Engineer necesita acceso al cluster, yo simplemente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agrego su rol IAM en Terraform (en nuestro caso, en el módulo).&lt;/li&gt;
&lt;li&gt;Ejecuto &lt;code&gt;terraform apply&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Listo: Tiene acceso inmediato al cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EKS Clusters:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tx2yvotentiyuvmpxaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tx2yvotentiyuvmpxaj.png" alt=" " width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acceso al Cluster (como DevOps Engineer):&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1rmcb57grncl7n4ed6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1rmcb57grncl7n4ed6a.png" alt=" " width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lista de EKS Access Entries configurados (ejemplo):&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw3bkz3o6zfv8pwvahli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw3bkz3o6zfv8pwvahli.png" alt=" " width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto es lo que implementamos en el proyecto. En donde la separación de responsabilidades entra en acción:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yo como Cloud/Platform Engineer gestiono QUIÉN tiene acceso.&lt;/li&gt;
&lt;li&gt;Ellos usan ese acceso para desplegar.&lt;/li&gt;
&lt;li&gt;Nadie toca ConfigMaps sin riesgo de romper nada.&lt;/li&gt;
&lt;li&gt;Todo versionado en Git.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Alcance real de este proyecto
&lt;/h2&gt;

&lt;p&gt;Este repositorio no despliega microservicios directamente. Su propósito es &lt;strong&gt;construir la base sólida&lt;/strong&gt; para que eso ocurra bien después.&lt;/p&gt;

&lt;p&gt;Tampoco incluye todavía:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;observabilidad completa de workloads,&lt;/li&gt;
&lt;li&gt;ingress/controller de apps,&lt;/li&gt;
&lt;li&gt;autoscaling de capa aplicación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lo que sí hace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define redes, clústeres, repositorios (ECR) y pipelin de infraestructura.&lt;/li&gt;
&lt;li&gt;Publica outputs listos para que otros repos desplieguen aplicaciones.&lt;/li&gt;
&lt;li&gt;Establece seguridad moderna (OIDC, IAM roles temporales).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lo que no incluye (por diseño):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observabilidad completa de workloads&lt;/li&gt;
&lt;li&gt;Ingress/controller de aplicaciones&lt;/li&gt;
&lt;li&gt;Autoscaling de la capa aplicación&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto no es una carencia accidental.&lt;br&gt;
Es una decisión consciente de alcance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La plataforma base asegura seguridad y gobernanza.&lt;/li&gt;
&lt;li&gt;La entrega de aplicaciones se gestiona en repos separados.&lt;/li&gt;
&lt;li&gt;La separación de responsabilidades evita fricción y escalamiento caótico.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consideraciones antes de usarlo en producción
&lt;/h2&gt;

&lt;p&gt;Esta base es sólida, pero para producción real conviene reforzar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Observabilidad&lt;/strong&gt;: logs de control plane EKS, métricas y alertas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardening de endpoint EKS&lt;/strong&gt;: restringir &lt;code&gt;public_access_cidrs&lt;/code&gt; o endpoint privado-only en prod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM más granular&lt;/strong&gt;: reducir permisos amplios y cerrar a recursos concretos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seguridad en CI&lt;/strong&gt;: checks de IaC/policies/images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autoscaling de workloads&lt;/strong&gt;: HPA + Cluster Autoscaler/Karpenter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquitectura HA/costos&lt;/strong&gt;: evaluar NAT por AZ según RTO/RPO y presupuesto.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Para Quién Es Esta Plataforma
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Si Eres Cloud/Platform Engineer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Úsala como base para tu organización o proyectos.&lt;/li&gt;
&lt;li&gt;Adapta los módulos a tus necesidades.&lt;/li&gt;
&lt;li&gt;Contribuye mejoras al proyecto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Si Eres DevOps Engineer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Úsalo como referencia de lo que necesitas.&lt;/li&gt;
&lt;li&gt;Enfócate en desplegar aplicaciones, no en infraestructura.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Lo Que Viene
&lt;/h2&gt;

&lt;p&gt;Esta plataforma es el &lt;strong&gt;punto de partida&lt;/strong&gt;, no el destino final.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Próximas evoluciones:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-región (disaster recovery)&lt;/li&gt;
&lt;li&gt;Service Mesh (observabilidad avanzada)&lt;/li&gt;
&lt;li&gt;GitOps (ArgoCD/FluxCD)&lt;/li&gt;
&lt;li&gt;Políticas de seguridad (OPA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pero lo fundamental ya está:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separación de responsabilidades&lt;/li&gt;
&lt;li&gt;Seguridad por diseño&lt;/li&gt;
&lt;li&gt;Automatización real&lt;/li&gt;
&lt;li&gt;Reutilización&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Y está listo para usar hoy.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Repositorio
&lt;/h2&gt;

&lt;p&gt;Todo está documentado, probado y con los pasos para armar y desplegar:&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;Repositorio:&lt;/strong&gt; &lt;a href="https://github.com/hsniama/infra-devops-aws" rel="noopener noreferrer"&gt;github.com/hsniama/infra-devops-aws&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Clona. Adapta. Despliega. Contribuye. *&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Open source y colaboración
&lt;/h2&gt;

&lt;p&gt;Si te interesa esta línea de trabajo, puedes colaborar con ideas o PRs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardening IAM por recurso.&lt;/li&gt;
&lt;li&gt;Observabilidad end-to-end.&lt;/li&gt;
&lt;li&gt;Policy-as-code en pipeline.&lt;/li&gt;
&lt;li&gt;Blueprint del repo de aplicaciones que consuma outputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recordemos que &lt;strong&gt;La mejor plataforma se construye entre todos.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Reflexión Final
&lt;/h2&gt;

&lt;p&gt;La mejor automatización no es la que hace más cosas. Es la que define mejor responsabilidades y reduce riesgo sistémico.&lt;/p&gt;

&lt;p&gt;Este proyecto va de eso: como equipo de plataforma, diseñar primero el cascarón correcto para que luego desplegar aplicaciones sea más simple, seguro y repetible.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;⭐ Dale estrella en GitHub
&lt;/li&gt;
&lt;li&gt;🔄 Comparte con tu equipo
&lt;/li&gt;
&lt;li&gt;💬 Déjame tus comentarios
&lt;/li&gt;
&lt;li&gt;🤝 Contribuye al proyecto
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Construyamos mejores plataformas, juntos.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Tags: AWS, Terraform, PlatformEngineering, DevOps, CloudArchitecture, OpenSource, OIDC, Kubernetes, AWS, Cloud&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autor:&lt;/strong&gt; Henry Niama
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rol:&lt;/strong&gt; Systems Engineer
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/hsniama/infra-devops-aws" rel="noopener noreferrer"&gt;@hsniama&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://linkedin.com/in/hsniama" rel="noopener noreferrer"&gt;Henry Niama&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>terraform</category>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
  </channel>
</rss>
