<?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>Forem: Mouheb GHABRI</title>
    <description>The latest articles on Forem by Mouheb GHABRI (@mouheb_ghabri_3146951706c).</description>
    <link>https://forem.com/mouheb_ghabri_3146951706c</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%2F1786013%2Fd11fec99-7946-4f83-a881-c9c5ce8c8d51.png</url>
      <title>Forem: Mouheb GHABRI</title>
      <link>https://forem.com/mouheb_ghabri_3146951706c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mouheb_ghabri_3146951706c"/>
    <language>en</language>
    <item>
      <title>Debugging Hidden AWS Costs: From “Others” in Cost Explorer to a Real Root Cause</title>
      <dc:creator>Mouheb GHABRI</dc:creator>
      <pubDate>Thu, 07 May 2026 15:59:53 +0000</pubDate>
      <link>https://forem.com/aws-builders/debugging-hidden-aws-costs-from-others-in-cost-explorer-to-a-real-root-cause-a9l</link>
      <guid>https://forem.com/aws-builders/debugging-hidden-aws-costs-from-others-in-cost-explorer-to-a-real-root-cause-a9l</guid>
      <description>&lt;p&gt;I had an AWS account that was supposed to be almost empty.&lt;/p&gt;

&lt;p&gt;Most of the resources had already been deleted. Some cleanup had been done manually, and some of it had been done through tools like Terraform. So the expectation was simple:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No active resources = no meaningful cost&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But Cost Explorer was still showing small charges.&lt;/p&gt;

&lt;p&gt;The amount was tiny, around a few fractions of a cent, but the problem was not the amount itself. The problem was that the charge was unclear.&lt;/p&gt;

&lt;p&gt;In the AWS Cost Explorer UI, part of the cost appeared under vague categories like:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Others&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That was not enough to understand what was happening.&lt;/p&gt;

&lt;p&gt;The real question was:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Why is an account that looks empty still generating cost?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual problem
&lt;/h2&gt;

&lt;p&gt;At first, the charge looked confusing because the UI did not clearly explain the source.&lt;/p&gt;

&lt;p&gt;A small AWS bill can still hide important information:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Is there an orphaned resource?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is AWS Config still recording resources?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is Control Tower recreating or managing something?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is CloudTrail charging money?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is a service making API calls in the background?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is there still a queue, log group, KMS key, bucket, or automation running?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So the goal was not to save &lt;u&gt;$0.003.&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;The goal was to prove whether the cost was:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Expected baseline activity&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Orphaned infrastructure&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Governance-related activity&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Service-generated API usage&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Unexpected user or automation activity&lt;/em&gt;&lt;br&gt;
&lt;em&gt;That is the real reason this investigation matters.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The mistake to avoid
&lt;/h2&gt;

&lt;p&gt;It’s not a real mistake but sometimes the first instinct is often to start with CloudTrail.&lt;/p&gt;

&lt;p&gt;That feels logical because CloudTrail shows activity and API calls, But CloudTrail does not answer the first billing question.&lt;/p&gt;

&lt;p&gt;CloudTrail can tell you:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Who did something?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- When did it happen?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Which API was called?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Which service was involved?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But CloudTrail does not directly tell you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Which AWS billing line charged money?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
So the better approach is to do not start with CloudTrail but start with Cost Explorer API because it tells you what was actually billed, while CloudTrail only tells you what activity happened.&lt;/p&gt;

&lt;p&gt;Why Cost Explorer API and not Cost Expolorer console ?, because Cost Explorer API because it lets you query the exact billing dimensions directly, while the Console is better for visual overview but can hide small charges inside grouped categories.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I did first
&lt;/h2&gt;

&lt;p&gt;I isolated one exact billing day.&lt;/p&gt;

&lt;p&gt;For example:&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="nv"&gt;START_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"2026-05-06"&lt;/span&gt;
&lt;span class="nv"&gt;END_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"2026-05-07"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters because AWS Cost Explorer uses an exclusive end date.&lt;/p&gt;

&lt;p&gt;So this range means only May 6, 2026. This avoids mixing multiple days together and makes the investigation cleaner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I asked Cost Explorer the right question
&lt;/h2&gt;

&lt;p&gt;Instead of relying on the UI, I queried Cost Explorer by:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Service&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Usage Type&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Cost&lt;/em&gt;&lt;br&gt;
The key command was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ce get-cost-and-usage &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--time-period&lt;/span&gt; &lt;span class="nv"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$START_DATE&lt;/span&gt;,End&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$END_DATE&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--granularity&lt;/span&gt; DAILY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metrics&lt;/span&gt; UnblendedCost &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-by&lt;/span&gt; &lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DIMENSION,Key&lt;span class="o"&gt;=&lt;/span&gt;SERVICE &lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DIMENSION,Key&lt;span class="o"&gt;=&lt;/span&gt;USAGE_TYPE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
    .ResultsByTime[0].Groups[]
    | select((.Metrics.UnblendedCost.Amount | tonumber) &amp;gt; 0)
    | [
        .Keys[0],
        .Keys[1],
        .Metrics.UnblendedCost.Amount,
        .Metrics.UnblendedCost.Unit
      ]
    | @tsv
  '&lt;/span&gt; | column &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'\t'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This changed the investigation.&lt;/p&gt;

