<?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: Rykiel KAMENI</title>
    <description>The latest articles on DEV Community by Rykiel KAMENI (@rykiel-dev).</description>
    <link>https://dev.to/rykiel-dev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2358939%2Fb241db9a-0199-41be-9dc5-15fffd4a4d4f.png</url>
      <title>DEV Community: Rykiel KAMENI</title>
      <link>https://dev.to/rykiel-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rykiel-dev"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Rykiel KAMENI</dc:creator>
      <pubDate>Mon, 21 Sep 2026 01:35:17 +0000</pubDate>
      <link>https://dev.to/rykiel-dev/-2igp</link>
      <guid>https://dev.to/rykiel-dev/-2igp</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-builders/i-built-an-ai-agent-that-audits-aws-and-it-cant-touch-anything-4nip" class="crayons-story__hidden-navigation-link"&gt;I Built an AI Agent That Audits AWS (And It Can't Touch Anything)&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/TSVBY8710fQ" title="I Built an AI Agent That Audits AWS (And It Can't Touch Anything)"&gt;&lt;/iframe&gt;
    &lt;/div&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-builders"&gt;
            &lt;img alt="AWS Community Builders  logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F2794%2F88da75b6-aadd-4ea1-8083-ae2dfca8be94.png" class="crayons-logo__image" width="350" height="350"&gt;
          &lt;/a&gt;

          &lt;a href="/sarvar_04" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1163149%2F5afa2902-591e-4944-b6fa-9bbba80c6e95.png" alt="sarvar_04 profile" class="crayons-avatar__image" width="800" height="559"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sarvar_04" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sarvar Nadaf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sarvar Nadaf
                
                
              
              &lt;div id="story-author-preview-content-4656052" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sarvar_04" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1163149%2F5afa2902-591e-4944-b6fa-9bbba80c6e95.png" class="crayons-avatar__image" alt="" width="800" height="559"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sarvar Nadaf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-builders" class="crayons-story__secondary fw-medium"&gt;AWS Community Builders &lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-builders/i-built-an-ai-agent-that-audits-aws-and-it-cant-touch-anything-4nip" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 18&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-builders/i-built-an-ai-agent-that-audits-aws-and-it-cant-touch-anything-4nip" id="article-link-4656052"&gt;
          I Built an AI Agent That Audits AWS (And It Can't Touch Anything)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aws-builders/i-built-an-ai-agent-that-audits-aws-and-it-cant-touch-anything-4nip" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;16&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aws-builders/i-built-an-ai-agent-that-audits-aws-and-it-cant-touch-anything-4nip#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            13 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>I Built a Multi-Region Pilot Light on AWS. The Diagram Was the Easy Part.</title>
      <dc:creator>Rykiel KAMENI</dc:creator>
      <pubDate>Mon, 21 Sep 2026 01:26:26 +0000</pubDate>
      <link>https://dev.to/rykiel-dev/i-built-a-multi-region-pilot-light-on-aws-the-diagram-was-the-easy-part-ebi</link>
      <guid>https://dev.to/rykiel-dev/i-built-a-multi-region-pilot-light-on-aws-the-diagram-was-the-easy-part-ebi</guid>
      <description>&lt;p&gt;Most disaster recovery write-ups stop at the diagram.&lt;/p&gt;

&lt;p&gt;You get two boxes, an arrow labelled "replicate", and an RTO that was never measured. I wanted the rest of the story: real Terraform, a failover you can time, and a written answer for every trade-off including the ones that only look smart at demo scale.&lt;/p&gt;

&lt;p&gt;So I built a notes API across two AWS regions in the &lt;strong&gt;pilot light&lt;/strong&gt; pattern, then reviewed the whole thing against the Well-Architected Framework.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/toriyama237/aws-multi-region-pilot-light" rel="noopener noreferrer"&gt;aws-multi-region-pilot-light&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application is small on purpose. The value is the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern in one paragraph
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;eu-west-1&lt;/code&gt; (Ireland) serves all traffic. &lt;code&gt;eu-west-3&lt;/code&gt; (Paris) continuously receives every database write and every S3 object, but runs &lt;strong&gt;zero&lt;/strong&gt; application instances.&lt;/p&gt;

&lt;p&gt;Route 53 probes the primary every 10 seconds and flips DNS on its own when it fails. A human then promotes the RDS read replica and scales the dormant Auto Scaling group — both through one script. The same application serves from the second region, under the same URL.&lt;/p&gt;

&lt;p&gt;The client never changes anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why pilot light, not the other three
&lt;/h2&gt;

&lt;p&gt;I picked the pattern from the recovery objectives, not the other way around.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;What you pay for when nothing is on fire&lt;/th&gt;
&lt;th&gt;RTO&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backup and restore&lt;/td&gt;
&lt;td&gt;Snapshots&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pilot light&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data + idle ALB/NAT + replica&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10–15 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warm standby&lt;/td&gt;
&lt;td&gt;Pilot light + a small always-on fleet&lt;/td&gt;
&lt;td&gt;A few minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active-active&lt;/td&gt;
&lt;td&gt;A full second region + multi-writer data&lt;/td&gt;
&lt;td&gt;Near zero&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My targets were explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RPO&lt;/strong&gt; under 1 minute (in practice: seconds of async lag)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTO&lt;/strong&gt; under 30 minutes (expected: 10 to 15, dominated by RDS promotion)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backup and restore misses the RTO. Active-active is a different product: Aurora Global Database or application-level conflict handling. Warm standby looks tempting until you notice the long pole is &lt;strong&gt;not&lt;/strong&gt; instance boot — it is replica promotion. Paying for idle compute does not shorten that.&lt;/p&gt;

&lt;p&gt;Pilot light is the cheapest pattern whose RTO is measured in minutes, not hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually sits in each region
&lt;/h2&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%2Fraw.githubusercontent.com%2Ftoriyama237%2Faws-multi-region-pilot-light%2Fmain%2Fdocs%2Farchitecture.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%2Fraw.githubusercontent.com%2Ftoriyama237%2Faws-multi-region-pilot-light%2Fmain%2Fdocs%2Farchitecture.png" alt="Pilot light architecture" width="800" height="969"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both regions are built from the same Terraform modules. They are structurally identical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPC across two AZs. Public subnets hold the ALB and one NAT. Private subnets hold the API and RDS. Nothing else gets a public IP.&lt;/li&gt;
&lt;li&gt;ALB terminates TLS with a regional ACM certificate, redirects HTTP → HTTPS.&lt;/li&gt;
&lt;li&gt;Auto Scaling group of Amazon Linux 2023. No SSH. Session Manager only.&lt;/li&gt;
&lt;li&gt;RDS PostgreSQL + S3 for attachments + Secrets Manager for the DB password.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only differences:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which database is writable&lt;/li&gt;
&lt;li&gt;The ASG desired capacity: &lt;strong&gt;2 in Ireland, 0 in Paris&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That single number is the pilot light.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two replication streams, one irreversible step
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;At failover&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;RDS cross-region read replica, async&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Promote. 5–10 minutes. One way.&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 objects&lt;/td&gt;
&lt;td&gt;Cross-region replication + delete markers&lt;/td&gt;
&lt;td&gt;Nothing. The bucket is already live.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DB credentials&lt;/td&gt;
&lt;td&gt;Secrets Manager multi-region replica&lt;/td&gt;
&lt;td&gt;Nothing. Same secret name in both regions.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;S3 and Secrets Manager can be live in two places. A writable relational database cannot — not without Aurora Global Database, which I deliberately did not use.&lt;/p&gt;

&lt;p&gt;So the runbook exists mostly for one action: promotion. Everything else is already there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failover chain
&lt;/h2&gt;

&lt;p&gt;This is the part diagrams skip.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;/health&lt;/code&gt; runs &lt;code&gt;SELECT 1&lt;/code&gt; against the local database. Broken data layer → failing readiness.&lt;/li&gt;
&lt;li&gt;The ALB target group uses &lt;code&gt;/health&lt;/code&gt;. Instances that cannot reach the DB leave rotation.&lt;/li&gt;
&lt;li&gt;Route 53 probes &lt;code&gt;/health&lt;/code&gt; through the primary ALB every 10 seconds. Two consecutive failures mark the record unhealthy.&lt;/li&gt;
&lt;li&gt;DNS flips to the secondary ALB. About 30 seconds plus TTL. &lt;strong&gt;No human.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A CloudWatch alarm pages someone through SNS.&lt;/li&gt;
&lt;li&gt;That someone runs &lt;code&gt;./scripts/failover.sh&lt;/code&gt;: promote the replica and scale the ASG &lt;strong&gt;in parallel&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;New instances come up against a now-writable database, pass &lt;code&gt;/health&lt;/code&gt;, and Paris serves.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The secondary DNS record &lt;strong&gt;does not&lt;/strong&gt; evaluate target health. While the pilot light is still warming, Route 53 would otherwise have zero healthy answers. Sending clients to a region that is about to be ready beats sending them nowhere.&lt;/p&gt;

&lt;p&gt;Verify with the header the API already returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-si&lt;/span&gt; https://&amp;lt;your-domain&amp;gt;/health | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; x-serving-region

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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