<?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: Nicolas Balmaceda</title>
    <description>The latest articles on DEV Community by Nicolas Balmaceda (@nico_balmaceda).</description>
    <link>https://dev.to/nico_balmaceda</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%2F3831826%2F06870724-db9d-46b1-a476-e66beb098838.jpg</url>
      <title>DEV Community: Nicolas Balmaceda</title>
      <link>https://dev.to/nico_balmaceda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nico_balmaceda"/>
    <language>en</language>
    <item>
      <title>The Self-Healing SDLC: Integrating GitHub Actions with AWS DevOps Agents</title>
      <dc:creator>Nicolas Balmaceda</dc:creator>
      <pubDate>Wed, 18 Mar 2026 17:23:01 +0000</pubDate>
      <link>https://dev.to/nico_balmaceda/the-self-healing-sdlc-integrating-github-actions-with-aws-devops-agents-29ko</link>
      <guid>https://dev.to/nico_balmaceda/the-self-healing-sdlc-integrating-github-actions-with-aws-devops-agents-29ko</guid>
      <description>&lt;h2&gt;
  
  
  Beyond Traditional Automation
&lt;/h2&gt;

&lt;p&gt;For years, we’ve treated the Software Development Life Cycle (SDLC) as a linear path: Code -&amp;gt; Build -&amp;gt; Test -&amp;gt; Deploy. We’ve perfected the art of "reusable workflows" in GitHub Actions to standardize how we build and deploy microservices to ECS. &lt;/p&gt;

&lt;p&gt;But as of 2026, "standard" automation isn't enough. When a deployment succeeds but the service fails to communicate with a legacy monolith (like a host-based Kometsales instance), traditional CI/CD is blind. &lt;/p&gt;

&lt;h2&gt;
  
  
  Enter the AWS DevOps Agent (re:Invent 2025)
&lt;/h2&gt;

&lt;p&gt;Announced at the end of 2025, the &lt;strong&gt;AWS DevOps Agent&lt;/strong&gt; represents a shift toward "Agentic Operations." Unlike a standard monitor, this agent understands the context of your architecture. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Hybrid Workflow: GitHub + AWS AI
&lt;/h3&gt;

&lt;p&gt;The most robust strategy in 2026 isn't replacing GitHub Actions, but augmenting them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;GitHub Actions (The Orchestrator):&lt;/strong&gt; Handles the heavy lifting of the build. It manages the multi-arch Docker builds, runs your unit tests, and triggers the deployment to AWS.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;DevOps Agent (The Watcher):&lt;/strong&gt; Once the Action completes, the Agent takes over. It monitors the "Blast Radius" of the change.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Technical Deep Dive: A Sample Reusable Workflow
&lt;/h2&gt;