&lt;p&gt;Instead of seeing only vague UI categories, the API showed the real billing lines.&lt;/p&gt;

&lt;p&gt;In this case, the important result was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS Config  ConfigurationItemRecorded       0.003  USD
AWS Config  EUW2-ConfigurationItemRecorded  0.003  USD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That immediately narrowed the problem. The charge was not random.&lt;/p&gt;

&lt;p&gt;It was not just “Others.” It was &lt;strong&gt;AWS Config.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the usage type told me
&lt;/h2&gt;

&lt;p&gt;The usage type was: &lt;em&gt;ConfigurationItemRecorded&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That means AWS Config recorded a configuration item.&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AWS Config saw a resource or configuration state and recorded it.&lt;br&gt;
That recording generated a billable configuration item.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The second usage type included a region prefix: &lt;em&gt;EUW2-ConfigurationItemRecorded&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That pointed to: eu-west-2&lt;/p&gt;

&lt;p&gt;So now the investigation had a real chain:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Service = AWS Config&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Usage type = ConfigurationItemRecorded&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Region = eu-west-2&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Cost = about 0.006 USD total&lt;/em&gt;&lt;br&gt;
This was already much better than the original Cost Explorer UI view.&lt;/p&gt;
&lt;h2&gt;
  
  
  Then I checked the region
&lt;/h2&gt;