&lt;p&gt;To make this work at scale, you need a templated approach. Here is a snippet of a high-complexity GitHub Action that prepares an environment for an AI-monitored deployment:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deploy&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ECS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Agentic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Monitoring"&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_call&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;service_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&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;Checkout Code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&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;Build and Push Multi-Arch&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;docker buildx build \&lt;/span&gt;
            &lt;span class="s"&gt;--platform linux/amd64,linux/arm64 \&lt;/span&gt;
            &lt;span class="s"&gt;-t ${{ secrets.ECR_REPO }}/${{ inputs.service_name }}:latest --push .&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;Update ECS Service&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;aws ecs update-service --cluster prod-cluster \&lt;/span&gt;
            &lt;span class="s"&gt;--service ${{ inputs.service_name }} --force-new-deployment&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;Register Deployment with DevOps Agent&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;aws devops-guru start-deployment-analysis \&lt;/span&gt;
            &lt;span class="s"&gt;--deployment-id ${{ github.sha }} \&lt;/span&gt;
            &lt;span class="s"&gt;--resource-arn arn:aws:ecs:us-east-1:1234567890:service/${{ inputs.service_name }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solving the "Monolith Connection" Problem
&lt;/h2&gt;

&lt;p&gt;A major pain point in microservice migrations is ensuring new containers can reach legacy services running on the host machine. &lt;/p&gt;

&lt;p&gt;In this new SDLC model, if your GitHub Action deploys a service that cannot reach the host-based monolith, the &lt;strong&gt;AWS DevOps Agent&lt;/strong&gt; can automatically identify the security group mismatch or the missing VPC route. Instead of a developer spending 4 hours debugging "Connection Refused," the Agent provides a root-cause analysis within seconds of the deployment finishing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open Source Matters Here
&lt;/h2&gt;

&lt;p&gt;While the DevOps Agent is an AWS tool, the logic driving it relies on open standards. By using OpenTelemetry for your traces and standard GitHub Action triggers, you ensure that your "Agentic SDLC" isn't locked into a single vendor's black box. You retain the flexibility to swap components while reaping the benefits of AI-speed troubleshooting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The future of DevOps isn't just about writing YAML; it's about closing the feedback loop between &lt;strong&gt;Deployment&lt;/strong&gt; and &lt;strong&gt;Observation&lt;/strong&gt;. By combining the modular power of GitHub Actions with the contextual intelligence of AWS's new agents, we're finally moving toward truly self-healing infrastructure.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;How are you handling post-deployment monitoring in 2026? Are you still manually checking logs, or have you offloaded that to an agent? Let's discuss in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>aws</category>
      <category>cicd</category>
      <category>ai</category>
    </item>
    <item>
      <title>Why AWS Graviton5 Makes Multi-Arch Docker Builds Mandatory in 2026</title>
      <dc:creator>Nicolas Balmaceda</dc:creator>
      <pubDate>Wed, 18 Mar 2026 17:16:02 +0000</pubDate>
      <link>https://dev.to/nico_balmaceda/why-aws-graviton5-makes-multi-arch-docker-builds-mandatory-in-2026-4n52</link>
      <guid>https://dev.to/nico_balmaceda/why-aws-graviton5-makes-multi-arch-docker-builds-mandatory-in-2026-4n52</guid>
      <description>&lt;h2&gt;
  
  
  The Graviton5 Shift: Beyond the Hype
&lt;/h2&gt;

&lt;p&gt;At re:Invent 2025, AWS didn't just iterate; they flexed. The new &lt;strong&gt;Graviton5&lt;/strong&gt; processor (powering the &lt;strong&gt;M9g instances&lt;/strong&gt;) brings a massive shift to the EC2 landscape. Built on a 3nm process, it packs &lt;strong&gt;192 cores&lt;/strong&gt; on a single die, effectively eliminating the NUMA (Non-Uniform Memory Access) latency issues that sometimes plagued earlier multi-socket ARM designs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Benchmarks vs. Graviton4:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;25% higher compute performance&lt;/strong&gt; for general-purpose workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5x larger L3 cache&lt;/strong&gt;, which significantly reduces stalls for memory-intensive apps like Redis or Java-based microservices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30% faster database performance&lt;/strong&gt; (specifically reported by early testers like Atlassian for Jira).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for us in DevOps, the biggest "hidden" feature is the &lt;strong&gt;Nitro Isolation Engine&lt;/strong&gt;. This uses formal mathematical verification to prove that workloads are isolated at the hardware level—a massive win for security-conscious CI/CD environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Infrastructure Challenge: Bridging the Arch Gap
&lt;/h2&gt;

&lt;p&gt;If your team is still building exclusively for &lt;code&gt;x86_64&lt;/code&gt;, you are essentially leaving money on the table. However, migrating isn't as simple as flipping a switch. You need a strategy that handles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Multi-Arch Image Manifests:&lt;/strong&gt; Ensuring a single tag works on both developer Macbooks (ARM), legacy CI runners (x86), and Graviton5 production nodes.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Legacy Communication:&lt;/strong&gt; Handling scenarios where new microservices on ECS need to reach a monolithic service (like a legacy ERP or Kometsales) still running on the host machine.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Optimizing the Local Loop with Tilt
&lt;/h3&gt;

&lt;p&gt;We’ve found that using &lt;strong&gt;Tilt&lt;/strong&gt; for local &lt;code&gt;docker-compose&lt;/code&gt; deployments is a game changer. It allows us to simulate the multi-arch environment locally. By adding a &lt;code&gt;platform&lt;/code&gt; attribute to our compose files, we can test how our services behave before they hit the real M9g instances.&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;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api-service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;context&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;platforms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;linux/amd64"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;linux/arm64"&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;my-repo/api:latest&lt;/span&gt;
    &lt;span class="c1"&gt;# Force ARM locally if you're on a Mac/Graviton dev box&lt;/span&gt;
    &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;linux/arm64&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Mastering the Multi-Arch Build
&lt;/h2&gt;

&lt;p&gt;To support Graviton5, your GitHub Actions or Jenkins pipelines must move to &lt;code&gt;docker buildx&lt;/code&gt;. Here is a professional-grade pattern for a multi-arch Dockerfile that handles architecture-specific packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use a multi-platform base image&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;--platform=$BUILDPLATFORM node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;

&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; TARGETARCH&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Conditional logic for architecture-specific dependencies&lt;/span&gt;
&lt;span class="k"&gt;RUN if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TARGETARCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arm64"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;      apk add &lt;span class="nt"&gt;--no-cache&lt;/span&gt; libhook-arm-special&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;      apk add &lt;span class="nt"&gt;--no-cache&lt;/span&gt; libhook-x86-standard&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/dist ./dist&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/main.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The CI/CD Command
&lt;/h3&gt;

&lt;p&gt;In your pipeline, you no longer run a simple build. You use the &lt;code&gt;bake&lt;/code&gt; or &lt;code&gt;buildx&lt;/code&gt; command to push a manifest list to ECR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/amd64,linux/arm64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tag&lt;/span&gt; my-registry/service:v1.0.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Thoughts: The 2026 DevOps Reality
&lt;/h2&gt;

&lt;p&gt;The era of "architecture-agnostic" engineering is over. With Graviton5 delivering 40% better price-performance than Intel counterparts, the question isn't &lt;em&gt;if&lt;/em&gt; you'll migrate, but &lt;em&gt;how&lt;/em&gt; fast your CI/CD can adapt. &lt;/p&gt;

&lt;p&gt;By automating your image manifests and refining your local dev environment with tools like Tilt, you turn a hardware migration into a competitive advantage.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you started testing M9g instances yet? Drop a comment below with your initial performance findings!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>docker</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