&lt;p&gt;To confirm where the cost happened, I grouped Cost Explorer by region and service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ce get-cost-and-usage &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--time-period&lt;/span&gt; &lt;span class="nv"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$START_DATE&lt;/span&gt;,End&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$END_DATE&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--granularity&lt;/span&gt; DAILY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metrics&lt;/span&gt; UnblendedCost &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-by&lt;/span&gt; &lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DIMENSION,Key&lt;span class="o"&gt;=&lt;/span&gt;REGION &lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DIMENSION,Key&lt;span class="o"&gt;=&lt;/span&gt;SERVICE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
    .ResultsByTime[0].Groups[]
    | select((.Metrics.UnblendedCost.Amount | tonumber) &amp;gt; 0)
    | [
        (.Keys[0] // "NoRegion"),
        .Keys[1],
        .Metrics.UnblendedCost.Amount,
        .Metrics.UnblendedCost.Unit
      ]
    | @tsv
  '&lt;/span&gt; | column &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'\t'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I grouped by region and usage type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ce get-cost-and-usage &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--time-period&lt;/span&gt; &lt;span class="nv"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$START_DATE&lt;/span&gt;,End&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$END_DATE&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--granularity&lt;/span&gt; DAILY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metrics&lt;/span&gt; UnblendedCost &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group-by&lt;/span&gt; &lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DIMENSION,Key&lt;span class="o"&gt;=&lt;/span&gt;REGION &lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DIMENSION,Key&lt;span class="o"&gt;=&lt;/span&gt;USAGE_TYPE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
    .ResultsByTime[0].Groups[]
    | select((.Metrics.UnblendedCost.Amount | tonumber) &amp;gt; 0)
    | [
        (.Keys[0] // "NoRegion"),
        .Keys[1],
        .Metrics.UnblendedCost.Amount,
        .Metrics.UnblendedCost.Unit
      ]
    | @tsv
  '&lt;/span&gt; | column &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'\t'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This step is important because some AWS usage types include region prefixes, and others do not.&lt;/p&gt;

&lt;p&gt;At this point, the direction was clear: Investigate &lt;em&gt;AWS Config in eu-west-2&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I checked AWS Config itself
&lt;/h2&gt;

&lt;p&gt;Since Cost Explorer showed AWS Config, the next step was to inspect AWS Config directly.&lt;/p&gt;

&lt;p&gt;Write on Medium&lt;br&gt;
I checked whether a configuration recorder existed:&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="nv"&gt;REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"eu-west-2"&lt;/span&gt;

aws configservice describe-configuration-recorders &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'ConfigurationRecorders[*].{Name:name,RoleARN:roleARN,AllSupported:recordingGroup.allSupported,IncludeGlobal:recordingGroup.includeGlobalResourceTypes}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I checked whether it was recording:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configservice describe-configuration-recorder-status &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'ConfigurationRecordersStatus[*].{Name:name,Recording:recording,LastStatus:lastStatus,LastStatusChange:lastStatusChangeTime}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I checked discovered resource counts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configservice get-discovered-resource-counts &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then listed discovered resources:&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="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"RESOURCE_TYPE&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;RESOURCE_ID&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;RESOURCE_NAME&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;type &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;aws configservice get-discovered-resource-counts &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'resourceCounts[*].resourceType'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do

    &lt;/span&gt;aws configservice list-discovered-resources &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--resource-type&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--output&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
        .resourceIdentifiers[]
        | [
            .resourceType,
            .resourceId,
            (.resourceName // "-")
          ]
        | @tsv
      '&lt;/span&gt;

  &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; | column &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'\t'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This step answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is AWS Config enabled?&lt;/li&gt;
&lt;li&gt;Is it recording?&lt;/li&gt;
&lt;li&gt;What resources does it still know about?&lt;/li&gt;
&lt;li&gt;Is this coming from a managed baseline?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Then I used CloudTrail, but only after Cost Explorer
&lt;/h2&gt;

&lt;p&gt;After identifying AWS Config as the billing service, CloudTrail became useful.&lt;/p&gt;

&lt;p&gt;The purpose of CloudTrail was not to find the cost. The purpose was to correlate activity.&lt;/p&gt;

&lt;p&gt;I checked events in the same region and same day:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws cloudtrail lookup-events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--start-time&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;START_DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;T00:00:00Z"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--end-time&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;END_DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;T00:00:00Z"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'sort_by(Events,&amp;amp;EventTime)[*].[EventTime,Username,EventName,EventSource]'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I filtered for AWS Config activity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws cloudtrail lookup-events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lookup-attributes&lt;/span&gt; &lt;span class="nv"&gt;AttributeKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;EventSource,AttributeValue&lt;span class="o"&gt;=&lt;/span&gt;config.amazonaws.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--start-time&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;START_DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;T00:00:00Z"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--end-time&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;END_DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;T00:00:00Z"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'sort_by(Events,&amp;amp;EventTime)[*].[EventTime,Username,EventName,EventSource]'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I checked the actor details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws cloudtrail lookup-events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt; &lt;span class="nv"&gt;$REGION&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--start-time&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;START_DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;T00:00:00Z"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--end-time&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;END_DATE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;T00:00:00Z"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
    .Events[]
    | .CloudTrailEvent
    | fromjson
    | [
        .eventTime,
        .eventSource,
        .eventName,
        .userIdentity.type,
        (.userIdentity.arn // "-"),
        (.userAgent // "-"),
        (.sourceIPAddress // "-")
      ]
    | @tsv
  '&lt;/span&gt; | column &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'\t'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helped separate possible sources:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Human user&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- AWSReservedSSO role&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- AWS service&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Control Tower execution role&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- CloudFormation StackSet&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Scheduled automation&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Application activity&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The investigation showed that the paid service was AWS Config.&lt;/p&gt;

&lt;p&gt;CloudTrail itself was not the source of the charge, this was an important correction.&lt;/p&gt;

&lt;p&gt;The notes explicitly state that AWS Config caused the charge, while CloudTrail showed &lt;code&gt;FreeEventsRecorded = 0 USD&lt;/code&gt;. So CloudTrail helped investigate the activity, but it was not the paid service.&lt;/p&gt;

&lt;p&gt;The root cause chain became:&lt;/p&gt;

&lt;p&gt;Cost Explorer UI showed unclear “Others”&lt;br&gt;
→ Cost Explorer API exposed AWS Config charges&lt;br&gt;
→ Usage type showed ConfigurationItemRecorded&lt;br&gt;
→ Region prefix EUW2 pointed to eu-west-2&lt;br&gt;
→ AWS Config showed discovered resources / recorder activity&lt;br&gt;
→ CloudTrail helped correlate activity&lt;br&gt;
→ Conclusion: AWS Config recording caused the cost&lt;/p&gt;

&lt;h2&gt;
  
  
  The final conclusion
&lt;/h2&gt;

&lt;p&gt;The small charge was not random.&lt;/p&gt;

&lt;p&gt;It came from: AWS Config recording configuration items&lt;/p&gt;

&lt;p&gt;The likely reason was: Control Tower-managed baseline governance&lt;/p&gt;

&lt;p&gt;So the account was not necessarily “dirty” with normal application resources. Instead, it still had governance/baseline services active.&lt;/p&gt;

&lt;p&gt;That is a different type of problem.&lt;/p&gt;

&lt;p&gt;The solution is not always to delete a bucket, queue, or instance. The solution may be to understand whether the account is still governed by Control Tower and whether AWS Config is intentionally managed as part of that baseline.&lt;/p&gt;

&lt;p&gt;Why this investigation was worth doing&lt;br&gt;
For a one-time charge of &lt;code&gt;$0.003&lt;/code&gt;, spending a lot of time would not make sense.&lt;/p&gt;

&lt;p&gt;But for a repeated tiny charge in an account that should be clean, it is worth investigating, not because of the money.&lt;/p&gt;

&lt;p&gt;Because it answers:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Is something still running?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is the account still governed?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is cleanup incomplete?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is a service being recreated?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is an automation still active?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- Is the billing source expected or unexpected?&lt;/em&gt;&lt;br&gt;
In this case, the investigation was useful because it corrected a wrong assumption.&lt;/p&gt;

&lt;p&gt;→ The charge was not CloudTrail.&lt;/p&gt;

&lt;p&gt;→ The charge was AWS Config.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reusable debugging model
&lt;/h2&gt;

&lt;p&gt;The final model is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost Explorer API = what was billed&lt;/li&gt;
&lt;li&gt;Usage Type = why it was billed&lt;/li&gt;
&lt;li&gt;Region grouping = where it was billed&lt;/li&gt;
&lt;li&gt;Service API = what exists&lt;/li&gt;
&lt;li&gt;CloudTrail = who or what acted&lt;/li&gt;
&lt;li&gt;RCA = final explanation and mitigation
This makes the process reusable for other services too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;KMS-Requests&lt;br&gt;
→ Check KMS keys and CloudTrail KMS events&lt;/p&gt;

&lt;p&gt;TimedStorage-ByteHrs&lt;br&gt;
→ Check CloudWatch log groups and retention&lt;/p&gt;

&lt;p&gt;Requests-Tier8&lt;br&gt;
→ Check the related service API and CloudTrail events&lt;/p&gt;

&lt;p&gt;DataTransfer-Out-Bytes&lt;br&gt;
→ Check VPC, NAT Gateway, S3, CloudFront, ELB, or other traffic sources&lt;/p&gt;

&lt;h2&gt;
  
  
  The root cause format
&lt;/h2&gt;

&lt;p&gt;A clean RCA should look like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Root cause:&lt;br&gt;
AWS Config generated cost because ConfigurationItemRecorded occurred in eu-west-2 on May 6, 2026.&lt;br&gt;
Evidence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cost Explorer showed:
AWS Config / ConfigurationItemRecorded / 0.003 USD
AWS Config / EUW2-ConfigurationItemRecorded / 0.003 USD&lt;/li&gt;
&lt;li&gt;Region grouping showed:
eu-west-2&lt;/li&gt;
&lt;li&gt;AWS Config API showed:
Configuration recorder and discovered resource state&lt;/li&gt;
&lt;li&gt;CloudTrail showed:
Related activity and actor context
Impact:
About 0.006 USD on May 6, 2026.
Conclusion:
The charge was expected if the account is still managed by Control Tower baseline governance.
Mitigation:
Leave it if Control Tower governance is required.
If the account is being retired, remove it properly from Control Tower governance.
Do not manually delete Control Tower-managed resources unless the governance impact is understood.
## Final takeaway&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;The issue was not the tiny cost.&lt;/p&gt;

&lt;p&gt;The issue was lack of attribution.&lt;/p&gt;

&lt;p&gt;The plan solved that by turning an unclear billing symptom into a technical explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS was not charging randomly.&lt;/li&gt;
&lt;li&gt;Cost Explorer UI was only unclear.&lt;/li&gt;
&lt;li&gt;The API exposed AWS Config as the paid service.&lt;/li&gt;
&lt;li&gt;The usage type explained the billing action.&lt;/li&gt;
&lt;li&gt;The region pointed to eu-west-2.&lt;/li&gt;
&lt;li&gt;CloudTrail helped confirm activity, but was not the cost source.
That is why this debugging chain is useful.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conculsion
&lt;/h2&gt;

&lt;p&gt;This investigation showed that the real problem was not the small amount of money, but the lack of clear attribution. Cost Explorer Console gave a vague view, while the Cost Explorer API exposed the exact billing lines: the charge came from AWS Config recording configuration items, not from CloudTrail. CloudTrail was useful only after the billing source was identified, because it helped correlate activity and actors. The correct debugging chain is therefore: start with Cost Explorer API to find what was billed, use usage type and region to understand why and where it was billed, then use service APIs and CloudTrail to explain the technical root cause.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cost</category>
      <category>cloud</category>
      <category>finop</category>
    </item>
    <item>
      <title>Control vs Responsibility: Choosing the Right Cloud Operating Model</title>
      <dc:creator>Mouheb GHABRI</dc:creator>
      <pubDate>Thu, 26 Mar 2026 21:39:10 +0000</pubDate>
      <link>https://forem.com/mouheb_ghabri_3146951706c/control-vs-responsibility-choosing-the-right-cloud-operating-model-2c01</link>
      <guid>https://forem.com/mouheb_ghabri_3146951706c/control-vs-responsibility-choosing-the-right-cloud-operating-model-2c01</guid>
      <description>&lt;p&gt;Cloud architecture is not a maturity ladder. It is a series of trade-offs between control and operational responsibility.&lt;/p&gt;

&lt;p&gt;That distinction matters because many teams still frame the conversation the wrong way. They debate on-premises versus cloud as if one is inherently more advanced than the other. In practice, the better question is simpler: where does control create real business or technical value, and where is it just another system your team now has to operate?&lt;/p&gt;

&lt;p&gt;The most expensive architecture decision is often the one made for comfort. Teams keep control they do not need, or hand off control they later realize was essential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On-Prem: maximum control, maximum burden&lt;/strong&gt;&lt;br&gt;
On-premises still has a place, but only when the reasons are concrete and durable. If you own the hardware, network, and security boundaries end to end, you can optimize for determinism, isolation, and performance in ways public cloud often cannot match.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That control comes with a price:&lt;/em&gt; capacity planning, patching, hardware lifecycle management, resilience engineering, physical security, and slower adaptation when demand changes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where it still makes sense:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strict regulatory or sovereignty requirements that require physical control.&lt;/li&gt;
&lt;li&gt;Specialized hardware environments such as HPC, ultra-low-latency systems, or tightly coupled industrial workloads.&lt;/li&gt;
&lt;li&gt;Workloads where stable, predictable performance matters more than elasticity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A common mistake is keeping workloads on-prem because they are “critical.” Critical systems are not automatically better on hardware you manage yourself. In many cases, they are simply harder to modernize once they stay there too long.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IaaS - Infrastructure as a service: cloud infrastructure with familiar responsibilities&lt;/strong&gt; &lt;br&gt;
IaaS is where many organizations start because it feels familiar. You remove the burden of owning data centers, but you still manage operating systems, network design, patching strategy, runtime behavior, and much of the security model.&lt;/p&gt;

&lt;p&gt;That makes IaaS a valid choice, not a temporary embarrassment. It works well when you need control at the OS or network layer, when refactoring is not yet justified, or when legacy workloads have to move without major redesign.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where it fits well:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lift-and-shift migrations with limited appetite for application change.&lt;/li&gt;
&lt;li&gt;Workloads that require OS-level agents, custom networking, or specific runtime behavior.&lt;/li&gt;
&lt;li&gt;Transitional architectures where modernization will happen in phases, not all at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The misconception is that moving to IaaS means you are “cloud-native.” Usually it means you changed the hosting model, not the operating model. If your team still builds brittle VMs, scales manually, and treats instances as pets, you have imported old problems into a new billing model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PaaS - Platform as a service: Less control, more engineering leverage&lt;/strong&gt;&lt;br&gt;
PaaS starts to pay off when a team is willing to stop treating infrastructure customization as a default requirement. The platform takes over more of the operating stack, and in return you gain standardization, faster delivery, and less operational drag.&lt;/p&gt;

&lt;p&gt;This is often where engineering productivity improves materially, especially for product teams that need to ship features rather than maintain bespoke environments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where PaaS works best:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal or external APIs with predictable deployment patterns.&lt;/li&gt;
&lt;li&gt;Business applications that benefit from standard runtimes and managed services.&lt;/li&gt;
&lt;li&gt;Teams that want faster delivery cycles without building a platform team too early.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off is straightforward: platform constraints are real. If your application architecture depends on deep OS tuning, unusual middleware behavior, or custom deployment assumptions, PaaS will feel restrictive.&lt;/p&gt;

&lt;p&gt;A common mistake is adopting PaaS while still trying to preserve every legacy operational habit. If you spend your time fighting the platform, you are paying for abstraction without benefiting from it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FaaS - Function as a service: Operational simplicity, architectural discipline&lt;/strong&gt;&lt;br&gt;
FaaS is useful when the problem is event-driven and the team understands the implications. It is not “no servers.” It is giving the platform responsibility for provisioning, scaling, and availability at the execution layer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Used well, FaaS can be extremely effective:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event processing from queues, streams, object storage, or scheduled triggers.&lt;/li&gt;
&lt;li&gt;Spiky or unpredictable workloads where idle capacity would otherwise be wasteful.&lt;/li&gt;
&lt;li&gt;Short-lived tasks such as enrichment, transformation, automation, and integration logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But serverless is not a shortcut around architecture. It demands better architecture. You need to think carefully about cold starts, concurrency limits, idempotency, retries, observability, timeouts, and downstream bottlenecks.&lt;/p&gt;

&lt;p&gt;The biggest misconception is treating FaaS as a universal replacement for services. It is excellent for discrete event-driven work. It is often a poor fit for long-running processes, tightly coupled workflows, or systems that require consistent low-latency behavior under all conditions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SaaS - Software as a service: outsource the undifferentiated&lt;/strong&gt;&lt;br&gt;
SaaS is the right answer more often than engineers like to admit. If a capability is not part of your competitive advantage, building and running it yourself is usually a distraction.&lt;/p&gt;

&lt;p&gt;That is especially true for areas like collaboration, CRM, HR, ticketing, and many internal business workflows. The value comes from consuming the outcome, not rebuilding the machinery behind it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where SaaS is the obvious choice:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Commodity business capabilities that do not justify custom engineering.&lt;/p&gt;

&lt;p&gt;Organizations that need to scale operations quickly without growing platform overhead.&lt;/p&gt;

&lt;p&gt;Teams that want to focus engineering effort on differentiated products instead of internal tooling.&lt;/p&gt;

&lt;p&gt;The common mistake is rejecting SaaS because it limits customization. That is often the point. Many organizations do not need more flexibility; they need fewer one-off processes and less operational sprawl.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What experienced teams understand The real world is rarely pure&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A mature architecture usually combines several models at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core systems may remain on-prem or on IaaS because control is genuinely required.&lt;/li&gt;
&lt;li&gt;Product services often run on PaaS because delivery speed matters more than low-level tuning.&lt;/li&gt;
&lt;li&gt;Event pipelines are strong candidates for FaaS.&lt;/li&gt;
&lt;li&gt;Commodity capabilities should usually be SaaS unless there is a compelling reason otherwise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mistake is assuming every workload should move in the same direction. It should not. Architecture decisions should follow workload characteristics, team capability, compliance needs, latency requirements, and the cost of operating each layer over time.&lt;/p&gt;

&lt;p&gt;My view is simple: control is not an achievement. It is a liability unless it solves a real problem. Abstraction is not automatically progress either. If you give up the wrong control, you can create constraints that are just as expensive as the complexity you were trying to avoid.&lt;/p&gt;

&lt;p&gt;The best architectures are not built around ideology. They are built around deliberate choices about where to own complexity and where to buy 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%2Fn720zfmf7qtlyxfu7ai9.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%2Fn720zfmf7qtlyxfu7ai9.png" alt="Cloud computing spectrum diagram showing progression from On-Premises to IaaS, PaaS, FaaS (serverless), and SaaS, highlighting the trade-off from more control and responsibility to less control and less responsibility, with typical use cases for each layer." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AWS Organizations + IAM Identity Center: The ‘multi-account + access’ combo I use everywhere</title>
      <dc:creator>Mouheb GHABRI</dc:creator>
      <pubDate>Sat, 14 Feb 2026 17:37:37 +0000</pubDate>
      <link>https://forem.com/mouheb_ghabri_3146951706c/aws-organizations-iam-identity-center-the-multi-account-access-combo-i-use-everywhere-ii3</link>
      <guid>https://forem.com/mouheb_ghabri_3146951706c/aws-organizations-iam-identity-center-the-multi-account-access-combo-i-use-everywhere-ii3</guid>
      <description>&lt;p&gt;If you’re running more than a couple AWS accounts, two services show up again and again:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Organizations:&lt;/strong&gt; how you structure accounts and apply org-wide governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS IAM Identity Center (formerly AWS SSO):&lt;/strong&gt; how humans sign in once and get the right access across those accounts.&lt;/p&gt;

&lt;p&gt;Together, they’re the backbone of a clean multi-account setup: governance on top, access in the middle, workloads underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why multi-account is the default
&lt;/h2&gt;

&lt;p&gt;One AWS account feels simple… until you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple environments (dev / staging / prod)&lt;/li&gt;
&lt;li&gt;multiple teams&lt;/li&gt;
&lt;li&gt;different compliance boundaries&lt;/li&gt;
&lt;li&gt;and a real need for blast-radius control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A multi-account strategy gives you isolation by default, and AWS Organizations gives you the control plane to manage it all.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Organizations:
&lt;/h2&gt;

&lt;p&gt;Think of AWS Organizations as your “org chart” for AWS.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A management account (the top-level admin account for the org)&lt;/li&gt;
&lt;li&gt;Member accounts (where workloads live)&lt;/li&gt;
&lt;li&gt;Organizational Units (OUs) (folders to group accounts like Prod, Dev, Security, Sandbox)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consolidated billing (aka “one bill, many accounts, also you can benefit from savings”)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organizations lets you consolidate billing so you can:&lt;/li&gt;
&lt;li&gt;receive a single bill&lt;/li&gt;
&lt;li&gt;track costs per account&lt;/li&gt;
&lt;li&gt;benefit from pooled usage/discount sharing across accounts (depending on the discount model)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where governance meets FinOps: you keep accounts separated, but you don’t fragment your billing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“All features” mode&lt;/strong&gt;&lt;br&gt;
Organizations has an “all features” mode that unlocks deeper governance controls. Most real-world orgs end up enabling it because it’s required for advanced policies like SCPs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real power: Service Control Policies (SCPs)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SCPs are guardrails.&lt;br&gt;
A simple mental model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IAM policies in an account say “what can this principal do?”&lt;/li&gt;
&lt;li&gt;SCPs say “what is this account (or OU) allowed to do at all?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So even if someone has AdministratorAccess in an account, an SCP can still block certain actions (like disabling CloudTrail, changing regions, or deleting security tooling).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Important nuance: SCPs are not permission grants. They only limit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Beyond SCPs: other org policies you should know&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Organizations supports additional policy types that help standardize at scale, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tag policies (enforce tag keys/values)&lt;/li&gt;
&lt;li&gt;Backup policies (baseline backup rules)&lt;/li&gt;
&lt;li&gt;AI services opt-out policies (control data usage for certain AI services)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re building a platform, these are your “consistency levers”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Permission boundaries (the missing middle layer)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SCPs are great for account/OU-wide guardrails, but they apply to everyone in that scope.&lt;br&gt;
​&lt;br&gt;
When you need guardrails for specific IAM roles/users (especially roles that can create other roles/policies), use IAM permission boundaries.&lt;/p&gt;

&lt;p&gt;A permission boundary is a managed policy that sets the maximum permissions an IAM user or role can ever have—no matter what identity-based policies you attach later.&lt;br&gt;
​&lt;br&gt;
Effective permissions become the intersection of: identity-based policy ∩ permission boundary ∩ SCP (and an explicit deny anywhere wins).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it shines:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delegating IAM to teams safely (e.g., allow developers to create roles, but only within an approved boundary).&lt;/li&gt;
&lt;li&gt;Preventing privilege escalation in “self-service” environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  IAM Identity Center: how humans access all those accounts
&lt;/h2&gt;

&lt;p&gt;IAM Identity Center is what you use when you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one place for users to sign in&lt;/li&gt;
&lt;li&gt;centralized assignments across accounts&lt;/li&gt;
&lt;li&gt;consistent role patterns without hand-crafting IAM roles everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Permission sets = reusable access templates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Permission sets are the core concept.&lt;/p&gt;

&lt;p&gt;They’re basically “role recipes” you can stamp across accounts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ReadOnly&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PowerUser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Billing&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SecurityAudit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PlatformAdmin&lt;/code&gt; (careful with this one)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you assign a permission set to a user/group for an account, Identity Center provisions the corresponding roles in that account and keeps them aligned when you update the permission set.&lt;br&gt;
&lt;strong&gt;Identity sources: where your users live&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can plug Identity Center into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;its built-in directory&lt;/li&gt;
&lt;li&gt;Active Directory&lt;/li&gt;
&lt;li&gt;an external identity provider (often SAML for SSO, SCIM for provisioning)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick what matches how your company already manages identities.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Organizations + Identity Center fit together
&lt;/h2&gt;

&lt;p&gt;This is the pattern I see most:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Organizations to create/organize accounts into OUs (&lt;code&gt;Prod&lt;/code&gt;, &lt;code&gt;NonProd&lt;/code&gt;, &lt;code&gt;Security&lt;/code&gt;, &lt;code&gt;SharedServices&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Apply SCP guardrails at the OU level (strong in &lt;code&gt;Prod&lt;/code&gt;, relaxed in &lt;code&gt;Sandbox&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Use Identity Center permission sets to standardize human access.&lt;/li&gt;
&lt;li&gt;Assign access by groups, not individuals (e.g., &lt;code&gt;Developers&lt;/code&gt;, &lt;code&gt;SRE&lt;/code&gt;, &lt;code&gt;Security&lt;/code&gt;, &lt;code&gt;Finance&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Optionally use delegated administration so a non-management account can administer Identity Center day-to-day (common in a dedicated “Identity” or “Shared Services” account).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s how you keep the management account locked down while still enabling operational ownership.&lt;br&gt;
&lt;strong&gt;A practical baseline (what I’d implement first)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If I’m starting from scratch, I usually do this in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an Organization + enable all features.&lt;/li&gt;
&lt;li&gt;Design OUs: &lt;code&gt;Security&lt;/code&gt;, &lt;code&gt;Infrastructure&lt;/code&gt;/&lt;code&gt;Shared&lt;/code&gt;, &lt;code&gt;Prod&lt;/code&gt;, &lt;code&gt;NonProd&lt;/code&gt;, &lt;code&gt;Sandbox&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add SCPs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deny leaving the org (optional but common)&lt;/li&gt;
&lt;li&gt;protect logging/security services&lt;/li&gt;
&lt;li&gt;restrict regions if required&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable IAM Identity Center.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create permission sets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ReadOnly&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DeveloperPowerUser&lt;/code&gt; (no IAM)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OpsAdmin&lt;/code&gt; (tightly controlled)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SecurityAudit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign by groups to the right accounts/OUs.&lt;br&gt;
&lt;strong&gt;Common mistakes (that hurt later)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Putting workloads in the management account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Treating SCPs like IAM (they don’t grant permissions).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Giving broad permission sets and trying to “fix it later”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assigning access directly to users instead of groups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No OU strategy → you end up with “policy spaghetti”.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Your turn&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do you split your accounts?&lt;/li&gt;
&lt;li&gt;One account per app?&lt;/li&gt;
&lt;li&gt;One per environment?&lt;/li&gt;
&lt;li&gt;One per team?&lt;/li&gt;
&lt;li&gt;Or a hybrid (my usual choice)?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>iam</category>
      <category>cloud</category>
      <category>security</category>
    </item>
    <item>
      <title>Mastering Deployment Strategies on AWS: Big Bang, Rolling, Blue-Green, and Canary Explained</title>
      <dc:creator>Mouheb GHABRI</dc:creator>
      <pubDate>Fri, 24 Oct 2025 10:42:56 +0000</pubDate>
      <link>https://forem.com/aws-builders/mastering-deployment-strategies-on-aws-big-bang-rolling-blue-green-and-canary-explained-384f</link>
      <guid>https://forem.com/aws-builders/mastering-deployment-strategies-on-aws-big-bang-rolling-blue-green-and-canary-explained-384f</guid>
      <description>&lt;p&gt;Modern cloud applications are rarely static. They evolve continuously, new features, patches, infrastructure improvements. all require deployments that are safe, repeatable, and ideally, seamless. Choosing the right deployment strategy is essential to minimize downtime, reduce risk, and maintain user trust.&lt;/p&gt;

&lt;p&gt;AWS provides powerful tools to implement various _deployment _approaches, from simple, all-at-once updates to advanced traffic-shifting releases. In this post, we’ll break down four common strategies, Big Bang, Rolling, Blue-Green, and Canary — and explore how each can be applied in AWS environments.&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%2Fne7bsz9yheyduamfhyui.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%2Fne7bsz9yheyduamfhyui.png" alt="Deployment Strategies" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Big Bang Deployment
&lt;/h2&gt;

&lt;p&gt;A single, all-at-once release where the old system is taken down and the new version is brought up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Stop the old system, deploy everything, start the new system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use:&lt;/strong&gt; Small systems, low complexity, or when downtime is acceptable and coordination is straightforward.
-&lt;strong&gt;Pros:&lt;/strong&gt; Simple cutover, no need to maintain two versions in parallel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Requires downtime. High blast radius if something goes wrong. Demands a solid rollback plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; A tightly coupled database schema migration that touches many services at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;AWS Practical Example:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
In AWS, a Big Bang deployment might involve updating all EC2 instances or ECS tasks simultaneously. You could stop your existing EC2 instances, deploy a new AMI with the updated application, and restart the environment. Similarly, a full CloudFormation stack update could replace all resources at once. It’s straightforward but can cause downtime while the new environment initializes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rolling Deployment
&lt;/h2&gt;

&lt;p&gt;Gradually replace instances of the old version with the new version across your fleet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;br&gt;
Update a subset of servers or pods at a time, wait for health checks and metrics, then continue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;When to use:&lt;/strong&gt;&lt;br&gt;
Horizontal fleets where instances are interchangeable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;br&gt;
Minimal or no downtime. Limits the impact of defects. Easy to pause or roll back mid-rollout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Longer rollout time. Mixed versions run concurrently, which can expose compatibility issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
In a 10-server pool, drain one server, deploy the new version, validate, then proceed server by server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;AWS Practical Example:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
In AWS, this can be achieved using an Auto Scaling Group (ASG) with an instance refresh. The ASG replaces instances gradually using a new AMI, verifying each one through load balancer health checks. In ECS, the service scheduler manages rolling updates automatically, it spins up new tasks with the updated container image and drains the old ones as they become healthy. In EKS, Kubernetes deployments natively handle this through progressive pod replacement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blue-Green Deployment
&lt;/h2&gt;

&lt;p&gt;Run two identical production environments, “blue” and “green,” and switch traffic between them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Keep one environment live while you deploy and validate the new version on the idle one. Flip traffic when ready.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use:&lt;/strong&gt; You need near-zero downtime and fast, safe rollback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Near-zero downtime cutover. Instant rollback by switching traffic back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Doubles infrastructure costs while both are running. Requires data and config parity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Blue serves users; deploy to Green, run smoke and integration tests, then route traffic to Green. Blue becomes the fallback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;AWS Practical Example:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
On AWS, this can be implemented using an Application Load Balancer (ALB) with two target groups, one for Blue and one for Green. You deploy the new version to the Green environment, run automated health checks, and once validated, switch the ALB’s routing to the Green target group. If any issue is detected, you can immediately redirect traffic back to Blue. CodeDeploy, ECS, and Lambda all support native Blue-Green deployment modes to make this process safer and automated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canary Deployment
&lt;/h2&gt;

&lt;p&gt;Release to a small, representative subset of users or infrastructure first, then ramp up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Start with a small percentage of traffic, a single region, or a small instance group. Monitor real-world signals, then increase exposure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use:&lt;/strong&gt; You want real user telemetry and progressive confidence before full rollout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Early detection of regressions with limited impact. Flexible, data-driven ramp-up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Requires robust observability and routing controls. Version skew can add complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Ship to 1% of users in one region, validate error rates and latency, then step up to 5%, 25%, and 100%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;AWS Practical Example:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
In AWS, you can use traffic shifting to achieve canary deployments. For Lambda, CodeDeploy supports automatic canary rollouts by gradually increasing the percentage of traffic going to the new version over time. For ECS or EKS, canaries can be managed through an ALB or Route 53 weighted routing policies, where only a small portion of requests initially hit the new version. As monitoring through CloudWatch and X-Ray confirms stability, traffic is progressively increased until full rollout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right Strategy
&lt;/h2&gt;

&lt;p&gt;Each deployment strategy has its strengths and trade-offs, and the best choice depends on your system’s complexity, tolerance for downtime, and risk appetite.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Big Bang deployments&lt;/em&gt; are best suited for simple systems or infrequent releases where downtime is acceptable. They have high downtime, are difficult to roll back, but are low-cost since only one environment is maintained.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Rolling deployments&lt;/em&gt; work well for scalable fleets and web applications. They keep downtime low by updating instances in batches. Rollbacks are moderately complex but manageable, and costs remain low since no duplicate environments are needed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Blue-Green deployments&lt;/em&gt; are ideal for mission-critical applications where near-zero downtime and safe rollbacks are required. They make it easy to revert by switching traffic back to the previous environment, though they temporarily increase costs by running two environments in parallel.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Canary deployments&lt;/em&gt; shine in continuous delivery pipelines and high-traffic systems. They introduce minimal downtime, allow easy rollback, and provide a controlled way to monitor new releases in production. Their cost impact is moderate, as they may temporarily run multiple versions while gradually shifting traffic.&lt;/p&gt;

&lt;p&gt;Ultimately, Rolling deployments provide a balanced, low-risk starting point for most teams, while Blue-Green and Canary strategies deliver advanced safety for production-critical workloads.&lt;/p&gt;

&lt;p&gt;Deployment strategy isn’t just about pushing code, it’s about managing risk, user experience, and reliability. AWS gives you the flexibility to implement whichever approach best fits your team’s needs. The real mastery lies in understanding when to use each one, and how to automate and monitor it effectively.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Mouheb GHABRI</dc:creator>
      <pubDate>Sun, 20 Apr 2025 22:01:13 +0000</pubDate>
      <link>https://forem.com/mouheb_ghabri_3146951706c/-5g85</link>
      <guid>https://forem.com/mouheb_ghabri_3146951706c/-5g85</guid>
      <description></description>
      <category>performance</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
