<?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: Fernando Azevedo</title>
    <description>The latest articles on DEV Community by Fernando Azevedo (@fernando_azevedo_6844e930).</description>
    <link>https://dev.to/fernando_azevedo_6844e930</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%2F1787949%2F6b76fcdd-ad42-4051-833f-22554f10309f.jpg</url>
      <title>DEV Community: Fernando Azevedo</title>
      <link>https://dev.to/fernando_azevedo_6844e930</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fernando_azevedo_6844e930"/>
    <language>en</language>
    <item>
      <title>SnapStart on containers: the bake-off against provisioned concurrency</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:53:03 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/snapstart-on-containers-the-bake-off-against-provisioned-concurrency-2gad</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/snapstart-on-containers-the-bake-off-against-provisioned-concurrency-2gad</guid>
      <description>&lt;p&gt;On September 2, 2026 AWS extended Lambda SnapStart to functions packaged as container images — the format many organizations adopted because of a corporate deployment standard, or simply because they needed more than the 250 MB a .zip allows. The promise is honest: instead of pulling image layers and initializing the runtime for every new execution environment, Lambda snapshots the already-initialized environment when you publish the version and resumes from there. But trading initialization for a snapshot is not a neutral performance flag. It changes when you pay, what breaks, and where the deployment fails. This is the bake-off I would run before turning it on in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually got unlocked
&lt;/h2&gt;

&lt;p&gt;The blocker was never the snapshot mechanism — Firecracker had been freezing memory and disk since the original Java SnapStart. The blocker was the lifecycle contract: a container image can carry any runtime, and Lambda needed a standard way to know when initialization was done and when the environment came back from the freeze.&lt;/p&gt;

&lt;p&gt;That contract is now public, and it lives in the Runtime API. At the end of your initialization, if &lt;code&gt;AWS_LAMBDA_INITIALIZATION_TYPE&lt;/code&gt; equals &lt;code&gt;snap-start&lt;/code&gt;, you run your before-snapshot hooks and call &lt;code&gt;GET /runtime/restore/next&lt;/code&gt;. The call blocks — the process literally parks there — until Lambda restores that environment from the snapshot and returns HTTP 200. Then you run the after-restore hooks and enter the normal invoke loop. Errors go to &lt;code&gt;/runtime/init/error&lt;/code&gt; (which fails &lt;code&gt;PublishVersion&lt;/code&gt;) or &lt;code&gt;/runtime/restore/error&lt;/code&gt; (which fails the in-flight invocation and tears the environment down).&lt;/p&gt;

&lt;p&gt;If you use the AWS base images for Java 11+, Python 3.12+ or .NET 8+, Lambda coordinates all of it and the experience is identical to .zip. If you bring your own base image, your own Runtime Interface Client, or the base images for &lt;code&gt;provided.al2023&lt;/code&gt;, Node.js and Ruby, there are two paths: implement &lt;code&gt;/restore/next&lt;/code&gt;, or declare &lt;code&gt;LABEL com.amazonaws.lambda.feature.snapstart="Allow"&lt;/code&gt; in the Dockerfile. Without one of the two, publishing the version simply fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SnapStart lifecycle for a container image
&lt;/h2&gt;

&lt;p&gt;Initialization moves off the request path and onto the deployment path. The cost meters follow the snapshot, not the invocation.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗️ Build e publicação
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dockerfile LABEL ...snapstart=Allow (ci)&lt;/li&gt;
&lt;li&gt;Amazon ECR imagem ≤ 10 GB descomprimida (storage)&lt;/li&gt;
&lt;li&gt;PublishVersion ApplyOn=PublishedVersions (ci)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❄️ Init único (tempo de deploy)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Init runtime + pesos do modelo (compute)&lt;/li&gt;
&lt;li&gt;beforeCheckpoint GET /runtime/restore/next (compute)&lt;/li&gt;
&lt;li&gt;Snapshot Firecracker cifrado, cacheado, replicado (storage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Invocação (tempo de request)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Restore retoma do snapshot (compute)&lt;/li&gt;
&lt;li&gt;afterRestore re-semeia CSPRNG, reconecta (security)&lt;/li&gt;
&lt;li&gt;Handler resposta ao cliente (compute)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Sinais de observabilidade
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;INIT_REPORT Init Duration (data)&lt;/li&gt;
&lt;li&gt;REPORT Restore + Billed Restore (data)&lt;/li&gt;
&lt;li&gt;X-Ray subsegmento Restore (data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💸 Medidores de cobrança
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cache do snapshot US$0,0000015046/GB-s (mín. 3h) (external)&lt;/li&gt;
&lt;li&gt;Restauração US$0,0001398 por GB (external)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;dockerfile -&amp;gt; ecr: docker push (same Region)&lt;/li&gt;
&lt;li&gt;ecr -&amp;gt; publish: image optimization → Active&lt;/li&gt;
&lt;li&gt;publish -&amp;gt; init: Lambda initializes exactly once&lt;/li&gt;
&lt;li&gt;init -&amp;gt; hook: max(timeout, 130 s) ceiling&lt;/li&gt;
&lt;li&gt;hook -&amp;gt; snap: blocks until frozen&lt;/li&gt;
&lt;li&gt;snap -&amp;gt; restore: resume per new environment&lt;/li&gt;
&lt;li&gt;restore -&amp;gt; after: HTTP 200 on /restore/next&lt;/li&gt;
&lt;li&gt;after -&amp;gt; handler: enters the invoke loop&lt;/li&gt;
&lt;li&gt;init -&amp;gt; initreport: init cost, at deploy time&lt;/li&gt;
&lt;li&gt;restore -&amp;gt; report: cold start = Restore + Duration&lt;/li&gt;
&lt;li&gt;restore -&amp;gt; xray: replaces Initialization&lt;/li&gt;
&lt;li&gt;snap -&amp;gt; cache: per active published version&lt;/li&gt;
&lt;li&gt;restore -&amp;gt; restorecost: per restored environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The physics: what the snapshot removes and what it does not
&lt;/h2&gt;

&lt;p&gt;SnapStart removes three expensive things from the request path: downloading and optimizing image layers, loading the runtime, and your own initialization — imports, framework wiring, schema compilation, loading model weights into memory. All of it now happens once per published version, at deployment time.&lt;/p&gt;

&lt;p&gt;What it does not remove is whatever is genuinely per-environment. Network connections opened during init have no guaranteed state after the resume; the AWS SDK usually reconnects on its own, the rest is your job in the after-restore hook. Entropy is the dangerous case: if you generated a UUID, a secret or a seed during init, that value goes into the snapshot and comes out identical in every restored environment. Lambda already helps on one sensitive point — with SnapStart active the runtime switches to container credentials (&lt;code&gt;AWS_CONTAINER_CREDENTIALS_FULL_URI&lt;/code&gt;) instead of the access-key variables, precisely so credentials do not expire frozen inside the snapshot.&lt;/p&gt;

&lt;p&gt;And there is a design inversion almost nobody catches on first reading: with SnapStart, &lt;code&gt;/tmp&lt;/code&gt; is capped at 512 MB, against the 10,240 MB a normal function can configure. The classic inference pattern — pulling weights from S3 into &lt;code&gt;/tmp&lt;/code&gt; during init — no longer fits. What is left is baking the weights into the image itself (up to 10 GB uncompressed) and loading them into memory, where the snapshot captures them already materialized. That is exactly the scenario AWS cites, but it requires rewriting how you load, not just flipping the flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four ways to kill cold start on a large artifact
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Container + SnapStart&lt;/th&gt;
&lt;th&gt;Container + Provisioned concurrency&lt;/th&gt;
&lt;th&gt;.zip + SnapStart&lt;/th&gt;
&lt;th&gt;Always-on ECS Fargate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cold start&lt;/td&gt;
&lt;td&gt;Sub-second (Restore + Duration)&lt;/td&gt;
&lt;td&gt;Double-digit ms, no cold start&lt;/td&gt;
&lt;td&gt;Sub-second, no image pull&lt;/td&gt;
&lt;td&gt;Zero at steady state; minutes to scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed monthly cost (2 GB, us-east-1)&lt;/td&gt;
&lt;td&gt;~US$7.80 per published version&lt;/td&gt;
&lt;td&gt;~US$21.60 per provisioned unit&lt;/td&gt;
&lt;td&gt;~US$7.80 per published version&lt;/td&gt;
&lt;td&gt;vCPU + GB per second, 24×7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per startup&lt;/td&gt;
&lt;td&gt;US$0.00028 per restore (2 GB)&lt;/td&gt;
&lt;td&gt;None; you already paid all along&lt;/td&gt;
&lt;td&gt;US$0.00028 per restore (2 GB)&lt;/td&gt;
&lt;td&gt;None, but idle time is billed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artifact ceiling&lt;/td&gt;
&lt;td&gt;10 GB uncompressed, via ECR&lt;/td&gt;
&lt;td&gt;10 GB uncompressed, via ECR&lt;/td&gt;
&lt;td&gt;250 MB unzipped&lt;/td&gt;
&lt;td&gt;No practical ceiling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ephemeral storage (/tmp)&lt;/td&gt;
&lt;td&gt;512 MB maximum&lt;/td&gt;
&lt;td&gt;Up to 10,240 MB&lt;/td&gt;
&lt;td&gt;512 MB maximum&lt;/td&gt;
&lt;td&gt;Task volume, configurable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtimes covered&lt;/td&gt;
&lt;td&gt;Java 11+, Python 3.12+, .NET 8+ and custom bases with hooks&lt;/td&gt;
&lt;td&gt;Any runtime&lt;/td&gt;
&lt;td&gt;Java 11+, Python 3.12+, .NET 8+ only&lt;/td&gt;
&lt;td&gt;Any runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invocation target&lt;/td&gt;
&lt;td&gt;Published version or alias only&lt;/td&gt;
&lt;td&gt;Provisioned version or alias&lt;/td&gt;
&lt;td&gt;Published version or alias only&lt;/td&gt;
&lt;td&gt;Load balancer endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical failure mode&lt;/td&gt;
&lt;td&gt;PublishVersion fails; non-unique state leaks across environments&lt;/td&gt;
&lt;td&gt;Concurrency spillover falls back to cold start&lt;/td&gt;
&lt;td&gt;Dependencies do not fit in 250 MB&lt;/td&gt;
&lt;td&gt;Idle capacity becomes the biggest line item&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The math, using the published prices
&lt;/h2&gt;

&lt;p&gt;The us-east-1, x86 numbers: snapshot cache at US$0.0000015046 per GB-second, restore at US$0.0001397998 per GB, provisioned concurrency at US$0.0000041667 per GB-s and on-demand duration at US$0.0000166667 per GB-s. For Java managed runtimes the documentation waives the SnapStart price; the math below applies to Python and .NET.&lt;/p&gt;

&lt;p&gt;A 2 GB function with one published version kept active for a full month costs roughly &lt;strong&gt;US$7.80&lt;/strong&gt; in cache alone. A single provisioned concurrency unit at the same 2 GB costs roughly &lt;strong&gt;US$21.60&lt;/strong&gt; a month. Each 2 GB restore costs US$0.00028 — meaning you would need approximately &lt;strong&gt;77,000 restores per month&lt;/strong&gt; for SnapStart's variable cost to match &lt;em&gt;one&lt;/em&gt; provisioned unit. For the overwhelming majority of APIs, SnapStart wins by a wide margin.&lt;/p&gt;

&lt;p&gt;The problem is not the unit price; it is the multiplication. The cache charge is &lt;strong&gt;per published version&lt;/strong&gt; and continues for as long as the version exists, with a 3-hour billing minimum. A pipeline that publishes a version on every merge and never prunes leaves dozens of paid snapshots running behind it. Twenty forgotten 2 GB versions cost more than US$150 a month to serve exactly zero traffic. Add that Lambda periodically regenerates snapshots to apply runtime patches, and each re-run of your init is billed. A version retention policy stops being hygiene and becomes financial control.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would decide, by workload profile
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Container + SnapStart
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best latency-per-dollar for bursty traffic with a large artifact&lt;/li&gt;
&lt;li&gt;Keeps the corporate container deployment standard and the ECR pipeline intact&lt;/li&gt;
&lt;li&gt;Model weights loaded into memory enter the snapshot already materialized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The 512 MB /tmp cap kills the download-from-S3-during-init pattern&lt;/li&gt;
&lt;li&gt;Requires a uniqueness audit: entropy, IDs and connections opened during init&lt;/li&gt;
&lt;li&gt;Incompatible with provisioned concurrency — no hedging possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; The default for interactive APIs and inference with weights baked into the image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Container + provisioned concurrency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double-digit millisecond startup, with no resume step at all&lt;/li&gt;
&lt;li&gt;Works with any runtime and with /tmp up to 10 GB&lt;/li&gt;
&lt;li&gt;No uniqueness requirements on the initialization code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Roughly 2.8× the snapshot cache cost per equivalent GB-hour&lt;/li&gt;
&lt;li&gt;Sizing it wrong is expensive; spillover falls back to a full cold start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Only when the SLO is strict enough that the resume step does not fit inside it.&lt;/p&gt;

&lt;h3&gt;
  
  
  .zip + SnapStart
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No image optimization step and no container Pending/Inactive state&lt;/li&gt;
&lt;li&gt;Lifecycle coordinated by the managed runtime, zero hook code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;250 MB unzipped is not much for ML dependencies&lt;/li&gt;
&lt;li&gt;Moving from container to .zip requires a brand-new function — package type is immutable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Still the simplest path when dependencies fit. Not somewhere to migrate to.&lt;/p&gt;

&lt;h3&gt;
  
  
  Always-on ECS Fargate
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No runtime, /tmp or state-uniqueness restrictions&lt;/li&gt;
&lt;li&gt;Persistent connections, warm local cache and long-running processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You pay for idle 24×7 and inherit scaling, patching and a load balancer&lt;/li&gt;
&lt;li&gt;Scaling out takes minutes, not milliseconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Justified by high sustained utilization, not by fear of cold starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What now breaks in the pipeline, not in the request
&lt;/h2&gt;

&lt;p&gt;This is the part that interests me most as an architect: SnapStart moves initialization to deployment time, and it moves the failure modes along with it.&lt;/p&gt;

&lt;p&gt;Init and the before-snapshot hooks share a combined timeout of &lt;code&gt;max(function_timeout, 130 seconds)&lt;/code&gt;. Blow past it and &lt;code&gt;PublishVersion&lt;/code&gt; fails. An inference function that loads 4 GB of weights, and previously was merely slow on the first call, now breaks the release pipeline — which, honestly, is the right place to break, provided the pipeline treats it as a deployment error and not as a flake.&lt;/p&gt;

&lt;p&gt;Second: SnapStart only exists on a published version or an alias pointing at one. &lt;code&gt;$LATEST&lt;/code&gt; is never SnapStart. That means the development loop invoking &lt;code&gt;$LATEST&lt;/code&gt; exercises a different code path than production; contract tests need to hit the alias. Third: package type is immutable. You do not convert a container function to .zip — you create another function, with another ARN, another alias, other event source mappings. Plan it as a migration, not as a toggle.&lt;/p&gt;

&lt;p&gt;And there are the states that only show up under rare traffic. A container function left uninvoked for weeks has its optimized image reclaimed, returns to &lt;code&gt;Pending&lt;/code&gt; and &lt;strong&gt;rejects the first invocation&lt;/strong&gt;. For Java runtimes, the snapshot is deleted after 14 days without invocation and you get &lt;code&gt;SnapStartNotReadyException&lt;/code&gt;. Both are caller-retryable errors — as long as the caller has retry with backoff and the operation is idempotent. Without that, your low-traffic function has an error built into the calendar.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to measure this without fooling yourself
&lt;/h2&gt;

&lt;p&gt;The first side effect of SnapStart is that your cold-start dashboards silently stop working. The &lt;code&gt;Init Duration&lt;/code&gt; field &lt;strong&gt;disappears from &lt;code&gt;REPORT&lt;/code&gt;&lt;/strong&gt;, because initialization no longer happens at invocation; it moves to a separate record, &lt;code&gt;INIT_REPORT&lt;/code&gt;, along with the duration of the before-snapshot hooks. Two new fields appear in &lt;code&gt;REPORT&lt;/code&gt;: &lt;code&gt;Restore Duration&lt;/code&gt; and &lt;code&gt;Billed Restore Duration&lt;/code&gt;. They are not the same thing — the first includes work done outside the microVM, which the user waits for but you are not charged for; the second covers only runtime load and the after-restore hooks.&lt;/p&gt;

&lt;p&gt;The formula that matters is simple and needs to land in your SLO: &lt;strong&gt;cold start = &lt;code&gt;Restore Duration&lt;/code&gt; + &lt;code&gt;Duration&lt;/code&gt;&lt;/strong&gt;. If your alarm only looks at &lt;code&gt;@duration&lt;/code&gt;, it will show an improvement that does not exist. In X-Ray the change is analogous: there is no more &lt;code&gt;Initialization&lt;/code&gt; subsegment, there is &lt;code&gt;Restore&lt;/code&gt;. Through the Telemetry API you receive &lt;code&gt;platform.restoreStart&lt;/code&gt;, &lt;code&gt;platform.restoreRuntimeDone&lt;/code&gt; (with status success, failure or timeout) and &lt;code&gt;platform.restoreReport&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two practical details. The &lt;code&gt;AWS_LAMBDA_LOG_GROUP_NAME&lt;/code&gt; and &lt;code&gt;AWS_LAMBDA_LOG_STREAM_NAME&lt;/code&gt; variables do not exist in a SnapStart function — logging libraries that depend on them break quietly. And the honest measure of impact is not function duration: it is API Gateway's &lt;code&gt;IntegrationLatency&lt;/code&gt; or the function URL's &lt;code&gt;UrlRequestLatency&lt;/code&gt;, at p99 and p99.9. That is the only place you see what the client actually felt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five mistakes I would expect in the first three months
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Turning on &lt;code&gt;ApplyOn=PublishedVersions&lt;/code&gt; without auditing init: seeds, UUIDs and secrets generated before the snapshot become identical across every restored environment.&lt;/li&gt;
&lt;li&gt;Publishing a version per merge and never pruning — snapshot cache is billed per active version, with a 3-hour minimum, forever.&lt;/li&gt;
&lt;li&gt;Keeping the pattern of pulling model weights from S3 into &lt;code&gt;/tmp&lt;/code&gt; during init, ignoring the 512 MB cap SnapStart imposes.&lt;/li&gt;
&lt;li&gt;Testing against &lt;code&gt;$LATEST&lt;/code&gt; and concluding that 'nothing changed' — &lt;code&gt;$LATEST&lt;/code&gt; never uses SnapStart.&lt;/li&gt;
&lt;li&gt;Declaring victory based on &lt;code&gt;@duration&lt;/code&gt;, without adding &lt;code&gt;Restore Duration&lt;/code&gt; or looking at integration latency at the edge.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The real trade-off is not latency versus cost:&lt;/strong&gt; It is determinism versus uniqueness. Provisioned concurrency keeps N independent environments, each with its own entropy, its own connections and its own lifecycle. SnapStart keeps &lt;strong&gt;one&lt;/strong&gt; canonical initial state and clones it. Everything that was accidentally unique per environment becomes deliberately shared. In financial-grade systems that stops being a performance detail and becomes a correctness question: a cloned pseudorandom generator, a pre-computed idempotency token or a frozen connection pool produce bugs that never show up in load testing — they show up in reconciliation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Reading it through the pillars
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: The snapshot is encrypted, but any secret materialized during init gets cloned; fetch credentials in the handler and re-seed CSPRNGs on after-restore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: &lt;code&gt;SnapStartNotReadyException&lt;/code&gt; and the container &lt;code&gt;Pending&lt;/code&gt; state require caller-side retry with backoff and idempotent operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;performance&lt;/strong&gt;: Measure &lt;code&gt;Restore Duration&lt;/code&gt; + &lt;code&gt;Duration&lt;/code&gt; and validate against &lt;code&gt;IntegrationLatency&lt;/code&gt; at the edge; the improvement is only real at p99.9.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Curator's note:&lt;/strong&gt; I would turn this on, but in week three, not week one. The order I use is always the same: first instrument &lt;code&gt;Restore Duration&lt;/code&gt; in a staging environment against the real alias, then audit init hunting for entropy, credentials and connections — it is always that audit that surfaces the uncomfortable finding. Only then do I touch production. I once saw a payments system whose init pre-computed an idempotency-key suffix 'to save time'; under provisioned concurrency it never collided, because each environment had its own. With a cloned snapshot it would have collided, and the incident would not have shown up in latency — it would have shown up as a duplicated transaction, two days later, at close of books. Performance you cannot reconcile is not performance, it is debt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Recommendation
&lt;/h2&gt;

&lt;p&gt;For interactive APIs and inference packaged as container images, on Java 11+, Python 3.12+ or .NET 8+ over the AWS base images, SnapStart is now the default choice: it delivers sub-second startup at roughly a third of the monthly cost of an equivalent provisioned concurrency unit, and the restore-cost breakeven sits so far out (~77,000 restores a month at 2 GB) that it rarely matters. Reserve provisioned concurrency for endpoints whose SLO cannot absorb the resume step, or that need &lt;code&gt;/tmp&lt;/code&gt; above 512 MB. Do not migrate to .zip just to get SnapStart — package type is immutable and the benefit does not pay for the ARN swap. And before anything else, do two thoroughly unglamorous chores: a uniqueness audit of your init code, and an automated pruning policy for published versions. SnapStart is won or lost in those two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; 8.5/10&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/07/aws-lambda-snapstart-container/" rel="noopener noreferrer"&gt;AWS What's New — Lambda SnapStart for container image functions (Sep 2, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html" rel="noopener noreferrer"&gt;AWS Lambda Developer Guide — Improving startup performance with Lambda SnapStart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/snapstart-runtime-hooks-custom.html" rel="noopener noreferrer"&gt;AWS Lambda Developer Guide — Implementing SnapStart hooks for container images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/snapstart-activate.html" rel="noopener noreferrer"&gt;AWS Lambda Developer Guide — Activating and managing Lambda SnapStart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/snapstart-monitoring.html" rel="noopener noreferrer"&gt;AWS Lambda Developer Guide — Monitoring for Lambda SnapStart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/images-create.html" rel="noopener noreferrer"&gt;AWS Lambda Developer Guide — Create a Lambda function using a container image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/lambda/pricing/" rel="noopener noreferrer"&gt;AWS Lambda Pricing — SnapStart, provisioned concurrency and on-demand rates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/snapstart-em-container-o-bake-off-contra-concorrencia-provisionada-aws-lambda-n" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>awslambda</category>
      <category>snapstart</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Apps in Amazon Quick vs. App Studio vs. a custom build</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Wed, 02 Sep 2026 12:21:48 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/apps-in-amazon-quick-vs-app-studio-vs-a-custom-build-bh8</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/apps-in-amazon-quick-vs-app-studio-vs-a-custom-build-bh8</guid>
      <description>&lt;p&gt;Every company I have worked with carries the same invisible debt: somewhere between thirty and three hundred spreadsheets nobody versions, fed by manual exports from four different systems, and yet feeding credit decisions, capacity plans and the monthly close. The September 1, 2026 announcement — building apps in Amazon Quick by describing them in natural language — aims squarely at that debt. The risk is trading an ungoverned spreadsheet for an ungoverned app, now with a write connector and an AWS invoice attached. So I did not write a feature review: I wrote the bake-off I would run before approving the first app, across the four routes that genuinely compete for this work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the September 1 GA actually ships
&lt;/h2&gt;

&lt;p&gt;The Apps in Quick documentation says more than the announcement does. Seven capabilities matter architecturally: conversational authoring (the agent writes the code while you watch), &lt;strong&gt;live Quick Sight visual embeds&lt;/strong&gt; inside the app, &lt;strong&gt;action connectors&lt;/strong&gt; that call external APIs, built-in foundation-model inference for summarisation and classification, reading documents from spaces, &lt;strong&gt;persistent key-value storage&lt;/strong&gt; across sessions, and one-click publishing under Quick's SSO.&lt;/p&gt;

&lt;p&gt;Read that combination again: action connectors plus persistent key-value storage. This is not a prettier dashboard. It is an application with its own state and a write path into third-party systems, authored by conversation and published with one click. In a financial-grade environment, that is precisely the class of artefact a change board expects to see with an owner, a version and a rollback.&lt;/p&gt;

&lt;p&gt;Positioning matters too. Quick is the agentic-workspace evolution of QuickSight, and the docs already offer &lt;strong&gt;BYOI — Bring Your Own Amazon Q Business Index&lt;/strong&gt; plus attaching managed Bedrock knowledge bases. AWS is stitching the Q Business index and Bedrock knowledge into Quick. If your company has invested in either, the lowest-friction route now runs through Quick — and that weighs more in the decision than any "minutes to first app" benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four routes that actually compete
&lt;/h2&gt;

&lt;p&gt;Comparing Apps in Quick against "low-code" in the abstract helps nobody. In practice, when someone asks me for an internal tracker, there are four possible destinations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apps in Amazon Quick.&lt;/strong&gt; Authored by the business user, inside the workspace where they already chat, research and consume BI. Seat-based pricing. Available to Plus, Professional and Enterprise since September 1, 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS App Studio.&lt;/strong&gt; AWS's other natural-language builder, GA since November 2024, aimed at the "technical professional" — IT project manager, data engineer, architect. Connects to 200+ AWS services and to third parties through API/OpenAPI connectors. Charges &lt;strong&gt;$0.25 per user-hour&lt;/strong&gt; of the published app; the builder environment is free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A custom build.&lt;/strong&gt; Amplify/AppSync + Lambda + DynamoDB + Cognito, code in a repo, PRs, tests, pipeline. Expensive in engineering, cheap in audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No app at all.&lt;/strong&gt; A Quick Sight dashboard plus a Quick Flow. Half the "internal app" requests I receive are really one number on a screen and an email fired when it crosses a threshold. That route has to be on the table, or the comparison degenerates into a contest between builders when the right answer was to not build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Head-to-head: the dimensions that decide
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Apps in Amazon Quick&lt;/th&gt;
&lt;th&gt;AWS App Studio&lt;/th&gt;
&lt;th&gt;Custom build&lt;/th&gt;
&lt;th&gt;No app (Quick Sight + Flows)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who builds it&lt;/td&gt;
&lt;td&gt;The business user, conversationally&lt;/td&gt;
&lt;td&gt;Technical professional (IT, data, architecture)&lt;/td&gt;
&lt;td&gt;An engineering team with a backlog and priorities&lt;/td&gt;
&lt;td&gt;A BI analyst, in hours rather than weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing unit&lt;/td&gt;
&lt;td&gt;Seat/month ($20 Plus and Pro; $40 Enterprise)&lt;/td&gt;
&lt;td&gt;$0.25 per user-hour of the published app&lt;/td&gt;
&lt;td&gt;Service consumption plus engineering cost&lt;/td&gt;
&lt;td&gt;Already covered by the existing Quick seat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed floor&lt;/td&gt;
&lt;td&gt;$250/account/month infrastructure fee on Pro and Enterprise&lt;/td&gt;
&lt;td&gt;None; the builder environment is free&lt;/td&gt;
&lt;td&gt;Low on services, high on people&lt;/td&gt;
&lt;td&gt;No additional floor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where the code lives&lt;/td&gt;
&lt;td&gt;Generated and hosted inside Quick&lt;/td&gt;
&lt;td&gt;Generated and operated by App Studio&lt;/td&gt;
&lt;td&gt;In your Git, with diff and rollback&lt;/td&gt;
&lt;td&gt;There is no application code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity and authorization&lt;/td&gt;
&lt;td&gt;Inherited from Quick; RBAC/SSO listed as Enterprise-tier&lt;/td&gt;
&lt;td&gt;App Studio's own model layered over connectors&lt;/td&gt;
&lt;td&gt;Cognito/IAM with row-level entitlement if you write it&lt;/td&gt;
&lt;td&gt;Quick Sight dataset rules, already audited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writes into a system of record&lt;/td&gt;
&lt;td&gt;Yes, via conversationally authored action connectors&lt;/td&gt;
&lt;td&gt;Yes, via API/OpenAPI connectors&lt;/td&gt;
&lt;td&gt;Yes, with idempotency and retry you control&lt;/td&gt;
&lt;td&gt;No; read and notify only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit evidence&lt;/td&gt;
&lt;td&gt;To be confirmed: diff between generated app versions&lt;/td&gt;
&lt;td&gt;Builder versioning, no repository of your own&lt;/td&gt;
&lt;td&gt;Commit, PR, pipeline — evidence by construction&lt;/td&gt;
&lt;td&gt;Dataset lineage; minimal surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regional footprint&lt;/td&gt;
&lt;td&gt;Follows the Quick subscription Region&lt;/td&gt;
&lt;td&gt;US West (Oregon) and Europe (Ireland) only&lt;/td&gt;
&lt;td&gt;Any Region, including sa-east-1&lt;/td&gt;
&lt;td&gt;Follows the Quick subscription Region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to v1&lt;/td&gt;
&lt;td&gt;Minutes, by the process owner&lt;/td&gt;
&lt;td&gt;Hours to days, with a technical person driving&lt;/td&gt;
&lt;td&gt;Weeks, competing with the roadmap&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exit cost&lt;/td&gt;
&lt;td&gt;High: logic and state locked to the workspace&lt;/td&gt;
&lt;td&gt;High: no portable artefact of the app&lt;/td&gt;
&lt;td&gt;Low: it is your code&lt;/td&gt;
&lt;td&gt;Low: SQL and datasets are portable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The arithmetic almost nobody runs: seat versus user-hour
&lt;/h2&gt;

&lt;p&gt;The two AWS routes bill in incomparable units, and that is where the decision becomes FinOps. A Quick Enterprise seat costs &lt;strong&gt;$40/user/month&lt;/strong&gt;; App Studio charges &lt;strong&gt;$0.25 per user-hour&lt;/strong&gt;. The break-even is plain arithmetic: $40 ÷ $0.25 = &lt;strong&gt;160 user-hours per month&lt;/strong&gt;. A full working month is roughly 168 hours. So if the app is the &lt;em&gt;only&lt;/em&gt; reason to buy the seat, App Studio only loses when the person lives inside the app full time.&lt;/p&gt;

&lt;p&gt;The realistic scenario is the opposite. Forty occasional users at 3 hours a month each: 120 user-hours — &lt;strong&gt;$30/month&lt;/strong&gt; on App Studio. The same forty on Enterprise cost 40 × 40 plus the $250 infrastructure fee = &lt;strong&gt;$1,850/month&lt;/strong&gt;, or $22.2k a year. Sixty times more for the same app.&lt;/p&gt;

&lt;p&gt;Now invert it: if 250 users already hold Quick seats because they use chat, research and BI, the marginal cost of the app trends to zero and App Studio becomes a new line on the invoice. &lt;strong&gt;The right question is not which service is cheaper — it is whether the seat is already bought.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two hidden details. First, the &lt;strong&gt;$250/account/month&lt;/strong&gt; fee on Professional and Enterprise is a floor: at 10 users the effective rate jumps to $65/user. Second, the pricing page meters agent hours — 4 h/month on Professional, 8 h on Enterprise, &lt;strong&gt;$3 per overage agent hour&lt;/strong&gt;. Iterating an app by conversation consumes exactly that resource. Confirm with your account team whether those hours are per user or per account before turning a hundred people loose to "describe whatever they want".&lt;/p&gt;

&lt;h2&gt;
  
  
  Triage: three questions before you pick a builder
&lt;/h2&gt;

&lt;p&gt;The common mistake is starting from the tool. I start from what the app actually does — writes, evidence and usage profile — and let the tool fall out of the three answers.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧭 Triagem / Triage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Escreve no SoR? / Writes to SoR? Salesforce, ServiceNow, ERP (security)&lt;/li&gt;
&lt;li&gt;Vira evidência? / Regulated evidence? fechamento, risco, auditoria (security)&lt;/li&gt;
&lt;li&gt;Usuários × horas / Users × hours break-even: 160 h/user/month (compute)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 Apps in Amazon Quick — seat-based
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Apps in Quick conversational authoring, 1-click publish (ai)&lt;/li&gt;
&lt;li&gt;Action connectors + knowledge bases MCP, S3, Drive, OneDrive (external)&lt;/li&gt;
&lt;li&gt;Key-value storage state across sessions (storage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟦 AWS App Studio — user-hour
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;App Studio $0.25 / user-hour (compute)&lt;/li&gt;
&lt;li&gt;Oregon + Ireland only no sa-east-1 (network)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟩 Custom build — engineering owns it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Amplify / AppSync + Lambda code in Git, PR, tests (frontend)&lt;/li&gt;
&lt;li&gt;DynamoDB + Cognito row-level entitlement (data)&lt;/li&gt;
&lt;li&gt;CI/CD pipeline diff, rollback, evidence (ci)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 No app — the cheapest route
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Quick Sight + Quick Flows dashboard + automation (data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;req -&amp;gt; q1: 1. nature of the action&lt;/li&gt;
&lt;li&gt;q1 -&amp;gt; q2: read-only&lt;/li&gt;
&lt;li&gt;q1 -&amp;gt; amplify: writes to SoR → engineering&lt;/li&gt;
&lt;li&gt;q2 -&amp;gt; q3: not regulated evidence&lt;/li&gt;
&lt;li&gt;q2 -&amp;gt; cicd: is evidence → needs diff and rollback&lt;/li&gt;
&lt;li&gt;q3 -&amp;gt; quick: users already hold Quick seats&lt;/li&gt;
&lt;li&gt;q3 -&amp;gt; appstudio: many occasional users&lt;/li&gt;
&lt;li&gt;q3 -&amp;gt; qsight: it is just a number on a screen&lt;/li&gt;
&lt;li&gt;quick -&amp;gt; qconn: identity propagated per connector&lt;/li&gt;
&lt;li&gt;quick -&amp;gt; qkv: app state&lt;/li&gt;
&lt;li&gt;appstudio -&amp;gt; asreg: data sovereignty blocker&lt;/li&gt;
&lt;li&gt;amplify -&amp;gt; ddb: data + authorization&lt;/li&gt;
&lt;li&gt;amplify -&amp;gt; cicd: controlled promotion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Decision matrix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apps in Amazon Quick
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Near-zero marginal cost when the seats already exist&lt;/li&gt;
&lt;li&gt;Native Quick Sight embeds plus spaces and knowledge-base integration&lt;/li&gt;
&lt;li&gt;The process owner builds and iterates with no IT queue&lt;/li&gt;
&lt;li&gt;It is the strategic direction: BYOI pulls the Q Business index inside&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seats are expensive for occasional users; $250/account floor on Pro and Enterprise&lt;/li&gt;
&lt;li&gt;RBAC/SSO and data sovereignty only appear on Enterprise&lt;/li&gt;
&lt;li&gt;Conversational iteration burns agent hours ($3/h overage)&lt;/li&gt;
&lt;li&gt;High exit cost: logic and state stay in the workspace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best choice when the population already holds Quick seats and the app is read-mostly.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS App Studio
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$0.25/user-hour is unbeatable for sporadic, long-tail usage&lt;/li&gt;
&lt;li&gt;Free builder environment and 250 free user-hours to trial&lt;/li&gt;
&lt;li&gt;Reach into 200+ AWS services and third parties via API/OpenAPI connectors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oregon and Ireland only — a non-starter for data that must stay in Brazil&lt;/li&gt;
&lt;li&gt;No new Regions since the November 2024 GA&lt;/li&gt;
&lt;li&gt;Needs a technical person driving — not business self-service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Wins on cost per occasional user, loses on regional footprint and product trajectory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom build (Amplify/AppSync)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diff, PR, test and rollback: audit evidence by construction&lt;/li&gt;
&lt;li&gt;Row-level entitlement and idempotency under your control&lt;/li&gt;
&lt;li&gt;Any Region, including sa-east-1; low exit cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weeks of engineering competing with the product roadmap&lt;/li&gt;
&lt;li&gt;You inherit operations, patching and on-call for one more internal app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Reserve it for anything that writes to a system of record or becomes regulated evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build no app (Quick Sight + Flows)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero incremental cost and minimal risk surface&lt;/li&gt;
&lt;li&gt;Reuses dataset lineage and permissions that are already audited&lt;/li&gt;
&lt;li&gt;Ships in hours and dies painlessly when it stops being useful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Covers neither data entry nor approval workflow&lt;/li&gt;
&lt;li&gt;Frustrates whoever asked for an "app" and got a chart&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; The default option. Only leave it when there is real data entry or a real workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Respects your access policies" — what that means and what it does not
&lt;/h2&gt;

&lt;p&gt;That line from the announcement is true and insufficient. What the documentation describes is identity propagation &lt;strong&gt;at the connector boundary&lt;/strong&gt;: the Salesforce or ServiceNow integration carries the user's identity, and what they cannot see there, they do not see here. That is good, and it is different from &lt;em&gt;row-level entitlement inside the app&lt;/em&gt;. If the app joins Salesforce pipeline with warehouse cost and returns margin per customer, the authorization of that combined result is a new property no single connector guarantees.&lt;/p&gt;

&lt;p&gt;The test I require before publishing is not functional, it is negative: take a user with no access to account X in the CRM, open the published app and prove they cannot see account X — not in the table, not in the total, not in the output of the inference block. Aggregates leak. Foundation-model summarisation leaks elegantly.&lt;/p&gt;

&lt;p&gt;Then come the operational questions, worth more than any demo: is there a diff between today's version of the generated app and March's? Who approves promotion? What signal reaches CloudTrail and your SIEM when an action connector writes into a system of record? What is the failure behaviour of that connector — retry, idempotency, partial write?&lt;/p&gt;

&lt;p&gt;And there is the licensing layer turning into an architectural constraint: the pricing page places &lt;strong&gt;RBAC/SSO and data sovereignty on Enterprise&lt;/strong&gt;. In a regulated institution, identity federation is not optional — so the real price is not $20, it is $40 plus the $250 infrastructure fee. Decide the tier during architecture, not at renewal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The real break-even is not technical:&lt;/strong&gt; A $40 Enterprise seat equals 160 user-hours on App Studio — nearly a full working month inside the app. So, on a per-app basis, App Studio almost always wins on cost. Quick only wins when the seat was already bought for another reason (chat, research, BI). The platform decision therefore precedes the app decision: if Quick is already the company workspace, building outside it means paying twice. If it is not, one app does not justify adopting it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How this goes wrong in production
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One-click publishing "to the entire organization" under a seat model — distribution becomes a cost event, not an adoption event.&lt;/li&gt;
&lt;li&gt;Treating the conversational app as a disposable spreadsheet, then discovering at close that a regulated number comes from an artefact with no version and no owner.&lt;/li&gt;
&lt;li&gt;Confusing connector-level identity propagation with authorization of the aggregated result — and never running the negative test.&lt;/li&gt;
&lt;li&gt;Enabling write-capable action connectors before defining retry, idempotency and the signal reaching the SIEM when the app mutates a system of record.&lt;/li&gt;
&lt;li&gt;Choosing App Studio for data that must stay in Brazil, ignoring that it exists only in Oregon and Ireland.&lt;/li&gt;
&lt;li&gt;Letting a hundred people iterate apps conversationally without knowing whether the included agent hours are per user or per account.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Well-Architected reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: Inherited identity is a starting point, not a conclusion. Require a negative test per persona, review write-capable action connectors as changes to a system of record, and treat the licence tier (RBAC/SSO on Enterprise) as a security requirement, not a procurement one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: The app depends on third-party systems through connectors. Define the expected behaviour when Salesforce or ServiceNow degrades: visibly stale data, explicit failure, or queued writes with idempotency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three questions that always come up
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does this replace AWS App Studio?
&lt;/h3&gt;

&lt;p&gt;Formally no: App Studio does not appear in the March 2026 service availability update and remains GA. In practice it has not gained a Region since November 2024 and still runs only in Oregon and Ireland, while Quick is receiving BYOI, Bedrock knowledge bases and now apps. I read that as investment direction and plan accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I build apps on the Free tier?
&lt;/h3&gt;

&lt;p&gt;The announcement says app building is available to Plus, Professional and Enterprise starting September 1, 2026, while the pricing page lists "no-code apps" among Free features. The two pages are not aligned — confirm with your account team before planning a rollout on top of Free.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the first app I would let someone build?
&lt;/h3&gt;

&lt;p&gt;One that only reads, has fewer than twenty named users, replaces an existing spreadsheet, and produces no number that enters an external report. If it survives a quarter of real usage, then I will discuss a write connector.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What I would do on Monday:&lt;/strong&gt; I would not open app building to the whole company; I would open it to a two-process pilot with a named owner and a 90-day review date. The lesson that cost me came from elsewhere: at a bank we killed a critical spreadsheet by replacing it with a better internal tool — and six months later found the risk team back on the spreadsheet, because the tool could not show how March's number had been calculated. The ability to reproduce the past is worth more than the speed of building the present. So my bar for any conversational app is a single question: if the auditor asks for the difference between today's version and the one from three months ago, can I show it? If the answer is no, the app may exist — but it cannot be the source of an official number.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Recommendation
&lt;/h2&gt;

&lt;p&gt;If your company already pays for Amazon Quick seats, &lt;strong&gt;Apps in Quick is the right choice for read-mostly apps&lt;/strong&gt; — near-zero marginal cost, Quick Sight embeds, identity already handled at the connector boundary, and alignment with where the product is going (BYOI, Bedrock knowledge bases). If you are not a subscriber, one app does not justify $40/user plus $250/account: &lt;strong&gt;App Studio delivers the same outcome at $0.25 per user-hour&lt;/strong&gt; — provided the data can live in Oregon or Ireland, which rules out a good share of regulated Brazilian cases. For anything that writes to a system of record or backs an externally reported number, stay with the &lt;strong&gt;custom build&lt;/strong&gt;: you are buying diff, rollback and evidence, not technology. And before all of that, test the cheap hypothesis — half these requests die with a Quick Sight dashboard and a Quick Flow, and that is the most elegant architecture of the four.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; Adote com piloto controlado / Adopt with&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/09/amazon-quick-custom-apps-natural-language/" rel="noopener noreferrer"&gt;AWS What's New — Amazon Quick now lets you build custom apps with natural language (Sep 1, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/quick/latest/userguide/using-amazon-quick-apps.html" rel="noopener noreferrer"&gt;Amazon Quick User Guide — Build web applications with apps in Amazon Quick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/quick/latest/userguide/working-with-integrations.html" rel="noopener noreferrer"&gt;Amazon Quick User Guide — Work with integrations (action connectors, knowledge bases, BYOI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/quick/pricing/" rel="noopener noreferrer"&gt;Amazon Quick — Pricing (Free / Plus / Professional / Enterprise, agent hours, index storage)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/appstudio/pricing/" rel="noopener noreferrer"&gt;AWS App Studio — Pricing ($0.25 per user hour, free builder environment)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/appstudio/faqs" rel="noopener noreferrer"&gt;AWS App Studio — FAQs (target users, Regions, connectors)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/03/aws-service-availability" rel="noopener noreferrer"&gt;AWS Service Availability Updates (March 31, 2026) — services moving to maintenance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/apps-no-amazon-quick-vs-app-studio-vs-build-proprio-amazon-quick" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>amazonquick</category>
      <category>awsappstudio</category>
      <category>lowcode</category>
    </item>
    <item>
      <title>Amazon Connect compact mode: operational density with caution</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:57:43 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/amazon-connect-compact-mode-operational-density-with-caution-2h09</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/amazon-connect-compact-mode-operational-density-with-caution-2h09</guid>
      <description>&lt;p&gt;AWS announced on September 1, 2026 that Amazon Connect Customer analytics dashboards now support compact mode. On the surface, the change reduces spacing, font size, widget height, and visible filter footprint so more information fits on screen. In practice, for teams operating financial contact centers, insurers, fintechs, or regulated service desks, this is an operational design decision: the supervisor cockpit must show more context without turning the screen into noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the official sources confirm
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15s&lt;/strong&gt; — Real-time dashboard refresh. The documentation states a 15-second refresh for real-time dashboards, except time-series widgets, which refresh every 15 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10&lt;/strong&gt; — Widgets per dashboard. The documented customization model allows up to 10 widgets on each dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$0.038&lt;/strong&gt; — Published voice price. The Connect Customer pricing page lists voice at $0.038 per voice minute, with standard telephony charges applying.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The feature is simple; the operational implication is not
&lt;/h2&gt;

&lt;p&gt;I read this launch as an operational ergonomics improvement, not as a new analytics capability. Compact mode does not change the Amazon Connect Customer data model, does not create a new metric, does not solve queue cardinality, and does not replace alarms. Its value is in reducing cognitive friction when a supervisor needs to see more agents, queues, adherence, wait times, and exceptions without navigating across multiple parts of a page.&lt;/p&gt;

&lt;p&gt;In financial contact centers, the supervisor screen is often a human control point between automated signals and contingency decisions. A spike in abandonment, a fraud queue aging abnormally, agents spending too long in after-call work, or an adherence drop during a critical window can require action within minutes. If the accountable person only notices the issue after scrolling, changing filters, or opening another report, the system has already consumed part of its operational error budget.&lt;/p&gt;

&lt;p&gt;The change also follows a clear AWS direction: console analytics closer to operations, as seen in the MediaTailor analytics dashboard and CloudWatch alarm warm-up periods. The pattern is to reduce noise, shorten the path between telemetry and decision, and place actionable context where operations already work. I like that direction, but it requires discipline: density without semantics is just a tighter spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would position compact mode in a critical service operation
&lt;/h2&gt;

&lt;p&gt;The diagram shows the right role for compact mode: a human perception layer, fed by governed metrics and complemented by incident automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  👥 Operação / Operations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supervisor 13-inch laptop / wallboard (user)&lt;/li&gt;
&lt;li&gt;Agents queues and adherence (user)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 Amazon Connect Customer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Connect instance voice, chat, email, messaging (compute)&lt;/li&gt;
&lt;li&gt;Analytics dashboards compact mode enabled (frontend)&lt;/li&gt;
&lt;li&gt;Widget filters queue, agent, proficiency (data)&lt;/li&gt;
&lt;li&gt;Custom metrics service-level definitions (data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📈 Observabilidade / Observability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CloudWatch alarms and dashboards (compute)&lt;/li&gt;
&lt;li&gt;EventBridge incident workflow trigger (messaging)&lt;/li&gt;
&lt;li&gt;Runbook Step Functions or SSM (ci)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔐 Governança / Governance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Security profiles least privilege (security)&lt;/li&gt;
&lt;li&gt;Export evidence CSV/PDF for review (storage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;agents -&amp;gt; connect: interactions and operational states&lt;/li&gt;
&lt;li&gt;connect -&amp;gt; dashboards: real-time and historical metrics&lt;/li&gt;
&lt;li&gt;filters -&amp;gt; dashboards: narrows visible scope&lt;/li&gt;
&lt;li&gt;custommetrics -&amp;gt; dashboards: defines what matters&lt;/li&gt;
&lt;li&gt;dashboards -&amp;gt; supervisor: higher density, less scrolling&lt;/li&gt;
&lt;li&gt;connect -&amp;gt; cloudwatch: signals for alarms&lt;/li&gt;
&lt;li&gt;cloudwatch -&amp;gt; events: actionable anomaly&lt;/li&gt;
&lt;li&gt;events -&amp;gt; runbook: orchestrates response&lt;/li&gt;
&lt;li&gt;iam -&amp;gt; dashboards: profile-based permission&lt;/li&gt;
&lt;li&gt;dashboards -&amp;gt; audit: CSV/PDF as evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where compact mode shines
&lt;/h2&gt;

&lt;p&gt;The best use case is tactical supervision: people monitoring an operation in near real time who need to compare many similar rows. The documentation confirms that real-time dashboards refresh every 15 seconds, while time-series widgets refresh every 15 minutes. That is enough for queue management, adherence, abandonment trends, and capacity tracking; it is not enough for subsecond automated incident control, and it should not be treated that way.&lt;/p&gt;

&lt;p&gt;In an operation with 80 to 150 agents spread across squads, the gain is not seeing everything. It is seeing the right set: non-adherent agents, queues with threatened SLA, active contacts, contacts in queue, oldest contact, agents in error, available agents, and after-call work. If the compact screen can show a full team without scrolling, the supervisor saves a chain of visual microdecisions. That reduces human latency, which in real operations is often larger than service latency.&lt;/p&gt;

&lt;p&gt;I also see value in peak-period war rooms: Black Friday, payroll closing, market events, digital banking incidents, collection campaigns, or regulatory windows. In those moments, a dense screen helps maintain shared context across service, operations, SRE, business, and risk. The advantage appears when everyone discusses the same dashboard, with the same filters and thresholds, not when each area interprets a different slice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strengths of the feature
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It increases density without requiring export to BI, preserving operational context inside Amazon Connect Customer.&lt;/li&gt;
&lt;li&gt;It helps supervisors on small screens, especially 13-inch laptops and remote coordination setups.&lt;/li&gt;
&lt;li&gt;It works well with queue, agent, hierarchy, and proficiency filters, as long as filter design is governed.&lt;/li&gt;
&lt;li&gt;It reduces the cognitive cost of comparing similar operational rows, which is a real pain in large contact centers.&lt;/li&gt;
&lt;li&gt;The announcement identifies no separate charge for the mode itself; relevant cost still comes from Connect Customer usage and associated services.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The risk: density can hide poor metric governance
&lt;/h2&gt;

&lt;p&gt;What concerns me is not the smaller font; it is the temptation to add more numbers without improving decision quality. The documentation allows teams to customize widgets, metrics, columns, filters, groupings, and thresholds. It also states important limits: up to three table groupings, up to 20 conditions in certain routing/proficiency filters, up to three thresholds per metric, and up to 10 custom metrics in a widget. Those limits are reasonable, but they also expose a trap: with enough flexibility, each area can create its own operational semantics.&lt;/p&gt;

&lt;p&gt;In financial environments, I would treat contact center metrics as an operations contract. Service level cannot mean one thing for service, another for risk, and another for technology. If the metric excludes transferred contacts, callbacks, or abandonments within a given interval, that definition must live in an ADR or operational runbook. Otherwise, the dashboard becomes attractive, compact, and dangerous: everyone looks at the same number, but each person believes it represents a different reality.&lt;/p&gt;

&lt;p&gt;Compact mode also hides widget descriptions and places filters behind an icon, according to the documentation. That is the right trade-off for screen space, but it increases the need for explicit names, dashboard conventions, and periodic review. A dashboard named “Today’s Operation” is not enough. I would prefer names such as “Card Fraud - Real Time - 30s SLA - Critical Queues” and thresholds aligned with documented SLOs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Compact is not observability:&lt;/strong&gt; I would not use compact mode as a substitute for CloudWatch alarms, SLOs, structured logs, traces, runbooks, or response automation. Dashboards are good for perception and coordination; they are weak as the primary detection mechanism. In a critical operation, if the first indication of a problem is someone noticing a red row on the dashboard, the observability architecture is incomplete.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How I would design for scale, cost, and reliability
&lt;/h2&gt;

&lt;p&gt;The first decision is to separate the operational dashboard from the control system. Amazon Connect Customer should be the experience and supervision plane; CloudWatch, EventBridge, Lambda, Step Functions, SSM Incident Manager, or tools such as Datadog should compose the detection and response plane. The compact dashboard shows the actionable picture, but alarms and automation must fire even when nobody is watching.&lt;/p&gt;

&lt;p&gt;I would configure dashboards by operational domain, not by generic org chart. A fraud desk needs queues, oldest contact, abandonment, active contacts, available agents, agents in error, and adherence with its own thresholds. A collections cell needs campaign, channel, and contact-window cuts. A premium support operation needs priority, customer, language, and proficiency. When the documentation allows proficiency and routing filters with conditions, I would use that to reduce supervisory noise, not to replicate all routing logic on screen.&lt;/p&gt;

&lt;p&gt;On cost, the discussion is not “how much compact mode costs,” because the announcement does not identify a separate charge. The discussion is operational volume. The pricing page lists voice, chat, email, and messaging charged by unit of use. More effective dashboards can reveal waste: poorly routed queues, excessive transfers, abandonment that generates repeat contacts, inflated after-call work, and weak self-service that pushes cost to humans. The useful financial metric here is cost per effective resolution, not isolated cost per contact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adoption path I would recommend
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define the metric contract before the layout&lt;/strong&gt; — Document service level, abandonment, adherence, after-call work, and exclusions. Include formula, time window, owner, and expected decision when the metric crosses the threshold.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create dashboards by operating scenario&lt;/strong&gt; — Separate real time, intraday, agent performance, campaigns, fraud, and incidents. Compact mode works best when each screen answers a clear operational question.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Apply least privilege to security profiles&lt;/strong&gt; — Use dashboard and metrics permissions according to role. Performance data, recordings, evaluations, and analytics can be sensitive in regulated environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Connect thresholds to runbooks&lt;/strong&gt; — Colors on the dashboard only matter if they imply action: reallocating agents, pausing a campaign, opening an incident, adjusting routing, or escalating to crisis management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validate on real screens&lt;/strong&gt; — Test on a 13-inch laptop, supervisor monitor, and crisis room display. If the user must zoom the browser or memorize hidden filters, density has gone too far.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Security, audit, and the human side of the screen
&lt;/h2&gt;

&lt;p&gt;Contact center dashboards can expose more than neutral metrics. Individual performance, hierarchy, proficiency, evaluations, conversation categories, campaigns, and recordings can touch privacy, labor relations, supervision conduct, and regulatory evidence. The documentation makes clear that access depends on security profile permissions and that different dashboards require specific permissions, such as flow view permissions for flow data. I would take that seriously from the first design.&lt;/p&gt;

&lt;p&gt;My pattern would be to segment profiles: operational supervisor, quality manager, workforce analyst, SRE/operability, and audit. Each profile sees the minimum necessary for its decision. CSV and PDF exports should fall under retention, encryption, and audit-trail policy, especially when used for committees, incident reviews, or compliance evidence. If the company already has a governed lake, Glue Data Catalog, Lake Formation, or S3 trails with KMS, the exported report should not become an informal exception outside that control.&lt;/p&gt;

&lt;p&gt;The human factor also matters. Compact mode reduces visual space and can increase fatigue if used during long shifts. I would alternate dense dashboards for active supervision and cleaner panels for later analysis. The best operation is not the one that sees more numbers all the time; it is the one that knows which number must appear when a decision must be made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Well-Architected reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: Security profile permissions should limit who can view metrics, evaluations, recordings, and sensitive data. Exports need retention, encryption, and audit trails compatible with the regulated environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: The dashboard should be a coordination layer, not the primary detection mechanism. CloudWatch alarms, automations, and incident integrations must cover the operation when the screen is not being watched.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compact mode versus executive dashboard
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Operational compact mode&lt;/th&gt;
&lt;th&gt;Executive dashboard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary user&lt;/td&gt;
&lt;td&gt;Supervisor, workforce, shift operations, service SRE.&lt;/td&gt;
&lt;td&gt;Executives, product, finance, governance, and committees.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision window&lt;/td&gt;
&lt;td&gt;Seconds to minutes; focused on queue, agent, and exception.&lt;/td&gt;
&lt;td&gt;Days to weeks; focused on trend, cost, and strategy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main risk&lt;/td&gt;
&lt;td&gt;Visual noise, fatigue, and action based on poorly defined metrics.&lt;/td&gt;
&lt;td&gt;Excessive aggregation hiding local operational problems.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My curator note:&lt;/strong&gt; I would enable compact mode first on real-time supervision dashboards, not on every panel. My practical lesson is that a dense screen only works when there is a shared operational grammar: good names, few thresholds, and explicit decisions. If I need five minutes to explain the dashboard before a crisis, it is not ready for a crisis yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Verified references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/09/connect-dashboards-compact-mode/" rel="noopener noreferrer"&gt;AWS What's New: Amazon Connect Customer dashboards now support compact mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/connect/latest/adminguide/dashboards.html" rel="noopener noreferrer"&gt;Amazon Connect Customer Administrator Guide: dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/connect/latest/adminguide/dashboard-customize-widgets.html" rel="noopener noreferrer"&gt;Amazon Connect Customer Administrator Guide: customize dashboard widgets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/connect/latest/adminguide/regions.html" rel="noopener noreferrer"&gt;Amazon Connect Customer feature availability by Region&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/products/connect/customer/pricing/" rel="noopener noreferrer"&gt;Amazon Connect Customer pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/amazon-cloudwatch-alarms-warmup-period/" rel="noopener noreferrer"&gt;AWS What's New: CloudWatch alarm warm-up periods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/mediatailor-analytics-dashboard/" rel="noopener noreferrer"&gt;AWS What's New: MediaTailor in-console analytics dashboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is to adopt compact mode for active Amazon Connect Customer supervision, with explicit metric and permission governance. It is a small product improvement, but practically relevant: less scrolling can mean faster human detection and better coordination during critical windows. I would not sell this as analytics transformation; I would treat it as a serious refinement of the operational cockpit. Rating: 8/10 for real-time supervision; 5/10 if used only to squeeze more widgets onto a screen without rethinking decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; 8/10&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/amazon-connect-compact-mode-densidade-operacional-com-cautela-amazon-conne" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>amazonconnect</category>
      <category>contactcenter</category>
      <category>observability</category>
    </item>
    <item>
      <title>MWAA with Airflow 3.3.1: state, language, and operational discipline</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:57:10 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/mwaa-with-airflow-331-state-language-and-operational-discipline-1nd6</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/mwaa-with-airflow-331-state-language-and-operational-discipline-1nd6</guid>
      <description>&lt;p&gt;The September 1, 2026 announcement bringing Apache Airflow 3.3.1 to Amazon MWAA looks small if read as a version update. I do not read it that way. For financial environments, regulated data platforms, and operations with hundreds of DAGs, the central point is that Airflow is formally acknowledging three realities architects already solved outside the platform: tasks need to remember progress, not every domain implementation should become Python, and retries need to understand why a failure happened. MWAA reduces part of the operational burden of running schedulers, workers, webservers, and the metadata database, but it does not remove the obligation to design idempotency, isolation, cost control, and observability. My assessment: it is worth studying and adopting selectively, especially for incremental workloads and long-running jobs; it is not a reason to turn every DAG into an experimental SDK lab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers that shape the decision
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3.3.1&lt;/strong&gt; — Airflow version now supported on MWAA. Apache Airflow 3.3.1 was released on August 12, 2026; MWAA support was announced on September 1, 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;25&lt;/strong&gt; — Workers per environment as the default quota. The documented MWAA quota lists 25 workers per environment, 5 webservers, and 10 environments per account per Region, all adjustable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$0.49/h&lt;/strong&gt; — Public example for a small environment in us-east-1. The pricing page uses $0.49 per hour for a small environment and $0.055 per hour for each additional small worker in a Northern Virginia example.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;p&gt;I split this version into two groups: what changes workflow modeling and what improves daily operations. The first group includes the Task and Asset State Store, expanded asset partitioning, pluggable retry policies, and the experimental Language Task SDK for Java and Go. The second group includes bulk actions for DAG runs and task instances, stability, security, and UI fixes, plus practical improvements for teams that operate many pipelines.&lt;/p&gt;

&lt;p&gt;The State Store is the most architectural item. Until now, many teams used XCom, Variables, DynamoDB, S3, or auxiliary tables to keep cursors, external job ids, watermarks, and checkpoints. Some of those solutions were correct; others became technical debt with unclear semantics. Airflow 3.3 creates an explicit place for this state: task state for a task instance and asset state for metadata associated with an asset. That does not remove DynamoDB or external databases when the state is domain-owned, auditable, or shared by systems outside Airflow. But it improves DAG hygiene when the state is operational and belongs to the execution cycle.&lt;/p&gt;

&lt;p&gt;On MWAA, this matters because the service already runs schedulers and workers on Fargate and maintains a managed metadata database. The temptation will be to fill the metadatabase with too much state. I would do the opposite: use the store for small, versioned, disposable pointers, and keep business data in S3, DynamoDB, Aurora, or the lakehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I see value
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;External job checkpoints become cleaner: task state can store the job id for EMR Serverless, Glue, Batch, ECS, or SageMaker before polling completes.&lt;/li&gt;
&lt;li&gt;Per-asset watermarks reduce coupling: a processed S3 partition or table can carry state without becoming a global Variable.&lt;/li&gt;
&lt;li&gt;Pluggable retry policies help separate transient from permanent failures, especially for APIs with throttling, expired credentials, and contract validation.&lt;/li&gt;
&lt;li&gt;Java and Go become options for existing domain logic, but I would treat the SDK as experimental until packaging, logs, and operational support are proven.&lt;/li&gt;
&lt;li&gt;Bulk actions reduce operational friction in reprocessing, but they also call for stronger change controls and audit trails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Durable state is not permission to forget idempotency
&lt;/h2&gt;

&lt;p&gt;The main mistake I expect with Airflow 3.3 is turning the state store into an application database. In financial systems, a task that settles files, publishes events, calculates exposure, or reconciles positions cannot rely only on “remembering where it stopped.” It needs idempotency by design. That means natural keys, deduplication, conditional writes, and explicit reprocessing boundaries.&lt;/p&gt;

&lt;p&gt;A design I would accept: a DAG receives file-arrival events, materializes metadata in DynamoDB with a partition key such as &lt;code&gt;dataset#business_date&lt;/code&gt; and a sort key such as &lt;code&gt;source_file#version&lt;/code&gt;, stores raw data in S3 with versioning and SSE-KMS, and uses task state only to keep the identifier of an already submitted Glue or EMR Serverless job. If the worker dies, the next attempt retrieves the job id, queries the job state, and decides whether to follow it, cancel it, or open a new attempt with an idempotency token. Durable state avoids duplicated work; the control table remains the auditable ledger.&lt;/p&gt;

&lt;p&gt;I would also apply TTL or short retention to task states whenever possible. For asset cursors, I would use small payloads: last confirmed offset, contract hash, partition window, and producer version. If the value starts looking like a document, event, or snapshot, it probably does not belong in the state store.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would design safe State Store usage
&lt;/h2&gt;

&lt;p&gt;The diagram shows my preferred pattern: Airflow keeps minimal operational state; auditable state and data remain in purpose-built services.&lt;/p&gt;

&lt;h3&gt;
  
  
  🟦 Orquestração MWAA
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;DAG Python asset-aware (compute)&lt;/li&gt;
&lt;li&gt;Task State Store job_id, checkpoint (data)&lt;/li&gt;
&lt;li&gt;Asset State Store watermark, partition (data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 Execução AWS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS Glue / EMR long-running job (compute)&lt;/li&gt;
&lt;li&gt;Amazon S3 raw + curated data (storage)&lt;/li&gt;
&lt;li&gt;DynamoDB control ledger (data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛡️ Governança e Operação
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;IAM + KMS least privilege (security)&lt;/li&gt;
&lt;li&gt;CloudWatch logs, metrics, alarms (edge)&lt;/li&gt;
&lt;li&gt;Runbook replay window (ci)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;dag -&amp;gt; glue: submits job with idempotency token&lt;/li&gt;
&lt;li&gt;dag -&amp;gt; taskstate: persists job_id before polling&lt;/li&gt;
&lt;li&gt;glue -&amp;gt; s3: writes partitioned outputs&lt;/li&gt;
&lt;li&gt;glue -&amp;gt; ddb: updates control ledger&lt;/li&gt;
&lt;li&gt;dag -&amp;gt; assetstate: advances watermark after commit&lt;/li&gt;
&lt;li&gt;iam -&amp;gt; dag: assumes restricted role&lt;/li&gt;
&lt;li&gt;dag -&amp;gt; cw: emits duration, retry, and lag&lt;/li&gt;
&lt;li&gt;cw -&amp;gt; runbook: triggers controlled replay&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Java/Go SDKs: useful integration, maturity still under test
&lt;/h2&gt;

&lt;p&gt;I like the direction of the Language Task SDK because it recognizes that enterprise data platforms are rarely 100% Python. There are pricing libraries in Java, contract validators in Go, internal clients with already reviewed security policies, and binaries that platform teams would rather not rewrite. The documented model keeps the DAG in Python and declares stub tasks with &lt;code&gt;@task.stub(queue=...)&lt;/code&gt;; the worker delegates execution to a coordinator, such as &lt;code&gt;JavaCoordinator&lt;/code&gt; for JVM or &lt;code&gt;ExecutableCoordinator&lt;/code&gt; for self-contained binaries such as Go.&lt;/p&gt;

&lt;p&gt;The opportunity is to reduce fragile wrappers. Instead of calling a script through BashOperator and losing task semantics, retries, pools, and XCom behavior, the non-Python task participates in the graph. That improves readability and ownership: the data team keeps orchestration, the domain team keeps implementation.&lt;/p&gt;

&lt;p&gt;But I would be conservative. The documentation itself marks this capability as experimental, and that matters. On MWAA, I would first validate whether binary or JAR packaging fits the plugin, requirements, managed image, and worker-directory flow. I would also test cold start, artifact size, remote logs, secrets through Connections, memory limits of the selected environment class, and rollback behavior. For regulated production, I would start with low-risk tasks, without irreversible side effects, and keep pure Python as the recovery path.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The hidden risk is the metadata database:&lt;/strong&gt; The Airflow metadata database already carries DAG runs, task instances, XComs, indirect logs, serialization, and scheduler state. When adding the state store, I would monitor growth, cleanup, and cardinality from day one. On MWAA, pricing also includes metadata database storage in GB-months; in a platform with many dynamic mappings, per-partition cursors, and frequent reruns, the small cost may matter less than the operational impact of a bloated database.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  MWAA operations: managed version is not outsourced operations
&lt;/h2&gt;

&lt;p&gt;MWAA remains a pragmatic choice when an organization wants Airflow without managing Kubernetes, Celery, the metadata database, and image patching. The documentation confirms that schedulers and workers run on Fargate, with a managed Aurora PostgreSQL metadata database and integrations with CloudWatch, S3, SQS, and KMS. That removes undifferentiated work from the team, but it does not turn Airflow into an invisible service.&lt;/p&gt;

&lt;p&gt;I would start any 3.3.1 upgrade with a parallel environment, not a direct change to the critical environment. Since the announcement allows a new 3.3.1 environment and upgrades from 3.2 or later, I would use the parallel path to validate dependencies, constraints, &lt;code&gt;airflow.sdk&lt;/code&gt; imports, providers, and DAG serialization. The public MWAA version table also shows the lifecycle discipline: AWS supports at least three minor versions and announces end of support 180 days in advance, but the responsibility to keep environments current remains with the customer.&lt;/p&gt;

&lt;p&gt;For capacity, I would not size by DAG count alone. Classes range from &lt;code&gt;mw1.micro&lt;/code&gt;, with 3 default concurrent tasks and no autoscaling, to &lt;code&gt;mw1.2xlarge&lt;/code&gt;, with 80 default concurrent tasks and much larger resources. Schedulers for Airflow v3 accept 2 to 5 in environments above micro, and workers have default 10, minimum 1, and maximum 25. Those numbers require load testing with real DAGs, not an optimistic spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to place state in the design
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Correct use&lt;/th&gt;
&lt;th&gt;Avoid&lt;/th&gt;
&lt;th&gt;Practical decision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Task State Store&lt;/td&gt;
&lt;td&gt;External job id, retry checkpoint, small progress marker inside the task instance.&lt;/td&gt;
&lt;td&gt;Business result, large payload, auditable event, or data contract.&lt;/td&gt;
&lt;td&gt;Use it to resume execution; do not use it as the source of truth.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asset State Store&lt;/td&gt;
&lt;td&gt;Watermark, last confirmed partition, schema hash, and operational metadata for the asset.&lt;/td&gt;
&lt;td&gt;Enterprise catalog, full lineage, quality rules, or authorization.&lt;/td&gt;
&lt;td&gt;Good for DAG coordination; complement it with Glue Data Catalog, Lake Formation, or a lineage tool.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB / Aurora&lt;/td&gt;
&lt;td&gt;Auditable control, cross-system idempotency, locks, approval, SLA, and reconciliation.&lt;/td&gt;
&lt;td&gt;Ephemeral state that only one task needs during a retry.&lt;/td&gt;
&lt;td&gt;Use it when auditability, external query, or formal retention are requirements.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pluggable retries change the failure contract
&lt;/h2&gt;

&lt;p&gt;Retry is one of the places where data platforms lose money silently. A fixed &lt;code&gt;retries=3&lt;/code&gt; with a fixed delay looks harmless, but in transactional APIs it can triple cost, create duplicates, and mask permanent errors. In market, risk, fraud, or regulatory data workloads, I want the DAG to know the difference between &lt;code&gt;ThrottlingException&lt;/code&gt;, network failure, &lt;code&gt;AccessDenied&lt;/code&gt;, schema validation, and a semantic contract break.&lt;/p&gt;

&lt;p&gt;Airflow 3.3 retry policies allow rules by exception type and actions such as retry, fail, or default behavior. That brings orchestration closer to an explicit operational policy. I would apply this around operators that call external APIs, managed jobs, and rate-limited integrations. For AWS SDK calls, I would still let low-level botocore retries handle short transient failures; the Airflow retry should be used for workflow decisions, with a delay compatible with the SLA and processing windows.&lt;/p&gt;

&lt;p&gt;A healthy pattern: permission failure should fail fast and trigger a runbook; throttling should use backoff and alarm only after N minutes of backlog; schema error should open a contract incident and block downstream; external job failure should check remote state before resubmission. This detail reduces cost and improves trust in reprocessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would adopt it in production
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a parallel 3.3.1 environment&lt;/strong&gt; — I would clone DAGs, requirements, plugins, and configuration while keeping the current environment intact. I would validate constraints, imports, IAM permissions, Connections, pools, and serialization before any real traffic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Classify DAGs by risk&lt;/strong&gt; — I would separate read-only DAGs, idempotent DAGs, DAGs with side effects, and regulatory DAGs. The state store would enter first in incremental workflows with simple rollback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define the state contract&lt;/strong&gt; — Each key needs an owner, JSON format, scope, retention, cleanup policy, and relationship to audit. I would reject free-form keys created inside tasks without convention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instrument before migrating&lt;/strong&gt; — I would track task duration, queue time, scheduler lag, active workers, retries by cause, metadata database size, XCom growth, and state count.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cut over by data window&lt;/strong&gt; — Instead of migrating all DAGs, I would move one window or domain, freeze competing reprocessing, and keep a clear runbook for replay and rollback.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Anti-patterns I would avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Moving to 3.3.1 just to be on the newest version, without an inventory of DAGs, providers, and transitive dependencies.&lt;/li&gt;
&lt;li&gt;Storing business payloads in the Task State Store and later trying to reconstruct audit from an orchestration metadata database.&lt;/li&gt;
&lt;li&gt;Using the Java/Go SDK to bypass image governance, secret scanning, dependency review, and observability.&lt;/li&gt;
&lt;li&gt;Increasing workers up to the default quota of 25 without checking whether the real bottleneck is scheduler, database, external API, pool, or downstream.&lt;/li&gt;
&lt;li&gt;Allowing broad bulk clear or rerun without approval, change annotation, and an explicit reprocessing window.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Well-Architected reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: I would keep MWAA on private access when the audience is internal, use IAM scoped by environment, KMS for DAG/log/data buckets, and S3 conditional policies such as &lt;code&gt;aws:SecureTransport&lt;/code&gt; and domain-specific prefixes. Connections should reference managed secrets, not credentials embedded in DAGs or bundles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: State Store improves recovery, but reliability comes from idempotency, controlled replay, pools, cause-aware retries, and domain isolation. For critical workloads, I would separate environments by criticality or domain to prevent experimental DAGs from pressuring shared schedulers and workers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;performance&lt;/strong&gt;: MWAA classes should be selected by measurements: parse time, scheduler lag, task duration, CPU/memory use, and effective concurrency. Webserver scaling reacts to CPU above 70 or ActiveConnectionCount above 15, but that solves UI/API pressure, not processing bottlenecks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My technical verdict before the final verdict
&lt;/h2&gt;

&lt;p&gt;This version does not change my basic rule for Airflow: it should orchestrate, not do heavy processing inside the worker. On MWAA, I would still call Glue, EMR Serverless, Batch, ECS, EKS, Lambda, or specialized services for substantial work, leaving the DAG to coordinate dependencies, windows, contracts, execution state, and retry decisions. The State Store makes that coordination more honest, especially when a worker can die after submitting a remote job and before recording the result.&lt;/p&gt;

&lt;p&gt;I also see a broader trend in recent AWS signals: managed services receiving finer operational controls. CloudWatch added alarm warm-up, DocumentDB received direct major-version upgrade, Redshift strengthened IAM Identity Center authentication with VPC routing, and now MWAA follows Airflow’s evolution in state and multi-language execution. The direction is clear: less undifferentiated operation, more responsibility for policy, governance, and change design.&lt;/p&gt;

&lt;p&gt;For engineering leadership, the right conversation is not “should we enable Airflow 3.3.1?” The question is: which incidents, rework, and manual controls does this version remove without increasing risk? If the answer points to incremental reprocessing, long-running jobs, smarter retries, and clean separation of Python orchestration from Java/Go domain logic, there is concrete value. If the answer is only novelty, I would wait.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Curator note:&lt;/strong&gt; I would adopt MWAA with Airflow 3.3.1 first in a data domain with frequent reprocessing and controlled impact, not in the company’s most sensitive flow. My practical lesson is that orchestrators fail less because of missing features and more because of poorly defined state, lazy retries, and diffuse ownership. The State Store is useful precisely because it forces the team to name the state; without discipline, it only moves the debt elsewhere. For Java and Go, I would wait for the team to prove packaging, logs, and rollback before calling it a standard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Verified references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/09/amazon-mwaa-apache-airflow-3-3-1/" rel="noopener noreferrer"&gt;AWS What's New: Amazon MWAA supports Apache Airflow version 3.3.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/mwaa/latest/userguide/what-is-mwaa.html" rel="noopener noreferrer"&gt;Amazon MWAA User Guide: What is Amazon MWAA?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/mwaa/latest/userguide/airflow-versions.html" rel="noopener noreferrer"&gt;Amazon MWAA User Guide: Apache Airflow versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/mwaa/latest/userguide/environment-class.html" rel="noopener noreferrer"&gt;Amazon MWAA User Guide: Environment classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/mwaa/latest/userguide/mwaa-quotas.html" rel="noopener noreferrer"&gt;Amazon MWAA User Guide: Service quotas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/managed-workflows-for-apache-airflow/pricing/" rel="noopener noreferrer"&gt;Amazon MWAA Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://airflow.apache.org/docs/apache-airflow/3.3.1/release_notes.html" rel="noopener noreferrer"&gt;Apache Airflow 3.3.1 Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://airflow.apache.org/docs/apache-airflow/3.3.1/authoring-and-scheduling/language-sdks/index.html" rel="noopener noreferrer"&gt;Apache Airflow 3.3.1 Non-Python Task SDKs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is selective adoption: strong for incremental pipelines, long-running jobs, recovery after worker failure, asset partitioning, and more explicit retry policies; cautious for Java/Go SDKs until the organization proves packaging, security, observability, and support. On an enterprise architecture scale, I would rate MWAA with Airflow 3.3.1 at 8/10 as a managed orchestration platform, provided the team keeps operational state small, auditable data outside Airflow, and an upgrade plan tested. I would not use this version as an excuse to put heavy logic inside workers or to replace data governance with DAG metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; 8/10&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/mwaa-com-airflow-3-3-1-estado-linguagem-e-disciplina-operacional-amazon-mwaa-" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>aws</category>
      <category>mwaa</category>
      <category>airflow33</category>
    </item>
    <item>
      <title>DocumentDB 8.0: direct MVU reduces risk, not migration work</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:57:09 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/documentdb-80-direct-mvu-reduces-risk-not-migration-work-f2a</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/documentdb-80-direct-mvu-reduces-risk-not-migration-work-f2a</guid>
      <description>&lt;p&gt;The August 31, 2026 announcement looks small: Amazon DocumentDB now allows in-place major version upgrades from 3.6 and 4.0 clusters directly to version 8.0 while preserving data, configuration, and endpoints. In financial-grade environments, I read it as more than operational convenience. It changes the risk economics of delayed modernization: fewer hops, fewer windows, less temporary inventory, and a more realistic path out of old engines without turning the migration into a multi-month side program. But I would not confuse the upgrade button with an upgrade strategy. Version 8.0 brings mandatory TLS 1.2, a new planner, collation, views, Text Index V2, Zstd compression, and behavior differences that can expose old assumptions in queries, indexes, and drivers. The value is in industrializing the move, not in treating it as routine maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would measure before approval
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3.6/4.0 -&amp;gt; 8.0&lt;/strong&gt; — Announced path. The What's New page announces direct upgrades to 8.0 from 3.6 and 4.0; I would validate target engine availability per Region through the API before the change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TLS 1.2+&lt;/strong&gt; — Compatibility gate. DocumentDB 8.0 does not accept TLS 1.0/1.1; any old client must be identified before the window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;256 TiB&lt;/strong&gt; — 8.0 cluster limit. The quotas documentation lists 256 TiB for clusters and databases on version 8.0 and later, compared with 128 TiB on earlier versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What really changed
&lt;/h2&gt;

&lt;p&gt;I see this release as a pressure relief mechanism for organizations that stayed on old DocumentDB versions because of application dependencies, downtime concerns, or regulatory backlog. Previously, the typical mental model was sequential modernization: inventory, fix clients, rehearse an intermediate upgrade, stabilize, repeat, and only then reach the desired version. With dozens of clusters across business domains, that choreography multiplies change approvals, evidence collection, regression testing, and periods where several engine versions coexist.&lt;/p&gt;

&lt;p&gt;A direct upgrade to 8.0 mainly reduces the number of intermediate states that must be governed. Instead of keeping an intermediate version only as a stepping stone, I can organize an evidence-driven transition: clone, rehearsal, realistic workload validation, cutover window, and post-upgrade observability. The cluster remains the same logical endpoint and storage, which reduces DNS changes, secret rotation, and application reconfiguration.&lt;/p&gt;

&lt;p&gt;The critical point is that “in-place” does not mean “no downtime.” The MVU documentation is explicit that the cluster is unavailable during the upgrade and may reboot multiple times. In financial systems, that moves the decision into the territory of SLOs, business calendar, and operational reversibility, not only engine compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where 8.0 actually helps
&lt;/h2&gt;

&lt;p&gt;The technical reason to target 8.0 is not only escaping Extended Support. The version brings compatibility with MongoDB 6.0, 7.0, and 8.0 API drivers, Planner Version 3, collation, views, Text Index V2, new aggregation operators, and Zstd compression. AWS has also published performance improvements of up to 7x lower aggregation pipeline latency and up to 5x better compression ratio in specific scenarios. I would treat those numbers as observed ceilings, not universal promises; still, they show where the version can pay for itself.&lt;/p&gt;

&lt;p&gt;Read-heavy workloads, recurring aggregations, simple text search, small documents, and well-indexed query patterns are good candidates. In a customer service, fraud detection, or digital onboarding platform, for example, the combination of better compression and a more capable planner can reduce I/O pressure and stabilize p95/p99 when enrichment queries or operational dashboards read large collections.&lt;/p&gt;

&lt;p&gt;There are architecture benefits as well. Views help encapsulate canonical projections instead of spreading that logic across services. Collation reduces homegrown handling for textual ordering and comparison. Zstd can improve storage and I/O economics, but it should be enabled with measurement because compression trades CPU for storage efficiency. In an operational database, that trade must show up in metrics, not conviction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The operating model I would use for the upgrade
&lt;/h2&gt;

&lt;p&gt;The center of the decision is not the upgrade command; it is the evidence loop before, during, and after the window.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧭 Governance and readiness
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cluster inventory 3.6/4.0, owners, SLO (ci)&lt;/li&gt;
&lt;li&gt;Compatibility review TLS, drivers, indexes (security)&lt;/li&gt;
&lt;li&gt;Change record rollback and evidence (ci)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 AWS validation lane
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;DocumentDB clone same instance count (data)&lt;/li&gt;
&lt;li&gt;Replay tests queries, jobs, APIs (compute)&lt;/li&gt;
&lt;li&gt;CloudWatch + logs CPU, I/O, cursors, p99 (data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟦 Production lane
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Manual snapshot pre-upgrade restore point (storage)&lt;/li&gt;
&lt;li&gt;In-place MVU 3.6/4.0 to 8.0 (data)&lt;/li&gt;
&lt;li&gt;Index metadata refresh wait for completion (data)&lt;/li&gt;
&lt;li&gt;Applications feature flags, retry budget (compute)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;inventory -&amp;gt; compat: classifies risk&lt;/li&gt;
&lt;li&gt;compat -&amp;gt; clone: defines rehearsal&lt;/li&gt;
&lt;li&gt;clone -&amp;gt; tests: runs representative load&lt;/li&gt;
&lt;li&gt;tests -&amp;gt; metrics: compares baseline&lt;/li&gt;
&lt;li&gt;metrics -&amp;gt; cab: produces evidence&lt;/li&gt;
&lt;li&gt;cab -&amp;gt; snapshot: authorizes window&lt;/li&gt;
&lt;li&gt;snapshot -&amp;gt; mvu: restore point&lt;/li&gt;
&lt;li&gt;mvu -&amp;gt; refresh: post-upgrade&lt;/li&gt;
&lt;li&gt;refresh -&amp;gt; apps: resumes traffic&lt;/li&gt;
&lt;li&gt;apps -&amp;gt; metrics: observes regressions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The limits I would not ignore
&lt;/h2&gt;

&lt;p&gt;The first limit is documentary and operational. While researching on September 1, 2026, I found the What's New page announcing direct upgrades from 3.6 and 4.0 to 8.0, while the MVU documentation page I opened still showed a table with 3.6/4.0 to 5.0 and 5.0 to 8.0, plus a note saying there was no direct path. I would trust the newer announcement as the service direction, but I would not approve production without confirming in the actual environment through &lt;code&gt;describe-db-engine-versions&lt;/code&gt;, the target Region console, and AWS Support if needed. That discrepancy is exactly the kind of detail that breaks a well-planned window.&lt;/p&gt;

&lt;p&gt;The second limit is compatibility. DocumentDB is not upstream MongoDB; it is API-compatible, with documented functional differences. An engine upgrade can change query planning, text index behavior, default collation for new objects, and TLS requirements. Old applications can “work” in happy-path tests but fail under pool exhaustion, TLS renegotiation, BSON serialization, or aggressive timeouts.&lt;/p&gt;

&lt;p&gt;The third limit is post-upgrade state. The documentation describes index metadata refresh after MVU, usually in minutes but potentially up to two hours, with guidance to contact support if it exceeds three hours. I would not mark the window complete when the cluster returns to &lt;code&gt;available&lt;/code&gt;; I would close it only after critical queries, batch jobs, and capacity signals stabilize.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the feature shines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It reduces the number of change windows for old clusters, which matters when each outage requires communication, regulatory evidence, and an approved rollback plan.&lt;/li&gt;
&lt;li&gt;It preserves endpoints, tags, storage, and cluster configuration, reducing changes in applications, secrets, runbooks, and observability dashboards.&lt;/li&gt;
&lt;li&gt;It creates a shorter bridge to 8.0 capabilities such as Planner Version 3, Zstd, collation, views, Text Index V2, and newer drivers.&lt;/li&gt;
&lt;li&gt;It makes it easier to financially justify leaving DocumentDB 3.6, which entered Extended Support in 2026 and carries an additional cost premium.&lt;/li&gt;
&lt;li&gt;It favors fleet modernization programs: inventory, waves, automated prechecks, standardized evidence, and domain-level governance.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The dangerous part is overconfidence:&lt;/strong&gt; I would not run this upgrade as an isolated database change. The direct path shortens the journey, but the cluster is still unavailable, there is no in-place downgrade, clients must support TLS 1.2 or higher, and global or elastic clusters have their own upgrade restrictions. For critical production, restoring a snapshot to a new cluster is a recovery plan, not a magic rollback button; it changes endpoints, return time, and application reconnection operations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How I would design the window in a financial environment
&lt;/h2&gt;

&lt;p&gt;My approach would start with criticality classification. A cluster serving an internal catalog does not deserve the same process as one participating in fraud checks, onboarding, Open Finance consent, or transactional experience. For each critical cluster, I would capture owner, RTO, RPO, volume, number of collections, number of indexes, drivers per application, runtime versions, use of change streams, transactions, partial indexes, text search, and integrations with Lambda, Glue, MSK, or nightly jobs.&lt;/p&gt;

&lt;p&gt;Then I would create a clone of the cluster, with the same instance count as the target whenever possible, to estimate real duration and catch regressions. Testing must go beyond health checks: representative query replay, explain plans where useful, batch jobs, APIs with realistic connection pools, controlled failover outside the window, and comparison of p95/p99, CPU, I/O, FreeableMemory, DatabaseConnections, DatabaseCursors, and slow query logs.&lt;/p&gt;

&lt;p&gt;During the window, I would freeze deployments that could change access patterns, reduce concurrency for non-essential jobs, confirm a manual snapshot, and apply the upgrade with an explicit engine version and parameter group. After the cluster returns, I would keep an observation mode: no scaling, no reboot, and no forced failover until index metadata refresh completes. Final evidence would be both functional and operational: business transactions, latency, errors, queues, jobs, and dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical decision: direct upgrade, two hops, or parallel migration
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;When it fits&lt;/th&gt;
&lt;th&gt;Main risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Direct MVU to 8.0&lt;/td&gt;
&lt;td&gt;My preferred option when the Region and cluster confirm the path, drivers have been tested, and the downtime window is acceptable.&lt;/td&gt;
&lt;td&gt;It concentrates more change in one window; any incompatibility appears closer to cutover.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two-hop MVU&lt;/td&gt;
&lt;td&gt;Useful when documentation, the Region, or Support still indicates an intermediate path, or when the organization wants to reduce functional delta per step.&lt;/td&gt;
&lt;td&gt;More windows, more time in transitional state, and higher coordination cost.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel migration with DMS or application flow&lt;/td&gt;
&lt;td&gt;Good for clusters that cannot tolerate MVU downtime, need data model redesign, or want to validate 8.0 with shadow traffic.&lt;/td&gt;
&lt;td&gt;It doubles complexity: synchronization, dual-write or CDC, reconciliation, cutover, and possible data divergence.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The adoption path I would approve
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inventory by risk, not by AWS account&lt;/strong&gt; — Group clusters by criticality, RTO/RPO, Region, version, instance class, use of transactions, change streams, indexes, and application dependencies. The fleet plan must expose who accepts downtime and who needs parallel migration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validate path and prerequisites in the target Region&lt;/strong&gt; — Use the console and &lt;code&gt;aws docdb describe-db-engine-versions&lt;/code&gt; to confirm 8.0 as an available target, apply pending OS patches, review old instance families, configure the target parameter group, and handle partial indexes or problematic collection names before the window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rehearse on a clone with representative load&lt;/strong&gt; — Clone the volume, keep instance count close to production, run the upgrade, and execute real queries, batch jobs, and APIs with production-like pools. Compare latency, CPU, I/O, connections, cursors, and slow log baselines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prepare an honest rollback&lt;/strong&gt; — A manual snapshot is mandatory, but restore creates a new cluster. Document DNS, secrets, security groups, parameter groups, estimated restore time, abort criteria, and who has authority to decide during the window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operate post-upgrade as stabilization&lt;/strong&gt; — Wait for index metadata refresh, validate critical transactions, re-enable jobs in waves, watch p95/p99 and error rate by endpoint, and only then consider enabling new capabilities such as Zstd on existing collections or views in applications.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Likely failure modes and how I would mitigate them
&lt;/h2&gt;

&lt;p&gt;The most common database upgrade failure is not the service failing; it is the application revealing an invisible dependency. I would look for old Java, Node.js, Python, or .NET clients, container images without updated CA bundles, &lt;code&gt;tlsAllowInvalidCertificates&lt;/code&gt; in legacy environments, rigid timeouts, and pools with aggressive reconnection. From 8.0 onward, TLS 1.2 or higher is required; that needs to become an automated test, not a manual checklist.&lt;/p&gt;

&lt;p&gt;On the data side, I would inspect indexes and queries. Indexes inherited from 3.6/4.0 may work but not deliver the expected plan until rebuild or refresh. The documentation recommends considering &lt;code&gt;reIndex&lt;/code&gt; after upgrades from 3.6/4.0 for optimal performance, with additional I/O cost. I would not do that blindly in production; I would prioritize collections appearing in top queries, critical dashboards, and jobs with SLAs.&lt;/p&gt;

&lt;p&gt;Operationally, I would treat the upgrade event as controlled unavailability. API Gateway, ALB, Lambda, EKS, and workers must fail predictably: circuit breakers, maintenance responses, queues with DLQs where appropriate, retries with jitter, and idempotency for write commands. If the application keeps trying to write without limits during the window, the database returns to an artificial storm. The best architecture here is the one that knows how to stay quiet when a critical dependency is explicitly unavailable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-patterns I would block
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Running the direct MVU without a clone, without duration estimates, and without replaying the queries that support business SLOs.&lt;/li&gt;
&lt;li&gt;Using the return to &lt;code&gt;available&lt;/code&gt; as the only success criterion while ignoring index metadata refresh, p99 latency, driver errors, and job backlog.&lt;/li&gt;
&lt;li&gt;Combining engine upgrade, data model change, driver replacement, new compression policy, and application refactoring in the same window.&lt;/li&gt;
&lt;li&gt;Promising fast rollback without rehearsing snapshot restore to a new cluster, secrets update, DNS, or consumer application configuration.&lt;/li&gt;
&lt;li&gt;Approving the change only because Extended Support costs more, without quantifying downtime, compatibility risk, and validation cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Well-Architected reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: The TLS 1.2+ requirement is an opportunity to remove insecure clients, review certificate rotation, validate Secrets Manager, and restrict IAM around &lt;code&gt;docdb:ModifyDBCluster&lt;/code&gt;, &lt;code&gt;docdb:CreateDBClusterSnapshot&lt;/code&gt;, and ARN/Tag scope where possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: The architecture must declare the unavailability: communicated maintenance, tolerant queues, write idempotency, manual snapshot, restore runbook, and objective abort-or-continue criteria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;performance&lt;/strong&gt;: Planner Version 3, Text Index V2, and Zstd can improve latency and efficiency, but they count only after comparison with query-level baseline, index cardinality, document size, and real aggregation behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My curation note:&lt;/strong&gt; I would use the direct MVU to 8.0, but only after proving the path on a clone and resolving the temporary discrepancy between the announcement and operational documentation. In a financial environment, fewer steps are good; less evidence is dangerous. The lesson I have learned in database modernization is simple: the risk is rarely in the managed command; it is in the silent dependencies that were never tested under controlled failure. I would treat this release as a chance to retire old technical debt with discipline, not as a shortcut.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Verified references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/documentdb-major-version-upgrade-8-0/" rel="noopener noreferrer"&gt;AWS What's New - Amazon DocumentDB now supports direct major version upgrades to version 8.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/documentdb/latest/devguide/docdb-mvu.html" rel="noopener noreferrer"&gt;Amazon DocumentDB in-place major version upgrade documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/documentdb/latest/devguide/docdb-version-support-dates.html" rel="noopener noreferrer"&gt;Amazon DocumentDB engine version support dates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/documentdb/latest/devguide/docdb-engine-version-supportability.html" rel="noopener noreferrer"&gt;Amazon DocumentDB features and configurations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/documentdb/latest/devguide/limits.html" rel="noopener noreferrer"&gt;Amazon DocumentDB quotas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2025/11/documentdb-8-o/" rel="noopener noreferrer"&gt;Announcing Amazon DocumentDB 8.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/database/turbocharge-your-applications-with-amazon-documentdb-8-0/" rel="noopener noreferrer"&gt;AWS Database Blog - Turbocharge your applications with Amazon DocumentDB 8.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/documentdb/latest/devguide/support-charges.html" rel="noopener noreferrer"&gt;Amazon DocumentDB Extended Support charges&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My rating is 8/10. The direct upgrade to DocumentDB 8.0 is a very welcome capability for reducing accumulated risk, Extended Support cost, and modernization program complexity. I recommend adopting it for 3.6 and 4.0 clusters that can tolerate an outage window, provided the path is confirmed in the Region, drivers pass realistic testing, a manual snapshot exists, and post-upgrade monitoring continues until indexes and latency stabilize. For systems without an acceptable window or with poorly understood dependencies, I would still choose parallel migration or smaller waves. The service has improved; the architectural responsibility remains proving that the application can absorb the change.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/documentdb-8-0-mvu-direto-reduz-risco-nao-elimina-migracao-amazon-docum" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>aws</category>
      <category>documentdb</category>
      <category>mongodb</category>
    </item>
    <item>
      <title>PRM by User Agent: better attribution, governance still required</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:56:37 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/prm-by-user-agent-better-attribution-governance-still-required-17he</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/prm-by-user-agent-better-attribution-governance-still-required-17he</guid>
      <description>&lt;p&gt;The August 31, 2026 announcement expanding Partner Revenue Measurement to more services through User Agent looks, at first glance, like an AWS partner ecosystem detail. I read it differently: it is another step in the convergence of operational telemetry, product monetization, and commercial governance. The mechanism remains simple: partner applications making regular AWS API calls include an identifier in the User Agent using the &lt;code&gt;APN_1.1/pc_&amp;lt;AWS Marketplace product-code&amp;gt;$&lt;/code&gt; format; AWS uses applicable control-plane events logged in CloudTrail to attribute aggregated consumption to partner products. The value is fewer blind spots. The risk is mistaking monthly aggregated attribution for cost accounting, detailed billing, or absolute proof of adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was confirmed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;24&lt;/strong&gt; — services listed for User Agent. The current included-services documentation lists 24 service codes, including EC2, S3, RDS, CloudFront, EventBridge, Kinesis, WAF, and Shield.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;17 dias&lt;/strong&gt; — dashboard availability lag. The Attributed Revenue documentation states monthly processing and availability 17 days after the previous month ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 KB&lt;/strong&gt; — maximum &lt;code&gt;userAgent&lt;/code&gt; field size in CloudTrail. CloudTrail documents a 1 KB limit for &lt;code&gt;userAgent&lt;/code&gt;, with truncation under event-size conditions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;p&gt;The change does not require a new library, a new agent, or a heavy integration. Partners that already embedded the required User Agent format automatically benefit from the expanded coverage, according to AWS. That matters because real architectures rarely drive consumption in only one service. A data connector may touch S3, Glue, EventBridge, CloudWatch Logs, and Kinesis; a security platform may call WAF, Shield, CloudFront, Route 53, EC2, and ELB; a DevOps tool may operate CodeBuild, ECS, and DynamoDB. If attribution sees only a slice, the commercial conversation becomes distorted.&lt;/p&gt;

&lt;p&gt;The technical point is that AWS is using evidence that already exists in the control plane: API calls recorded in CloudTrail. This favors solutions that automate creation, update, inspection, or operation of AWS resources. It does not equally favor purely passive workloads, data-plane traffic without monthly control-plane activity, or components that run once and disappear. To me, the expansion turns User Agent into a low-friction instrumentation path for ISVs, but it does not remove the need to combine methods: Marketplace Metering when the product is an AMI or ML product sold through Marketplace, Resource Tagging when there are persistent attributable resources, and User Agent when the natural evidence is application action.&lt;/p&gt;

&lt;h2&gt;
  
  
  How User Agent attribution enters the operating cycle
&lt;/h2&gt;

&lt;p&gt;The diagram shows the right boundary: the application emits instrumented calls; CloudTrail records operational evidence; PRM consolidates attributed revenue; the partner uses it for product and partner management, not to replace granular FinOps.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏢 Produto do parceiro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Aplicação ISV SDK/CLI AWS (compute)&lt;/li&gt;
&lt;li&gt;Application ID APN_1.1/pc_&lt;code&gt;$ (security)&lt;/code&gt;
&lt;/li&gt;
&lt;code&gt;
&lt;/code&gt;
&lt;/ul&gt;
&lt;code&gt;
&lt;h3&gt;
  
  
  ☁️ Conta AWS do cliente
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;APIs AWS suportadas chamadas de plano de controle (edge)&lt;/li&gt;
&lt;li&gt;Serviços medidos EC2, S3, RDS, Kinesis... (data)&lt;/li&gt;
&lt;li&gt;AWS CloudTrail campo userAgent (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 AWS Partner Central
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Partner Revenue Measurement consolidação mensal (data)&lt;/li&gt;
&lt;li&gt;Attributed Revenue Dashboard produto, serviço, mês (frontend)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧭 Gestão
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;FinOps e produto hipóteses e reconciliação (user)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;app -&amp;gt; ua: configured once per runtime&lt;/li&gt;
&lt;li&gt;ua -&amp;gt; api: attaches User Agent to regular calls&lt;/li&gt;
&lt;li&gt;api -&amp;gt; services: operates supported resources&lt;/li&gt;
&lt;li&gt;api -&amp;gt; trail: generates events with userAgent&lt;/li&gt;
&lt;li&gt;trail -&amp;gt; prm: evidence for attribution&lt;/li&gt;
&lt;li&gt;prm -&amp;gt; dash: aggregates by product, service, and month&lt;/li&gt;
&lt;li&gt;dash -&amp;gt; finops: guides commercial analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it shines
&lt;/h2&gt;

&lt;p&gt;The strongest use case is a product that operates AWS environments on behalf of the customer: provisioners, data gateways, observability platforms, security tools, backup automation, landing zone accelerators, integration engines, and modernization products. In these scenarios, placing the identifier in the SDK reduces dependency on tags for resources the partner may not directly control. It also avoids the classic &lt;code&gt;aws-apn-id&lt;/code&gt; conflict: a resource can have only one tag with that key, so two partners cannot share the same marker on the same resource without an explicit ownership decision.&lt;/p&gt;

&lt;p&gt;In financial-grade environments, that operational detail matters. A governance platform that creates EventBridge rules, updates WAF, writes configuration to S3, and queries CloudWatch Logs needs to demonstrate value in an auditable way without invading the customer's accounting model. User Agent provides a lower-sensitivity signal: it shows that the solution drove consumption of certain services, aggregated by product and period, without exposing workload detail in the dashboard that should remain under the customer's control. That separation is healthy. The partner gets an impact view; the customer keeps control over detailed financial data, Cost Explorer, CUR, internal tags, and cost centers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strengths of the approach
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Low adoption friction: configuration can be applied through Application ID via shared config file, environment variable, or JVM property, depending on the SDK and tool.&lt;/li&gt;
&lt;li&gt;Good fit for automation: products making recurring API calls can generate usage evidence without requiring tag mutation on every resource.&lt;/li&gt;
&lt;li&gt;Less conflict in multi-partner ecosystems: the User Agent belongs to the call made by the solution, while tags compete on the same resource.&lt;/li&gt;
&lt;li&gt;More objective commercial governance: the dashboard consolidates product, service, and month, helping product leadership, alliances, and FinOps discuss trends from a shared base.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it hurts
&lt;/h2&gt;

&lt;p&gt;The main limitation is semantic: a control-plane call does not automatically equal perfect financial causality. If the application creates a resource once and the customer operates it directly for months, the User Agent evidence may become weak, because the documentation says monthly API operations on resources are required for attribution to occur. The opposite also deserves care: automation may touch an existing resource and, depending on PRM rules, produce attribution that must be interpreted in the right product, contract, and operating context.&lt;/p&gt;

&lt;p&gt;Another point is that &lt;code&gt;userAgent&lt;/code&gt; was not designed as a financial ledger. In CloudTrail it identifies the agent through which the request was made, has a documented maximum size of 1 KB, and can be truncated under event-size limits. For requests originated by AWS services, the field may reflect the calling service, not necessarily the original SDK client. I would not build a variable compensation process, financial pass-through, or contractual SLA solely on the attributed revenue dashboard. I would use the dashboard as aggregated evidence and trend data; for reconciliation, I would cross-check Marketplace, CUR, contracts, opportunity IDs, internal tags, and customer-consented data.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not treat PRM as the partner's Cost Explorer:&lt;/strong&gt; The Attributed Revenue Dashboard is aggregated by product, service, and billing period, with monthly availability. It is excellent for direction, coverage, and partner conversations; it does not replace CUR, Cost Explorer, chargeback, showback, budgets, cost anomalies, or the customer's internal audit trails.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How I would adopt it in a real solution
&lt;/h2&gt;

&lt;p&gt;I would start with the product causality matrix, not the code. For each capability, I would map which AWS calls the solution makes, in which account, in which Region, at what frequency, and with what relationship to the delivered value. In a SaaS platform managing resources in the customer's tenant, I would require a single runtime wrapper for AWS SDK clients: Node.js v3, boto3, Java v2, Go v2, or whatever stack the application uses. That wrapper would set the Application ID once, prevent divergent strings per microservice, and emit structured logs for critical calls: &lt;code&gt;aws.service&lt;/code&gt;, &lt;code&gt;aws.operation&lt;/code&gt;, &lt;code&gt;aws.region&lt;/code&gt;, &lt;code&gt;productCodeConfigured=true&lt;/code&gt;, &lt;code&gt;requestId&lt;/code&gt; when available, and outcome.&lt;/p&gt;

&lt;p&gt;In CI/CD, I would add contract tests validating the presence of &lt;code&gt;AWS_SDK_UA_APP_ID&lt;/code&gt; or equivalent configuration in the container, Lambda, ECS job, CodeBuild project, or runner that actually makes AWS calls. In production, I would verify samples in CloudTrail Lake or S3-delivered logs, searching for the &lt;code&gt;APN_1.1/pc_&lt;/code&gt; prefix in the &lt;code&gt;userAgent&lt;/code&gt; field. For accounts with SCPs and permission boundaries, I would not grant extra permission because of PRM; instrumentation must follow calls the solution is already authorized to make. Security comes before attribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adoption path I would approve
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;1. Define the responsibility boundary&lt;/strong&gt; — List only calls made directly by the partner solution. AWS documentation warns not to configure User Agent strings for customer-initiated calls that are independent of the solution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2. Centralize configuration&lt;/strong&gt; — Use SDK Application ID, the &lt;code&gt;AWS_SDK_UA_APP_ID&lt;/code&gt; variable, the &lt;code&gt;~/.aws/config&lt;/code&gt; file, or JVM property depending on the runtime. Avoid copying strings manually across dozens of clients.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;3. Validate in CloudTrail before celebrating the dashboard&lt;/strong&gt; — Make real test calls and confirm &lt;code&gt;userAgent&lt;/code&gt;, &lt;code&gt;eventSource&lt;/code&gt;, &lt;code&gt;eventName&lt;/code&gt;, &lt;code&gt;awsRegion&lt;/code&gt;, and &lt;code&gt;requestID&lt;/code&gt;. Then monitor the monthly dashboard window, knowing the documented availability is 17 days after month end.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;4. Combine methods when needed&lt;/strong&gt; — Use tags on persistent resources where appropriate, Marketplace Metering for eligible AMI/ML products, and User Agent for API automation. No single method models every product type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;5. Build monthly reconciliation&lt;/strong&gt; — Compare PRM trends with contracts, expected consumption, release notes, incidents, customer expansion, and architecture changes. The operating question is: does the signal make sense?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  User Agent, tags, and Marketplace Metering
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Best use&lt;/th&gt;
&lt;th&gt;Main risk&lt;/th&gt;
&lt;th&gt;Recommended control&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User Agent&lt;/td&gt;
&lt;td&gt;Solutions making regular API/CLI calls in customer or partner accounts.&lt;/td&gt;
&lt;td&gt;Confusing operational calls with complete financial causality.&lt;/td&gt;
&lt;td&gt;Single SDK wrapper, configuration test, and CloudTrail sampling.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Tagging&lt;/td&gt;
&lt;td&gt;Persistent resources clearly associated with the product.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;aws-apn-id&lt;/code&gt; conflict, IaC drift, and tag removal by any user with suitable access.&lt;/td&gt;
&lt;td&gt;IaC-based tagging, tag policy, AWS Config, and explicit customer agreement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketplace Metering&lt;/td&gt;
&lt;td&gt;AMI and ML products purchased and consumed through AWS Marketplace.&lt;/td&gt;
&lt;td&gt;Coverage limited to the eligible product model.&lt;/td&gt;
&lt;td&gt;Validation of listing, product code, and Marketplace commercial flow.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Well-Architected reading
&lt;/h2&gt;

&lt;p&gt;From the operational excellence pillar, I like the expansion because it forces a discipline many companies postpone: instrumenting their own operational footprint. A mature product knows which APIs it calls, why it calls them, which retry policy it applies, which idempotency token it uses, and which cost impact it may induce. If the solution creates S3 buckets, DynamoDB tables, Kinesis streams, or EventBridge rules, PRM through User Agent should be the consequence of an already observable architecture, not a commercial decoration added at the end.&lt;/p&gt;

&lt;p&gt;From the security pillar, I would be conservative. The product identifier must not leak secrets, tenant IDs, customer names, environments, or contracts. The published format uses the Marketplace product code, not sensitive data. I would enforce that pattern strictly and block attempts to place commercial context in the User Agent. In regulated organizations, I would also review privacy documentation and DPAs: even if the dashboard is aggregated, the signal originates from control-plane events, and that needs to be described in the customer transparency model.&lt;/p&gt;

&lt;p&gt;From the cost pillar, the benefit is indirect. PRM does not reduce the bill, but it helps compare where the product actually moves AWS consumption. That improves roadmap decisions: perhaps the product sells an analytics story, but attributed revenue appears in EC2 and RDS; perhaps a serverless promise produces more CloudWatch Logs than Lambda. Those deviations are architecture speaking to the business.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controls by pillar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: Do not place customer data in the User Agent. Ensure the string is only the APN format with product code, validate least privilege, and preserve segregation between partner and customer accounts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: Configure User Agent at the common SDK client creation point to avoid partial coverage. Monitor call failures, throttling, and retries so lack of attribution is not confused with lack of value.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Anti-patterns I would avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Putting the User Agent in generic customer automation that does not belong to the partner product.&lt;/li&gt;
&lt;li&gt;Adding tenant, email, customer name, or commercial opportunity into the User Agent to create inappropriate granularity.&lt;/li&gt;
&lt;li&gt;Using the monthly dashboard as the single proof for commission, renewal, or consumption disputes.&lt;/li&gt;
&lt;li&gt;Manually tagging resources managed by Terraform, CDK, or CloudFormation, causing drift and loss of operational trust.&lt;/li&gt;
&lt;li&gt;Instrumenting only the services currently measured and forgetting that AWS recommends applying PRM to the services and resources the solution interacts with to reduce rework as coverage grows.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My curator note:&lt;/strong&gt; I would implement User Agent in any serious partner product that operates AWS through SDKs, but I would put it under the same rigor as observability, security, and FinOps. The practical lesson is simple: weak commercial signals become political discussions; well-instrumented operational signals become objective conversations. Still, I would never promise ledger-level precision from a monthly aggregated source. For financial-grade systems, good architecture separates evidence, attribution, billing, and executive decision-making.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Verified references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/partner-revenue-measurement-user-agent-expansion/" rel="noopener noreferrer"&gt;AWS What's New: Partner Revenue Measurement expands service coverage for User Agent string capability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/PRM/latest/aws-prm-onboarding-guide/user-agent-included-services.html" rel="noopener noreferrer"&gt;AWS PRM Documentation: Included AWS Services for User Agent string&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/PRM/latest/aws-prm-onboarding-guide/automated-user-agent.html" rel="noopener noreferrer"&gt;AWS PRM Documentation: Automated User Agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/PRM/latest/aws-prm-onboarding-guide/troubleshooting.html" rel="noopener noreferrer"&gt;AWS PRM Documentation: Troubleshooting Partner Revenue Measurement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/partner-central/latest/getting-started/partner-analytics-attributed-revenue.html" rel="noopener noreferrer"&gt;AWS Partner Central Documentation: Attributed Revenue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html" rel="noopener noreferrer"&gt;AWS CloudTrail Documentation: Record contents and userAgent field&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/PRM/latest/aws-prm-onboarding-guide/manual-tagging.html" rel="noopener noreferrer"&gt;AWS PRM Documentation: Manual Resource Tagging implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fieldnotes.awyspr.com/2026-04-22-attributed-revenue-dashboards.html" rel="noopener noreferrer"&gt;fieldnotes: Attributed Revenue Dashboards - almost completing the PRM puzzle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is to adopt it. For AWS partners, especially ISVs operating customer workloads through APIs, the PRM User Agent expansion improves impact visibility with low technical cost and without requiring a new operating surface. The score is not higher because the capability still depends on service coverage, control-plane events, monthly processing, and careful interpretation. I would put it in the immediate backlog for partner platforms, with three conditions: centralized configuration, CloudTrail validation, and monthly reconciliation with FinOps and commercial data. As attribution technology, it is strong; as a true financial system, it still needs surrounding controls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; 8/10&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/prm-por-user-agent-atribuicao-melhor-governanca-ainda-necessaria-partner-reve" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

&lt;/code&gt;

</description>
      <category>aiagents</category>
      <category>aws</category>
      <category>partnerrevenuemeasurement</category>
      <category>cloudtrail</category>
    </item>
    <item>
      <title>MediaTailor Analytics: console, BI, or lakehouse?</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:56:35 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/mediatailor-analytics-console-bi-or-lakehouse-1pbh</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/mediatailor-analytics-console-bi-or-lakehouse-1pbh</guid>
      <description>&lt;p&gt;When AWS adds a native MediaTailor dashboard for fill rate, impressions, video completion, and beacon recovery, the right question is not whether the console became nicer. The architecture question is: which layer should answer each class of question about money, viewer experience, and operational health? In streaming systems with real monetization, especially with contracts, audit, multiple regions, and ad partners, an aggregated metric can accelerate a decision or hide a loss. I would treat the new dashboard as the level-one control room: fast, official, and useful for triage. For financial close, SLOs, and causal investigation, I would still design a more explicit evidence chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real choice: operational speed versus analytical depth
&lt;/h2&gt;

&lt;p&gt;The August 31, 2026 announcement is small, but it touches a recurring issue in media platforms: the gap between available metrics and actionable metrics. MediaTailor already published metrics to CloudWatch; what changes is the curation inside the console, with a global and multi-region view, comparison between region groups, and drill-down by playback configuration. That shortens the time between noticing a monetization drop and locating a suspicious configuration or tracking domain.&lt;/p&gt;

&lt;p&gt;I would compare four options. The first is using the native dashboard as the primary operations experience. The second is building custom CloudWatch dashboards and alarms. The third is moving logs, beacons, and business data into a lakehouse on S3, Glue/Athena, or Redshift. The fourth is relying on an ad-tech or QoE SaaS platform that correlates player telemetry, ads, and commercial contracts. None is universally better. They answer different questions, with different latency, cost, governance, and accountability.&lt;/p&gt;

&lt;p&gt;The trap is expecting one screen to solve monetization, engineering, and finance. In financial-grade environments, I split the problem into three planes: operational triage in minutes, technical diagnosis in hours, and reconciliation/audit in closed reporting windows. The new dashboard strongly improves the first plane.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the native dashboard actually buys
&lt;/h2&gt;

&lt;p&gt;The native dashboard’s main advantage is semantics. It already knows which metrics matter for SSAI: weighted fill rate, ad insertion rate, ad impression rate, video completion rate, and ad insertions. The documentation also makes important formulas explicit, such as weighted fill rate calculated as summed filled duration divided by summed avail duration, not as a simple average across regions. That sounds operational, but it avoids a common distortion: a small region with marginal traffic should not carry the same statistical weight as a primary region.&lt;/p&gt;

&lt;p&gt;Another gain is the beacon dimension by tracking domain. The August 2026 metrics for fired, retried, and recovered impression and complete beacons, associated with &lt;code&gt;AdTrackingDomain&lt;/code&gt;, create a view closer to the money: not only how many ads were inserted, but how many billable confirmations were recovered by server-side retry. Practically, this helps separate ADS issues, tracking vendor issues, network issues, and player issues.&lt;/p&gt;

&lt;p&gt;I also value that the dashboard opens on the last 1-day window and supports region comparison. For operations, that is enough for first triage: “is the problem global, regional, configuration-specific, or partner-specific?” Answering that quickly saves long calls across teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison of the four approaches
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Best use&lt;/th&gt;
&lt;th&gt;Decision latency&lt;/th&gt;
&lt;th&gt;Governance&lt;/th&gt;
&lt;th&gt;Main risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Native MediaTailor dashboard&lt;/td&gt;
&lt;td&gt;Daily triage of SSAI monetization and performance by region, configuration, and beacon domain.&lt;/td&gt;
&lt;td&gt;Minutes; uses CloudWatch metrics in the console.&lt;/td&gt;
&lt;td&gt;Read IAM for MediaTailor and CloudWatch; good for controlled operations.&lt;/td&gt;
&lt;td&gt;Becoming the source of truth for financial reconciliation without a separate data trail.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom CloudWatch&lt;/td&gt;
&lt;td&gt;Alarms, SLOs, product dashboards, and correlation with origin, CDN, and applications.&lt;/td&gt;
&lt;td&gt;Minutes to tens of minutes, depending on period and alarms.&lt;/td&gt;
&lt;td&gt;Excellent for IaC, versioned alarms, tags, and runbooks.&lt;/td&gt;
&lt;td&gt;Cardinality, API cost, and alarm sprawl without a clear service model.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lakehouse on S3/Glue/Athena/Redshift&lt;/td&gt;
&lt;td&gt;Audit, financial close, historical analysis, and correlation with commercial contracts.&lt;/td&gt;
&lt;td&gt;Hours or closed windows; can be near real time with Firehose, but does not need to be.&lt;/td&gt;
&lt;td&gt;Strong for retention, lineage, cataloging, KMS, and segregated access.&lt;/td&gt;
&lt;td&gt;Building an expensive analytics platform to answer simple operational questions.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QoE/ad-tech SaaS&lt;/td&gt;
&lt;td&gt;Independent player view, user journey, partner validation, and benchmarking.&lt;/td&gt;
&lt;td&gt;Minutes to hours, depending on SDKs and ingestion.&lt;/td&gt;
&lt;td&gt;Depends on contracts, DPA, data residency, and privacy controls.&lt;/td&gt;
&lt;td&gt;Vendor lock-in without reconciliation against official SSAI provider metrics.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where I would draw the CloudWatch boundary
&lt;/h2&gt;

&lt;p&gt;I would not duplicate the native dashboard in CloudWatch out of platform vanity. I would use the MediaTailor console for exploratory questions and create custom CloudWatch assets only where there is an automatic operational decision: an alarm, an SLO, a runbook, or a capacity change. For example, an ad impression rate drop alarm per playback configuration should exist if it triggers investigation or mitigation. A chart someone looks at once a month may not deserve IaC.&lt;/p&gt;

&lt;p&gt;The dashboard’s minimum access requires &lt;code&gt;mediatailor:ListPlaybackConfigurations&lt;/code&gt;, &lt;code&gt;cloudwatch:ListMetrics&lt;/code&gt;, and &lt;code&gt;cloudwatch:GetMetricData&lt;/code&gt;. In a serious operation, I would separate roles: operators with multi-region read access, engineers allowed to change playback configurations through a pipeline, and automation accounts scoped explicitly by region and tag. For MediaTailor, the authorization model includes resources such as &lt;code&gt;playbackConfiguration&lt;/code&gt; and conditions through &lt;code&gt;aws:ResourceTag&lt;/code&gt;, so tagging configurations by product, environment, criticality, and owner makes sense.&lt;/p&gt;

&lt;p&gt;Cost also needs design. The dashboard documentation says tables can make up to 10 &lt;code&gt;ListMetrics&lt;/code&gt; calls per selected region on each load, while tiles and trends do not use &lt;code&gt;ListMetrics&lt;/code&gt;. That is not a problem in normal operations, but it can become noise in NOCs with screens refreshed all day. I would put CloudWatch API usage into the FinOps review, not as a blocker, but as hygiene.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision layers for SSAI analytics
&lt;/h2&gt;

&lt;p&gt;The diagram shows how I would separate triage, diagnosis, and reconciliation without turning the native dashboard into the single source of truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎬 Tráfego de streaming
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Players HLS/DASH sessões e beacons (user)&lt;/li&gt;
&lt;li&gt;CloudFront/CDN cache e entrega (edge)&lt;/li&gt;
&lt;li&gt;Origem de conteúdo manifests com markers (storage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 SSAI AWS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MediaTailor playback configurations (compute)&lt;/li&gt;
&lt;li&gt;ADS externo VAST/VMAP (external)&lt;/li&gt;
&lt;li&gt;Retry de beacon fired/retried/recovered (messaging)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Observabilidade
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CloudWatch Metrics AWS/MediaTailor (data)&lt;/li&gt;
&lt;li&gt;Dashboard nativo triagem multi-região (frontend)&lt;/li&gt;
&lt;li&gt;Alarmes/SLOs runbooks versionados (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏦 Evidência de negócio
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Logs e exports S3/Firehose (storage)&lt;/li&gt;
&lt;li&gt;Lakehouse Glue/Athena/Redshift (data)&lt;/li&gt;
&lt;li&gt;Reconciliação contratos e billing (external)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;player -&amp;gt; cdn: requests manifests/segments&lt;/li&gt;
&lt;li&gt;cdn -&amp;gt; mt: SSAI personalization&lt;/li&gt;
&lt;li&gt;mt -&amp;gt; origin: fetches base manifest&lt;/li&gt;
&lt;li&gt;mt -&amp;gt; ads: requests ad decision&lt;/li&gt;
&lt;li&gt;mt -&amp;gt; beacon: fires and retries beacons&lt;/li&gt;
&lt;li&gt;mt -&amp;gt; cw: publishes metrics&lt;/li&gt;
&lt;li&gt;cw -&amp;gt; native: GetMetricData/ListMetrics&lt;/li&gt;
&lt;li&gt;cw -&amp;gt; alarms: evaluates SLOs&lt;/li&gt;
&lt;li&gt;mt -&amp;gt; logs: ADS/reporting events&lt;/li&gt;
&lt;li&gt;logs -&amp;gt; lake: partitions by date/region/config&lt;/li&gt;
&lt;li&gt;lake -&amp;gt; finance: closes revenue gaps&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lakehouse: when a metric becomes evidence
&lt;/h2&gt;

&lt;p&gt;The dashboard answers “what is happening now?” well. It should not be the only artifact to answer “how much revenue did we recognize and why?” When there is revenue share, premium campaigns, make-good clauses, or partner audit, I want reprocessable data. The lakehouse layer belongs there: ADS and reporting logs, CSV exports when useful, player data, content catalog, contract tables, and financial events. The minimum partitioning I would use is &lt;code&gt;dt&lt;/code&gt;, &lt;code&gt;region&lt;/code&gt;, &lt;code&gt;configuration_name&lt;/code&gt;, &lt;code&gt;ad_tracking_domain&lt;/code&gt;, and &lt;code&gt;event_type&lt;/code&gt;, with KMS managed by the media domain key, Lake Formation for role-based access, and S3 lifecycle separating raw, curated, and aggregated zones.&lt;/p&gt;

&lt;p&gt;Granularity matters. A CloudWatch metric is excellent for trend, but it loses event context. Logs can explain whether a fill drop came from ADS timeout, invalid VAST, incompatible creative, unstable beacon domain, or origin limit. MediaTailor has relevant quotas for this analysis: 10,000 ad insertion requests per second per region as an adjustable quota, up to 1,000 configurations, a 2 MB manifest, 3-second default ADS timeout, 2-second origin timeout, and session expiration at 10 times the manifest duration. Those numbers define the operational envelope.&lt;/p&gt;

&lt;p&gt;I would not ingest infinitely without purpose. I would define business questions before the pipeline: discrepancy between &lt;code&gt;AdsBilled&lt;/code&gt; and impressions, recovery by domain, loss by region, affected campaigns, and estimated revenue impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision matrix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Start with the native dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lowest adoption time; no initial data modeling.&lt;/li&gt;
&lt;li&gt;Monetization metrics already calculated with official semantics.&lt;/li&gt;
&lt;li&gt;Multi-region comparison and configuration drill-down help triage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does not replace financial reconciliation or event-level investigation.&lt;/li&gt;
&lt;li&gt;Tables can consume &lt;code&gt;ListMetrics&lt;/code&gt; calls per region on repeated loads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; My default choice for level-one operations and immediate adoption.&lt;/p&gt;

&lt;h3&gt;
  
  
  CloudWatch as a custom operations panel
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enables alarms, SLOs, warm-up periods, and runbooks treated as code.&lt;/li&gt;
&lt;li&gt;Correlates MediaTailor with CloudFront, origin, WAF, Lambda, and internal services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires discipline against cardinality and ownerless dashboards.&lt;/li&gt;
&lt;li&gt;Can duplicate the console without creating new operational action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Use it when there is an associated alarm, SLO, or automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monetization lakehouse
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates an auditable, reprocessable trail for revenue, contracts, and partners.&lt;/li&gt;
&lt;li&gt;Enables historical analysis, content cohorts, and campaign-level discrepancy review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More expensive in engineering, governance, and data quality.&lt;/li&gt;
&lt;li&gt;Should not become the primary tool for a five-minute incident.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Mandatory when the metric affects revenue recognition or audit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Independent QoE/ad-tech SaaS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brings client-side view, player SDK, and external partner validation.&lt;/li&gt;
&lt;li&gt;Can accelerate benchmarking and device-level regression detection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Needs privacy, data residency, and lock-in assessment.&lt;/li&gt;
&lt;li&gt;Does not remove the need to reconcile against official SSAI metrics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Useful as a second opinion, not as the sole authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real failure modes the comparison must cover
&lt;/h2&gt;

&lt;p&gt;In SSAI, failure is rarely binary. The viewer can keep watching while revenue is lost. The ADS can respond within timeout, but with VAST that results in skipped creatives. The origin can deliver a manifest that is too large or too slow. The tracking vendor can accept some beacons and fail in bursts. A secondary region can look healthy as a percentage while representing little volume. That is why I like comparing counts and rates together.&lt;/p&gt;

&lt;p&gt;A plausible example: a live sports final with 500,000 viewers and 18 ad breaks. AWS’s own pricing page uses a similar scenario for monetization functions and shows 9.5 million invocations when there is an initialization hook and a hook per break. In that kind of event, a 2 percentage point drop in impression rate for 20 minutes can be relevant enough to trigger a war room, even if video playback is perfect. On the other hand, a fill drop in a region with 1% of traffic may be less urgent than origin latency affecting every manifest.&lt;/p&gt;

&lt;p&gt;I would model idempotency and retry around stable identifiers: playback session, avail, ad, beacon type, tracking domain, and region. For operations, the native dashboard shows the surface. For engineering, logs and metrics must confirm whether retry recovered impressions or merely delayed loss. For finance, only reconcilable evidence counts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The new signal is beacon recovery:&lt;/strong&gt; For me, the most important point is not the dashboard itself; it is the visibility into fired, retried, and recovered by tracking domain. That turns server-side retry from an invisible implementation detail into an economic resilience indicator. In media platforms, technical availability and monetization availability are not the same thing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Well-Architected reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: Use least privilege for operational read access: &lt;code&gt;mediatailor:ListPlaybackConfigurations&lt;/code&gt;, &lt;code&gt;cloudwatch:GetMetricData&lt;/code&gt;, and &lt;code&gt;cloudwatch:ListMetrics&lt;/code&gt; should be separated from change permissions. Tags by product, environment, and criticality help apply IAM conditions where the service supports taggable resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: Compare regions by volume, not only by percentage. Monitor ADS timeouts, origin failures, manifest limits, and beacon drops. Use alarm warm-up periods when creating resources and alarms together to avoid startup noise.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My phased architecture recommendation
&lt;/h2&gt;

&lt;p&gt;I would adopt the native dashboard immediately in any existing MediaTailor operation. I would do it without a large project: review IAM, validate regions, check playback configuration naming, standardize tags, and document three triage questions. First: is the regression global or regional? Second: is it concentrated in one configuration? Third: does it appear on a specific beacon domain? That alone improves response time.&lt;/p&gt;

&lt;p&gt;Then I would create custom CloudWatch assets sparingly. Alarms for sustained drops in impression rate, fill rate, and complete rate need product-specific thresholds, not global ones. For live sports, I would accept shorter windows and more noise; for VOD, I would prefer longer windows and baseline comparison. Where alarms are created together with new configurations or new services, the recent CloudWatch warm-up period feature matters: delaying evaluation for 1 to 2,880 minutes, or starting when enough data exists, reduces bootstrap false positives.&lt;/p&gt;

&lt;p&gt;Finally, I would add a lakehouse only when there is a reconciliation, audit, or contract-correlation obligation. The pipeline can start simple: periodic export, logs in S3, Glue catalog, Athena queries, and daily aggregates. Redshift enters when analytical cadence, concurrency, and commercial joins justify it. The mature solution is not the most sophisticated one; it is the one that makes clear which number is for operations, which is for engineering, and which is for revenue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Curator note:&lt;/strong&gt; I would start with the MediaTailor dashboard and resist the temptation to build a parallel cockpit in the first week. The lesson I learned in critical environments is that good observability is not the number of charts; it is a short chain between signal, owner, and action. When monetization is involved, however, I never let the console be the only evidence. Operations need speed, but finance and audit need reprocessable data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/mediatailor-analytics-dashboard/" rel="noopener noreferrer"&gt;AWS What's New: AWS Elemental MediaTailor introduces in-console analytics dashboard for ad monetization and streaming pe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/mediatailor/latest/ug/analytics-dashboard.html" rel="noopener noreferrer"&gt;AWS Elemental MediaTailor User Guide: Monitoring ad insertion performance with the analytics dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/mediatailor/latest/ug/monitoring-cloudwatch-metrics.html" rel="noopener noreferrer"&gt;AWS Elemental MediaTailor User Guide: Monitoring with Amazon CloudWatch metrics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/mediatailor/latest/ug/document-history.html" rel="noopener noreferrer"&gt;AWS Elemental MediaTailor Document History&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/general/latest/gr/mediatailor.html" rel="noopener noreferrer"&gt;AWS General Reference: AWS Elemental MediaTailor endpoints and quotas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/mediatailor/pricing/" rel="noopener noreferrer"&gt;AWS Elemental MediaTailor Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/cloudwatch/pricing/" rel="noopener noreferrer"&gt;Amazon CloudWatch Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/amazon-cloudwatch-alarms-warmup-period/" rel="noopener noreferrer"&gt;AWS What's New: Amazon CloudWatch now supports warm-up periods for alarms&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is to use the new MediaTailor dashboard as the official operational triage layer, custom CloudWatch only for alarms/SLOs with clear action, and a lakehouse for financial reconciliation and historical analysis. If the operation has nothing yet, do not start with a data platform: start with the console, standardize tags and runbooks, then promote only the metrics that truly change a decision. If there is material revenue, complex contracts, or partner dispute, the dashboard remains valuable, but it is no longer sufficient. In that case, the right architecture is deliberately layered: console for speed, CloudWatch for operational reliability, and reprocessable data for financial trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; recommended-layered&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/mediatailor-analytics-console-bi-ou-lakehouse-aws-elementa" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>aws</category>
      <category>mediatailor</category>
      <category>cloudwatch</category>
    </item>
    <item>
      <title>ADR: bringing governed agents into Amazon Quick</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:56:03 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/adr-bringing-governed-agents-into-amazon-quick-198h</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/adr-bringing-governed-agents-into-amazon-quick-198h</guid>
      <description>&lt;p&gt;My decision would be to adopt AWS Agent Registry as the governed catalog for agents and MCP servers exposed to Amazon Quick, but only after clearly separating three responsibilities: technical publishing, risk curation, and business-user consumption. The August 31, 2026 announcement looks small because it mentions discovery and pre-populated connection details. In practice, it moves agent architecture away from a handcrafted model, where each team pastes an MCP URL into a tool, and toward a platform model, where the catalog becomes the operational control plane.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context: coupling moved from code into the catalog
&lt;/h2&gt;

&lt;p&gt;In financial environments, the first wave of agents is usually productive and risky at the same time. One team creates an MCP server for ticket lookup, another publishes a tool for contract search, a third connects an internal credit-risk API, and soon there is a collection of endpoints with unclear owners, scopes, credentials, and versions. MCP itself is not the issue. The issue is the lack of a reliable inventory once those servers become an operational surface.&lt;/p&gt;

&lt;p&gt;What Amazon Quick changes is that this inventory becomes directly consumable by users in the same workspace where they chat, build apps, automate flows, and run research. AWS Agent Registry already provided the catalog, hybrid search, approval, and records for MCP servers, agents, skills, and custom resources. The Quick integration adds the last mile: a user can find an approved resource and create a connector with pre-filled details instead of relying on a wiki, an issue, or a Slack message containing the right URL.&lt;/p&gt;

&lt;p&gt;The main architectural force is governance without excessive friction. If I let every area connect MCP servers directly in Quick, I gain local speed and lose traceability. If I centralize too aggressively, I create a queue and encourage bypasses. The governed registry is the middle ground: distributed publishing, centralized discovery, explicit approval, and consumption close to the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Options considered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Connect MCP servers directly in Quick per team
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shortest initial time for prototypes and local automations.&lt;/li&gt;
&lt;li&gt;Low dependency on a central platform team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weak inventory, unclear ownership, and connector duplication.&lt;/li&gt;
&lt;li&gt;Hard to prove who approved an MCP server, which version was active, and which scope was shared.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Acceptable for a lab; unsuitable for regulated use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Block Quick and consume agents only through internal applications
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maximum control over UX, authentication, telemetry, and approval flow.&lt;/li&gt;
&lt;li&gt;Allows specific policies per critical domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increases internal product cost and reduces business-user adoption.&lt;/li&gt;
&lt;li&gt;Duplicates capabilities Quick already provides: chat, apps, flows, research, and sharing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Useful for very high-risk flows, but expensive as the enterprise default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use AWS Agent Registry as the approved catalog for Quick
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintains one source of truth for MCP servers and agents discovered in Quick.&lt;/li&gt;
&lt;li&gt;Uses approval, search, CloudTrail, tags, IaC, and AWS RAM sharing where applicable.&lt;/li&gt;
&lt;li&gt;Reduces manual setup without removing the need for per-user authentication and permissioning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires maturity around curation, versioning, and record deprecation.&lt;/li&gt;
&lt;li&gt;Quick supports only certain MCP descriptors in this integration, so A2A and local endpoints stay out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; My choice for an enterprise agent platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision: treat the registry as a control plane, not a link list
&lt;/h2&gt;

&lt;p&gt;I would decide on one registry per relevant operating environment, starting with production rather than dozens of squad-level catalogs. AWS Agent Registry allows registries to be organized by type, stage, team, or business unit, but in a large organization, early fragmentation destroys discovery. For Quick, I would start with a regional registry aligned to the Quick account itself, because the integration documentation requires the same account and same Region, a READY registry, AWS_IAM authorization with SigV4, the agent-registry namespace, and only one active registry per Quick account.&lt;/p&gt;

&lt;p&gt;This has an important consequence: if the company has multiple accounts producing agents, the decision is not merely technical. It is a multi-account governance decision. The Agent Registry general availability announcement mentions AWS RAM sharing and automatic detection of AgentCore Runtime and Gateway resources across an organization, but the Quick integration creates a practical consumption boundary in the Quick account and Region. I would design the topology with a platform account for curation and a Quick account per domain only when regulatory or data-segregation reasons justify it.&lt;/p&gt;

&lt;p&gt;The registry must not be populated by enthusiasm. Each record needs a stable name, version, owner, data class, authentication policy, runbook, expected SLO, and domain tags. Without that, the catalog becomes a polished storefront for invisible coupling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chosen flow: publish, approve, discover, and share
&lt;/h2&gt;

&lt;p&gt;The design centralizes discovery and approval in Agent Registry, while Quick remains the consumption experience for chat, agents, apps, flows, and research.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ Engenharia — Publicação
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Servidor MCP remoto API interna ou AgentCore Gateway (compute)&lt;/li&gt;
&lt;li&gt;Registro versionado mcpServer descriptor (data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 AWS — Catálogo governado
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS Agent Registry READY, AWS_IAM, SigV4 (ai)&lt;/li&gt;
&lt;li&gt;Curadoria aprovar, rejeitar, depreciar (security)&lt;/li&gt;
&lt;li&gt;CloudTrail + tags trilha e ownership (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💼 Amazon Quick — Consumo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Admin Quick vincula um registry (user)&lt;/li&gt;
&lt;li&gt;Custom MCP connector detalhes pré-preenchidos (frontend)&lt;/li&gt;
&lt;li&gt;Times de negócio chat, agents, apps, flows, research (user)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;mcp -&amp;gt; record: describes endpoint and tools&lt;/li&gt;
&lt;li&gt;record -&amp;gt; registry: publishes version&lt;/li&gt;
&lt;li&gt;registry -&amp;gt; approval: submits for approval&lt;/li&gt;
&lt;li&gt;approval -&amp;gt; registry: makes discoverable&lt;/li&gt;
&lt;li&gt;registry -&amp;gt; audit: logs APIs&lt;/li&gt;
&lt;li&gt;admin -&amp;gt; registry: links in same account and Region&lt;/li&gt;
&lt;li&gt;registry -&amp;gt; connector: loads approved MCP servers&lt;/li&gt;
&lt;li&gt;connector -&amp;gt; team: shares governed use&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Forces: identity, scope, and the risk of invisible automation
&lt;/h2&gt;

&lt;p&gt;The most sensitive decision is not semantic search in the catalog; it is the authorization path between the user, Quick, the connector, and the MCP server. The Quick documentation indicates that Agent Registry does not store connector authentication credentials; each user authenticates or provides credentials according to the connector setup. That is the right model for environments where an account lookup, ticket update, or report generation must reflect the real user identity, not a generic automation identity.&lt;/p&gt;

&lt;p&gt;I would avoid service connectors for mutable operations in financial domains unless there is an explicit business authorization layer behind them. For reads, I would still require minimal scopes and domain segmentation. For writes, I would make idempotency keys mandatory, validate payloads, enforce per-user rate limits, and require human confirmation for commands that move money, alter critical registration data, change risk parameters, or affect regulated servicing.&lt;/p&gt;

&lt;p&gt;The MCP server design must be as rigorous as an internal public API. Tool names should be stable; schemas should reject extra fields; responses should carry a correlation id; timeouts should be lower than the maximum acceptable interaction time in Quick. As an operating reference, I would target p95 under 2 seconds for simple reads, 5 to 10 seconds for aggregations, and asynchronous execution with Step Functions or a queue for anything beyond that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operating model: version agents as internal products
&lt;/h2&gt;

&lt;p&gt;An agent catalog only works if the lifecycle is explicit. I would define states similar to draft, approved, deprecated, and revoked, even when part of that already exists as a native registry workflow. Draft is technical publication that is not yet consumable. Approved requires security review, a business owner, test evidence, and data classification. Deprecated preserves compatibility for a defined window. Revoked removes discovery immediately when there is an incident, loss of ownership, or scope change.&lt;/p&gt;

&lt;p&gt;The registry version must mean contract, not decorative release notes. If an MCP server changes a tool schema, changes authorization semantics, or starts performing a write where it previously only read, that is a new version and a new approval. I would use names like domain/capability and semantic versions when the contract is consumed by multiple agents. Tags should carry domain, data-classification, environment, owner, cost-center, and criticality. In AWS accounts, that aligns with IAM conditions and governance reporting, even when the end user only sees a connector in Quick.&lt;/p&gt;

&lt;p&gt;For observability, I would require three trails. CloudTrail for Registry control APIs. Structured MCP logs with tenant, pseudonymized user subject, tool, registry-record-version, latency, outcome, and correlation id. Tool-level metrics in CloudWatch or Datadog: invocation count, error rate, p95, timeout rate, auth failures, and deny decisions. Without these trails, the platform cannot distinguish healthy adoption from uncontrolled automation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Architectural consequence:&lt;/strong&gt; The integration does not make every registered agent automatically safe for business use. The Quick documentation limits support to MCP records with an mcpServer descriptor, remote servers with a URL, and specific requirements for account, Region, namespace, READY state, and AWS_IAM authorization. Skills, custom records, A2A descriptors, local endpoints such as stdio, docker, or npx, and JWT-based registries should not be treated as available through this path. I would also validate the Region in the console before rollout, because same-day public launch pages show a regional-list difference between the general Registry announcement and the Quick-specific announcement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Reference implementation for a regulated organization
&lt;/h2&gt;

&lt;p&gt;My reference implementation would start small: one production registry in the Region where Quick and AgentCore are available for the domain, linked by an administrator through Manage account, Permissions, AWS Agent Registry. The minimum policy for the Quick managed or customer role needs to allow reading and searching discoverable records, including agent-registry:SearchDiscoverableRegistryRecords and agent-registry:GetDiscoverableRegistryRecord; administrators also need to list and view registries for setup to appear.&lt;/p&gt;

&lt;p&gt;MCP servers would sit behind AgentCore Gateway when there is a need to transform APIs, Lambda functions, or existing services into tools with more governed inbound and outbound authentication. For sensitive internal APIs, I would prefer VPC, PrivateLink, or private connectivity where the integration pattern supports it. The Quick MCP documentation also supports private servers reachable through a Quick VPC connection, but requires the OAuth endpoints used by the MCP server to be publicly reachable; that must enter the security review because many companies wrongly assume the entire authentication path can remain private.&lt;/p&gt;

&lt;p&gt;In the backend, DynamoDB can store idempotency state with partition key userId#toolName and sort key idempotencyKey, a TTL of 24 to 72 hours, and an attribute_not_exists condition on first execution. Step Functions should orchestrate long operations with explicit retries, backoff, and compensation. S3 with SSE-KMS stores non-sensitive execution evidence. The key is not putting risk logic in the prompt: authorization, validation, and auditability live in code and policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Well-Architected reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: Use user identity whenever the action represents human privilege. Restrict Quick IAM to the minimum needed for discovery, validate OAuth scopes in the MCP server, separate reads from writes, and log deny decisions. The catalog reduces shadow AI, but it becomes real control only when approval, tags, CloudTrail, and tool logs are mandatory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: Treat every tool call as a fallible distributed call. Define timeouts, retries with jitter, idempotency, circuit breakers for unstable dependencies, and degraded responses when the source system is unavailable. A shared connector in Quick can multiply traffic quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Anti-patterns I would block
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Registering an MCP server without a technical owner and a business owner.&lt;/li&gt;
&lt;li&gt;Exposing write operations with shared credentials and no idempotency.&lt;/li&gt;
&lt;li&gt;Using tool description as a substitute for authorization policy.&lt;/li&gt;
&lt;li&gt;Approving connectors for convenience without classifying data and operational impact.&lt;/li&gt;
&lt;li&gt;Keeping old versions discoverable without a deprecation date.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Curator note:&lt;/strong&gt; I would adopt this integration, but I would start with three read connectors and one low-risk write flow. My experience is that enterprise catalogs fail when they try to catalog everything before proving the operating model. The first goal is not the number of agents; it is proving that publishing, approval, observability, and revocation work without an emergency meeting. After that, scaling becomes engineering, not hope.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/aws-agent-registry-agents-mcp-servers-quick/" rel="noopener noreferrer"&gt;AWS What's New: AWS Agent Registry agents and MCP servers now available in Amazon Quick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.amazonaws.cn/en_us/quick/latest/userguide/aws-agent-registry-integration.html" rel="noopener noreferrer"&gt;Amazon Quick User Guide: Amazon Agent Registry integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/registry.html" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore: AWS Agent Registry overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/registry-mcp-endpoint.html" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore: Using the Registry MCP endpoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/aws-agent-registry-generally-available/" rel="noopener noreferrer"&gt;AWS What's New: AWS Agent Registry generally available&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/machine-learning/manage-agents-tools-and-skills-at-scale-with-aws-agent-registry/" rel="noopener noreferrer"&gt;AWS Machine Learning Blog: Manage agents, tools and skills at scale with AWS Agent Registry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/quick/latest/userguide/mcp-integration.html" rel="noopener noreferrer"&gt;Amazon Quick User Guide: Model Context Protocol integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-using.html" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore: Use an AgentCore gateway&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is to approve AWS Agent Registry as the governed catalog for resources consumed in Amazon Quick, with a domain-controlled rollout, versioned records, mandatory curation, and per-tool telemetry. I would not approve adoption as a simple MCP setup shortcut. The real value is turning agents and MCP servers into discoverable, auditable, and revocable internal products without pulling business users away from the environment where they work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; adopt-with-guardrails&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/adr-levar-agentes-governados-para-o-amazon-quick-aws-agent-re" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>aws</category>
      <category>agentregistry</category>
      <category>amazonquick</category>
    </item>
    <item>
      <title>Private Redshift SSO with EVR: a pattern teardown</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:56:02 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/private-redshift-sso-with-evr-a-pattern-teardown-hai</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/private-redshift-sso-with-evr-a-pattern-teardown-hai</guid>
      <description>&lt;p&gt;On August 31, 2026, AWS announced that Amazon Redshift now supports authentication through AWS IAM Identity Center for provisioned clusters and serverless workgroups configured with enhanced VPC routing. The change looks small in the console, but it closes a recurring gap in regulated analytics platforms: it was common to keep data, COPY/UNLOAD, and S3 integrations on a private path while part of authentication still required an egress exception. My reading is simple: when the warehouse is financial-grade, subject to data residency, network segregation, and operational evidence, identity is production traffic too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: SSO was not enough when the network was the control
&lt;/h2&gt;

&lt;p&gt;In many data architectures, SSO is presented as a user experience feature, but the real problem is boundary control. An analyst signs in through Query Editor v2 or a JDBC/ODBC driver, receives a token from IAM Identity Center, and presents that token to Redshift. The critical point is that Redshift should not accept that token without validation; it must validate scopes, exchange the token for a service-scoped session, and resolve the user and group memberships. If the cluster uses enhanced VPC routing, that validation call must also follow the private design.&lt;/p&gt;

&lt;p&gt;The older pattern created an inconsistency: the organization invested in private subnets, an S3 endpoint, bucket policies, KMS, VPC Flow Logs, and then accepted an identity egress exception because authentication had to reach regional services outside the governed path. In banking, insurance, and payments environments, that exception becomes an audit question: what flow left, through which domain, with which justification, and how do I prove it was only used for authentication? The new support provides a cleaner answer: Redshift talks to &lt;code&gt;sso-oauth&lt;/code&gt; and &lt;code&gt;identitystore&lt;/code&gt; through interface endpoints, with Private DNS, security groups, and network logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private authentication flow with Redshift EVR
&lt;/h2&gt;

&lt;p&gt;The diagram shows the core idea: the client still obtains corporate identity, but the calls made by Redshift to validate and resolve identity traverse private endpoints inside the VPC.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧑‍💻 Client access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Query Editor v2 / JDBC presents Identity Center token (frontend)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 AWS VPC — analytics subnet
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Redshift EVR enabled, not public (data)&lt;/li&gt;
&lt;li&gt;Interface endpoint sso-oauth, Private DNS (network)&lt;/li&gt;
&lt;li&gt;Interface endpoint identitystore, TCP 443 (network)&lt;/li&gt;
&lt;li&gt;S3 gateway endpoint COPY / UNLOAD path (storage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔐 Regional identity plane
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;IAM Identity Center OIDC + assignments (security)&lt;/li&gt;
&lt;li&gt;Identity store groups and users (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Evidence layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;VPC Flow Logs endpoint traffic evidence (network)&lt;/li&gt;
&lt;li&gt;CloudTrail identity/API evidence (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;analyst -&amp;gt; query: signs in with corporate credentials&lt;/li&gt;
&lt;li&gt;query -&amp;gt; redshift: opens connection with token&lt;/li&gt;
&lt;li&gt;redshift -&amp;gt; ssoep: validates and exchanges token&lt;/li&gt;
&lt;li&gt;ssoep -&amp;gt; idc: PrivateLink&lt;/li&gt;
&lt;li&gt;redshift -&amp;gt; idstoreep: resolves user and groups&lt;/li&gt;
&lt;li&gt;idstoreep -&amp;gt; groups: PrivateLink&lt;/li&gt;
&lt;li&gt;redshift -&amp;gt; s3ep: data through EVR&lt;/li&gt;
&lt;li&gt;ssoep -&amp;gt; flowlogs: flow metadata&lt;/li&gt;
&lt;li&gt;idc -&amp;gt; cloudtrail: authentication events&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Anatomy of the pattern
&lt;/h2&gt;

&lt;p&gt;The practical anatomy has five pieces. First, the provisioned cluster or serverless workgroup must have enhanced VPC routing enabled and must not be publicly accessible. For provisioned clusters, the documentation confirms an important operational detail: changing EVR restarts the cluster, so I would treat it as a maintenance-window change, with communication to BI and ingestion teams.&lt;/p&gt;

&lt;p&gt;Second, the VPC must have &lt;code&gt;DNS hostnames&lt;/code&gt; and &lt;code&gt;DNS resolution&lt;/code&gt; enabled, because the endpoints depend on Private DNS. Without that, the standard service name keeps resolving to public addresses and the observed behavior looks like an IAM problem when it is actually DNS. Third, I create two interface endpoints in the same availability design as Redshift: &lt;code&gt;com.amazonaws.&amp;lt;region&amp;gt;.sso-oauth&lt;/code&gt; and &lt;code&gt;com.amazonaws.&amp;lt;region&amp;gt;.identitystore&lt;/code&gt;. Both are required; if either is missing or unreachable, IAM Identity Center sign-in fails.&lt;/p&gt;

&lt;p&gt;Fourth, the endpoint security group must allow TCP 443 from the subnets or security groups used by Redshift. Fifth, I would not start with an action-restrictive endpoint policy. The documentation itself recommends keeping the default policy or, if corporate policy requires restriction, scoping by principal and validating sign-in. In identity, an elegant policy that blocks token exchange is just a well-written outage.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use it: residency, audit, and closed lakehouse design
&lt;/h2&gt;

&lt;p&gt;I would use this pattern when the architecture already has a clear isolation thesis: Redshift in private subnets, S3 accessed through a gateway endpoint, Glue and Lake Formation through interface endpoints when Spectrum or a lakehouse is involved, and internet egress denied by default. This is the common design in financial environments that treat analytics as a production plane, not as a lab. IAM Identity Center authentication improves governance because it centralizes assignments, groups, and sessions; EVR with PrivateLink improves the network posture because it removes the need for NAT or public allow-listing for authentication.&lt;/p&gt;

&lt;p&gt;It also makes sense in organizations that need to run Redshift in a different Region from the IAM Identity Center primary Region. IAM Identity Center multi-Region documentation allows replication of identities, permission sets, assignments, sessions, and metadata to additional Regions, with relevant prerequisites: an organization instance, compatible identity source, customer-managed multi-Region KMS key, and support from the applications involved. I would not treat this as a performance button only. It is a resiliency and residency decision: where the data lives, where users are, which Region carries identity authority, and what behavior is acceptable if the primary identity Region is degraded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural reading of before and after
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Without this pattern&lt;/th&gt;
&lt;th&gt;With Redshift EVR + private IAM Identity Center&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Network boundary&lt;/td&gt;
&lt;td&gt;Data may be private, but authentication requires egress or firewall exceptions.&lt;/td&gt;
&lt;td&gt;Data and identity validation follow private endpoints governed by the VPC.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational evidence&lt;/td&gt;
&lt;td&gt;Audit depends on proxy, NAT, or external inspection logs, often incomplete.&lt;/td&gt;
&lt;td&gt;VPC Flow Logs, CloudTrail, and Redshift logs can be correlated by time window and user.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure mode&lt;/td&gt;
&lt;td&gt;Failures appear as generic timeouts or SSO errors that are hard to separate from IAM.&lt;/td&gt;
&lt;td&gt;Failures tend to concentrate around private DNS, missing endpoint, SG 443, or wrong Region.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real failures I would test before calling it done
&lt;/h2&gt;

&lt;p&gt;The first test is to deliberately break the &lt;code&gt;identitystore&lt;/code&gt; endpoint in a non-production environment. If the user can still authenticate, something is wrong: maybe EVR is not active, maybe private resolution is not being used, or maybe there is an undocumented public route. The second test is to remove Private DNS and verify whether the runbook captures the error. Many teams only notice this detail when a DNS incident turns sign-in into an intermittent failure.&lt;/p&gt;

&lt;p&gt;I would also validate Region placement. The documentation says to create the endpoints in the IAM Identity Center Region; when Redshift and Identity Center are in different Regions, the design must use the cross-Region endpoint option or multi-Region replication. This is easy to miss in organizations that standardized identity in &lt;code&gt;us-east-1&lt;/code&gt; but created regional data warehouses for residency. Next, I would review adjacent paths: S3 gateway endpoint for COPY/UNLOAD, Glue and Lake Formation if a data lake is involved, KMS for encryption, and policies that do not break federated access.&lt;/p&gt;

&lt;p&gt;Finally, I would alarm on symptoms, not only components. Failed connections, p95 session establishment time, CloudTrail denied authentication events, and VPC Flow Logs with no traffic to the expected endpoints are better signals than an endpoint merely being &lt;code&gt;available&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Well-Architected applied to the pattern
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: The primary gain is reducing egress exceptions and aligning authentication, authorization, and data with the same perimeter. I would combine SSO with Redshift RBAC, IAM Identity Center groups, customer-managed KMS when required, CloudTrail, and endpoint policies only after functional testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: The new dependency is not Identity Center itself, but private connectivity to it. Treat DNS, endpoint AZs, security groups, and Region as availability components. For multi-Region, validate IAM Identity Center prerequisites and document failover behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reference design for a financial-grade environment
&lt;/h2&gt;

&lt;p&gt;My reference design starts with a Redshift Serverless workgroup or RA3 cluster in private subnets across at least two AZs, with no public access and enhanced VPC routing enabled. I would use IAM Identity Center groups as the human authorization boundary, mapped to Redshift roles by business function: regulatory read, data engineering, risk, fraud, audit. Permission to obtain a token should be explicit: &lt;code&gt;redshift:GetIdentityCenterAuthToken&lt;/code&gt; for a provisioned cluster or &lt;code&gt;redshift-serverless:GetIdentityCenterAuthToken&lt;/code&gt; for a serverless workgroup, limited to the expected ARNs.&lt;/p&gt;

&lt;p&gt;On the network side, I would create &lt;code&gt;sso-oauth&lt;/code&gt; and &lt;code&gt;identitystore&lt;/code&gt; endpoints with Private DNS, a dedicated security group accepting 443 only from Redshift subnets or SGs, and adjacent endpoints for S3, Glue, and Lake Formation where applicable. For S3, I would still keep bucket policies conditioned on expected origin, KMS encryption, and prefixes separated by data domain. For observability, I would correlate four sources: VPC Flow Logs for endpoint ENIs, CloudTrail for identity and administration calls, Redshift logs/audit for sessions and queries, and client-side connection metrics.&lt;/p&gt;

&lt;p&gt;The goal is not to build ornamental fortress architecture. It is to make the architecture explainable: who entered, through which identity, which group authorized it, through which network path the token was validated, which data was queried, and what evidence remains afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-patterns this launch does not fix by itself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enabling EVR in production without a change window for a provisioned cluster, ignoring that the change restarts the cluster.&lt;/li&gt;
&lt;li&gt;Creating only one of the two required endpoints and investigating the error as if it were a password, group, or driver issue.&lt;/li&gt;
&lt;li&gt;Disabling public access while keeping broad NAT as a silent path to AWS services and SaaS without purpose-level evidence.&lt;/li&gt;
&lt;li&gt;Copying restrictive endpoint policies from another service and blocking internal validation or identity resolution calls.&lt;/li&gt;
&lt;li&gt;Using SSO as a substitute for authorization modeling in Redshift; centralized identity does not remove RBAC, masking, secure views, and grant reviews.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Minimum acceptance test:&lt;/strong&gt; I would only call the change ready after proving three things: SSO sign-in works without a public route, a controlled break of each endpoint fails predictably, and a COPY/UNLOAD query still uses the expected private path. This test belongs in the runbook, not only in the memory of whoever deployed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My curator note:&lt;/strong&gt; I would implement this pattern first in warehouses that carry regulated data or executive reporting, not across every environment by impulse. The lesson I learned in financial platforms is that network exceptions age poorly: they start as pragmatism and end as audit debt. When identity, data, and operational evidence follow the same private design, the conversation with security moves from opinion to proof.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Verified references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/amazon-redshift-supports-idc-evr/" rel="noopener noreferrer"&gt;AWS What's New: Amazon Redshift now supports AWS IAM Identity Center authentication with enhanced VPC routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect-evr.html" rel="noopener noreferrer"&gt;Amazon Redshift documentation: Using AWS IAM Identity Center authentication with enhanced VPC routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/big-data/integrate-amazon-redshift-and-iam-identity-center-with-enhanced-vpc-routing/" rel="noopener noreferrer"&gt;AWS Big Data Blog: Integrate Amazon Redshift and IAM Identity Center with enhanced VPC routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html" rel="noopener noreferrer"&gt;Amazon Redshift documentation: Controlling network traffic with enhanced VPC routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/mgmt/identity-center-authentication.html" rel="noopener noreferrer"&gt;Amazon Redshift documentation: Connect with Identity-enhanced IAM role sessions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/singlesignon/latest/userguide/multi-region-iam-identity-center.html" rel="noopener noreferrer"&gt;AWS IAM Identity Center documentation: Using IAM Identity Center across multiple AWS Regions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html" rel="noopener noreferrer"&gt;Amazon VPC documentation: Access AWS services through AWS PrivateLink&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is to adopt Redshift with IAM Identity Center over EVR whenever the warehouse operates under residency, network isolation, or strong audit-trail requirements. The pattern does not replace authorization modeling, data governance, or observability, but it removes an important inconsistency: authentication stops being an exception and becomes part of the private perimeter. For less regulated environments, I would weigh endpoint operational cost and team maturity before standardizing; for sensitive financial data, I would treat this design as a baseline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; recommended-for-regulated-analytics&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/redshift-sso-privado-com-evr-padrao-de-teardown-amazon-redsh" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>redshift</category>
      <category>iamidentitycenter</category>
      <category>privatelink</category>
    </item>
    <item>
      <title>Migrating Time Series to Timestream for InfluxDB</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:55:30 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/migrating-time-series-to-timestream-for-influxdb-4gin</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/migrating-time-series-to-timestream-for-influxdb-4gin</guid>
      <description>&lt;p&gt;When AWS announces that Amazon Timestream for InfluxDB has reached eight more Regions, including Cape Town, Bangkok, Hong Kong, Hyderabad, Melbourne, Seoul, Zurich, and Tel Aviv, I do not read it only as wider coverage. For a financial, industrial, or telecom operation already running InfluxDB for metrics, device events, capacity, trading telemetry, or SRE, the question becomes different: can I now remove a critical self-managed server stack without losing operational compatibility, data residency, and cost predictability? The answer is yes, but only if the migration is designed as a platform change with cutover criteria, cardinality protection, replication observability, and token governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The starting point: InfluxDB that became critical infrastructure
&lt;/h2&gt;

&lt;p&gt;In many environments, InfluxDB started small: a few Telegraf agents, infrastructure dashboards, and near real-time alerts. Then came tags by customer, Region, device, application version, trading desk, and digital channel. What was a metrics database became a dependency for incident response, capacity planning, operational fraud analysis, and event reconciliation. At that stage, the problem is rarely the InfluxDB API; the problem is the operation around it.&lt;/p&gt;

&lt;p&gt;I look for three symptoms before recommending a migration. The first is the team treating upgrades, backups, disk, compaction, and tuning as recurring SRE work rather than exceptions. The second is hidden cost: large nodes reserved for ingestion peaks, overprovisioned storage, snapshots without a clear policy, and dashboards competing with writes. The third is regional governance. If telemetry from a subsidiary must remain in a specific geography, operating a centralized cluster elsewhere is no longer just a technical decision; it becomes a risk decision.&lt;/p&gt;

&lt;p&gt;The regional expansion reduces that friction. It allows local time-series cells with familiar APIs inside the AWS control plane, without forcing an immediate rewrite of producers and consumers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture decision is not InfluxDB versus Timestream; it is control versus managed operation
&lt;/h2&gt;

&lt;p&gt;I would split the analysis into two tracks. The first is functional compatibility: line protocol, existing clients, queries, buckets, organizations, dashboards, and collection integrations. Timestream for InfluxDB documentation preserves access through InfluxDB ecosystem APIs and tools, but that does not remove behavior testing. Flux functions, retention, tokens, time precision, and cardinality must go through a query regression suite, especially when executive dashboards and NOC alerts use different windows.&lt;/p&gt;

&lt;p&gt;The second track is the operating model. In self-managed InfluxDB, I control the host, operating system, filesystem, process, and maintenance scheduling. In Timestream for InfluxDB, I give up that direct control and receive managed provisioning, backups, patching, and integration with AWS metrics. That trade is healthy when the organization measures availability through service experience, not through the freedom to tune sysctl in production.&lt;/p&gt;

&lt;p&gt;The choice becomes stronger for workloads where the value is in the data and queries, not in cluster administration. For financial teams, this often appears in digital-channel telemetry stores, low-latency monitoring, batch and streaming observability, and operational risk metrics. I would keep self-managed only when an extension, plugin, host access, or engine-level control is indispensable and proven.&lt;/p&gt;

&lt;h2&gt;
  
  
  The migration journey I would use
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;1. Inventory series, not servers&lt;/strong&gt; — I would start by measuring real cardinality, write rate in lines per second, average batch size, queries per second, p95/p99 query latency, retention windows, and high-variability tags. AWS sizing guidance uses examples such as 5,000 lines per request and classes from db.influx.medium to db.influx.24xlarge; those numbers only help if the team knows its own profile.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2. Create a minimal regional cell&lt;/strong&gt; — The first instance should be created in private subnets, with security groups allowing only producers, consumers, and automation. I would create secrets in AWS Secrets Manager, planned rotation for long-lived tokens, account-managed KMS controls, and cost tags by domain, environment, and technical owner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;3. Run dual-write with operational idempotency&lt;/strong&gt; — During the transition, producers write to the current cluster and to Timestream for InfluxDB. I would add a telemetry envelope with source, schemaVersion, producerId, and eventTime, and measure divergence by window. For metric series, deduplication is usually defined by measurement, tag set, and timestamp; that decision must be documented before cutover.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;4. Separate operational reads from analytical reads&lt;/strong&gt; — Incident dashboards, alerts, and internal APIs should not compete with notebooks and broad reports. When the workload is read-heavy, I would evaluate read replicas or, with InfluxDB 3 Enterprise, a multi-node cluster with separate read and write endpoints. The goal is to protect the writer, not only to add CPU.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;5. Cut over by domain, with measurable rollback&lt;/strong&gt; — I would avoid a global big bang. Cutover should happen by data domain or Region: reads first, then primary writes. Rollback must have objective triggers, such as ingestion error rate above 0.1%, query p99 above the SLO for 15 minutes, replica lag above the agreed limit, or count divergence by window.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The target design: regional cell, Multi-AZ, and a clear scaling path
&lt;/h2&gt;

&lt;p&gt;My target design for a regulated institution is a regional cell per critical domain, not a shared global cluster. Each cell receives local telemetry through the VPC, keeps tokens and secrets inside the same account perimeter, publishes operational metrics to CloudWatch, and exports aggregates or cold data to the analytics platform when needed. This reduces latency, simplifies data residency, and limits blast radius.&lt;/p&gt;

&lt;p&gt;For production environments, I would start by evaluating Multi-AZ or a read replica cluster, depending on the read pattern. The documentation confirms that a read replica cluster uses asynchronous replication, with writer and reader in different Availability Zones within the same Region. This improves read capacity and availability, but it introduces an explicit decision: in an unrecoverable writer failure, data not yet replicated can be lost. In financial systems, I would not accept that semantic without classifying the data. Infrastructure metrics may tolerate minimal tip loss; events used for audit, billing, or reconciliation should not depend only on that path.&lt;/p&gt;

&lt;p&gt;If the workload evolves to InfluxDB 3 Enterprise, the scaling path shifts from vertical sizing to node composition. AWS documents clusters up to 15 nodes, with up to 4 writer/reader nodes, up to 13 reader-only nodes, and a dedicated compactor for clusters with 3 or more nodes. I would use that flexibility to isolate heavy reads, but keep the architecture honest: all nodes in a cluster use the same instance class, so horizontal scaling does not replace cardinality modeling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Target architecture for controlled regional migration
&lt;/h2&gt;

&lt;p&gt;The visual shows a regional cell with temporary dual-write, validation before cutover, and separation between operational reads, analytical reads, and governance.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏢 Origem atual / Current source
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Telegraf / apps line protocol (compute)&lt;/li&gt;
&lt;li&gt;Self-managed InfluxDB current production (data)&lt;/li&gt;
&lt;li&gt;Existing dashboards baseline queries (frontend)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 AWS regional cell / Célula regional AWS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Private VPC ingress SG allowlist (network)&lt;/li&gt;
&lt;li&gt;Timestream for InfluxDB Multi-AZ or cluster (data)&lt;/li&gt;
&lt;li&gt;Read endpoint / replica query isolation (data)&lt;/li&gt;
&lt;li&gt;CloudWatch CPU, memory, disk, ReplicaLag (compute)&lt;/li&gt;
&lt;li&gt;Secrets Manager + KMS tokens and rotation (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Consumers / Consumidores
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Alerts and SLOs incident path (compute)&lt;/li&gt;
&lt;li&gt;Analytics export aggregates and cold data (storage)&lt;/li&gt;
&lt;li&gt;Dashboards validated queries (frontend)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;agents -&amp;gt; oldinflux: current write&lt;/li&gt;
&lt;li&gt;agents -&amp;gt; ingest: temporary dual-write&lt;/li&gt;
&lt;li&gt;ingest -&amp;gt; timestream: validated batches&lt;/li&gt;
&lt;li&gt;timestream -&amp;gt; reader: async replication or read endpoint&lt;/li&gt;
&lt;li&gt;timestream -&amp;gt; cw: operational metrics&lt;/li&gt;
&lt;li&gt;secrets -&amp;gt; ingest: tokens and rotation&lt;/li&gt;
&lt;li&gt;reader -&amp;gt; newdash: read-heavy queries&lt;/li&gt;
&lt;li&gt;reader -&amp;gt; alerts: alert windows&lt;/li&gt;
&lt;li&gt;timestream -&amp;gt; analytics: governed aggregates&lt;/li&gt;
&lt;li&gt;dashold -&amp;gt; newdash: query regression&lt;/li&gt;
&lt;li&gt;ops -&amp;gt; cw: cutover go/no-go&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Capacity: the trap is cardinality, not the metric count
&lt;/h2&gt;

&lt;p&gt;For time series, I do not accept sizing based only on average CPU. The real risk is the combination of cardinality, write concurrency, batch size, and queries that scan broad windows. Timestream for InfluxDB documentation lists db.influx classes from 1 vCPU and 8 GiB up to 96 vCPU and 768 GiB, with documented network bandwidth from 10 Gbps on smaller classes to 40 Gbps on db.influx.24xlarge. That gives growth room, but it does not fix a poorly designed tag model.&lt;/p&gt;

&lt;p&gt;My process is to measure active series by bucket and hour, identify tags carrying userId, sessionId, requestId, or near-unique values, and block new high-cardinality tags through a schema contract. For critical producers, I would standardize write batches close to the documented 5,000-line guidance when latency allows, lexicographically sorted tags, and the coarsest time precision the use case accepts. Writing in nanoseconds when the sensor produces data every 10 seconds only adds noise.&lt;/p&gt;

&lt;p&gt;I also separate ingestion SLO from query SLO. A dashboard scanning weeks with regex may look harmless, but it can compete for cache and CPU with incident ingestion. In production, expensive queries need an owner, a limit, a default window, and, when possible, an isolated read endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before and after metrics I would put in the business case
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;40&lt;/strong&gt; — instances per account and Region. Documented quota for Timestream for InfluxDB; enough for domain cells, but it requires creation governance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15&lt;/strong&gt; — nodes in InfluxDB 3 Enterprise. Documented horizontal scale with up to 4 writer/readers, up to 13 reader-only nodes, and a dedicated compactor in 3+ node clusters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~2x&lt;/strong&gt; — cost difference in the Multi-AZ example. In the public example, db.influx.2xlarge moves from $737.88/month Single-AZ to $1,476.49/month Multi-AZ with 400 GiB.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security: a database token is also a privileged credential
&lt;/h2&gt;

&lt;p&gt;The migration is only complete when the access model changes with it. In self-managed InfluxDB, it is common to find tokens shared by squads, dashboards with broad permissions, and manual rotation postponed because nobody wants to break collection. By moving the workload to AWS, I would use the change as a cleanup milestone: one token per producer or producer class, secret stored in Secrets Manager, rotation tested in non-production, and an audit trail for who changed secrets and security groups.&lt;/p&gt;

&lt;p&gt;At the network perimeter, I would prefer private subnets, explicit security groups, and no public exposure for internal workloads. The documentation states that Timestream for InfluxDB does not allow direct host access; that is good for reducing operational surface, but it requires runbooks to be adapted. The team will not log into the machine to inspect a process; it will depend on metrics, logs, events, AWS APIs, and support.&lt;/p&gt;

&lt;p&gt;In IAM, I would separate provisioning, operational read, and automation roles. Policies should use tag conditions where possible, for example environment and domain, to prevent a development pipeline from modifying the production cell. For regulated institutions, I would also record an ADR: which telemetry data may contain sensitive identifiers, which tags are forbidden, and which retention satisfies security, audit, and privacy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The hidden risk: availability can improve while tip consistency gets worse:&lt;/strong&gt; Read replicas and Multi-AZ clusters help keep reads and operations alive during failures, but asynchronous replication must be treated as a business contract. I would add CloudWatch alarms for ReplicaLag, CPUUtilization, MemoryUtilization, and DiskUtilization, and define in the runbook when to prioritize automatic failover and when to protect data not yet replicated. For events supporting financial audit, I would keep a parallel immutable trail, for example Kinesis or MSK to S3 with Object Lock where applicable, before deriving time series for fast queries.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Well-Architected reading of the migration
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: Reducing host access is positive, but it does not replace token governance. I would require Secrets Manager, KMS, minimum security groups, role-based IAM, and an ADR about sensitive tags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: Multi-AZ, read replicas, and clusters help, provided the system monitors replica lag and has an explicit criterion for tip loss versus write availability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;performance&lt;/strong&gt;: Optimization starts at the producer: proper batching, sorted tags, coherent time precision, limited query windows, and separate endpoints for heavy reads.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I would cut over without romanticizing the migration
&lt;/h2&gt;

&lt;p&gt;The cutover I consider healthy starts with mirrored reads, not with definitive writes. First, I would put non-critical dashboards reading from Timestream for InfluxDB, comparing results with the current cluster across 5-minute, 1-hour, and 24-hour windows. Differences must be classified: expected delay, schema divergence, incompatible query function, different time precision, or real point loss.&lt;/p&gt;

&lt;p&gt;Then I would move low-criticality alerts and keep the most severe incident alerts on the old path until the team has at least one full operational cycle: daily peak, batch window, maintenance, and simulated incident. In financial environments, I like a dual-write period that crosses an accounting close or relevant settlement cycle, because that is when ad hoc queries and unusual loads appear.&lt;/p&gt;

&lt;p&gt;Primary write cutover should have a short schema-change freeze, tested rollback, and a clear decision owner. If query p99 rises, that does not automatically mean rolling back; it may mean moving dashboards to a read-only endpoint, reducing the default window, or correcting cardinality. If there is count divergence in regulated data, I stop. A well-run migration is not one that never finds a problem; it is one that knows which problems are acceptable before starting.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My curator note:&lt;/strong&gt; I would use this regional expansion to move critical InfluxDB workloads away from hand-maintained servers, but I would not sell the change as automatic savings. In the field, the largest gain is usually returning engineering time to product reliability, while the largest mistake is migrating bad cardinality to a better platform and expecting a miracle. I would first build a small regional cell, with dual-write, query regression, and lag alarms, and only then scale the pattern. The hard-won lesson is simple: a managed database removes undifferentiated work, not architectural responsibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Verified references
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/amazon-timestream-influxdb-regions/" rel="noopener noreferrer"&gt;AWS What's New: Amazon Timestream for InfluxDB is now available in 8 additional AWS Regions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/timestream/latest/developerguide/timestream-for-influxdb.html" rel="noopener noreferrer"&gt;Amazon Timestream for InfluxDB documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/general/latest/gr/timestream.html" rel="noopener noreferrer"&gt;Amazon Timestream for InfluxDB endpoints and quotas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/timestream/latest/developerguide/timestream-for-influx-working-read-replica.html" rel="noopener noreferrer"&gt;Working with Multi-AZ read replica clusters for Amazon Timestream for InfluxDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/timestream/latest/developerguide/multi-node-scaling.html" rel="noopener noreferrer"&gt;Scaling a cluster in Amazon Timestream for InfluxDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/timestream/pricing/" rel="noopener noreferrer"&gt;Amazon Timestream pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/database/timestream-for-influxdb-3-workload-analysis-and-best-practices/" rel="noopener noreferrer"&gt;Timestream for InfluxDB 3 workload analysis and best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/timestream-for-influxdb-well-architected-framework/introduction.html" rel="noopener noreferrer"&gt;Applying the AWS Well-Architected Framework for Amazon Timestream for InfluxDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is to migrate operational InfluxDB workloads to Amazon Timestream for InfluxDB when the team needs regional coverage, managed operation, Multi-AZ, read scaling, and integration with AWS controls, but to do it by cell and by domain. I would not migrate regulated single-event data without a parallel immutable trail, and I would not approve production without cardinality measurement, query regression, ReplicaLag alarms, and a rollback plan. For most teams using InfluxDB as the backbone for observability and telemetry, the new regional availability makes modernization more defensible. The success criterion is not shutting down servers; it is reducing operational risk without diluting governance, SLOs, and cost discipline.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/migrar-series-temporais-para-timestream-for-influxdb-amazon-times" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>aws</category>
      <category>timestream</category>
      <category>influxdb</category>
    </item>
    <item>
      <title>Active-active Amazon Connect: the resilience lesson</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:55:29 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/active-active-amazon-connect-the-resilience-lesson-4bg7</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/active-active-amazon-connect-the-resilience-lesson-4bg7</guid>
      <description>&lt;p&gt;When a financial contact center fails, the incident rarely shows up as a clean exception in a log. It shows up as customers stuck in IVR, agents authenticated in the wrong place, queues growing without clear ownership, CRM integrations answering from one region while voice flows expect another. The announcement that Amazon Connect Global Resiliency now supports routing contacts to agents across two active regions targets precisely that problem. To me, the main value is not the existence of a second region. It is making the second region work every day, receive agents, receive contacts, produce metrics, and expose drift before the incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;p&gt;On August 31, 2026, AWS announced that Amazon Connect Global Resiliency now supports cross-region routing of contacts to agents across two linked regions. The published example is straightforward: a contact entering US East (N. Virginia) can be offered to the longest-available matching agent whether that agent is in US East or US West (Oregon). The same idea applies to the documented regional pairs: N. Virginia/Oregon, Frankfurt/London, and Osaka/Tokyo.&lt;/p&gt;

&lt;p&gt;The change matters operationally because it moves the architecture away from a passive design. Previously, many contact-center DR designs relied on a replica, phone numbers associated with a Traffic Distribution Group, and runbooks to move traffic. Those parts still matter, but the new point is that both regions stop being a promise. They exercise configuration, authentication, routing, integrations, metrics, and contact search as part of normal operation.&lt;/p&gt;

&lt;p&gt;I would treat this capability as a maturity step, not as permission to relax engineering discipline. Active-active increases confidence, but it also increases failure surface. Everything that used to remain hidden in the secondary region now appears in production: asymmetric quotas, Lambda functions with different names, flows with fixed ARNs, incomplete IAM permissions, SaaS integrations without regional allowlists, and dashboards that aggregate without explaining origin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Timeline of an incident that now becomes more visible
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;T-30 days: the replica exists but is not exercised&lt;/strong&gt; — The team creates the second instance, replicates the primary configuration, and believes the runbook covers the switch. Quotas, integrations, and authentication paths have not yet seen the same real volume.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;T-5 days: a small change creates drift&lt;/strong&gt; — A flow starts calling a new Lambda function, but the equivalent function does not exist with the same name in the other region. In passive operation, this can remain invisible until a DR test.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;T-0: contact surge forces redistribution&lt;/strong&gt; — Operations tries to move new contacts and agents to absorb load. If both regions already carry traffic, the likely failure becomes controlled degradation. If one region never carried real traffic, the switch becomes a production experiment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;T+15 minutes: the problem is no longer just telephony&lt;/strong&gt; — The queue may be healthy, but CRM, IdP, recording, Lex bot, API Gateway enrichment, or analytical writes may not be. Investigation must inspect contact, agent, active region, integration, and quota in the same view.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Typical root cause:&lt;/strong&gt; The root cause is not 'the region went down.' In many continuity incidents, the root cause is the untested difference between the environment that serves traffic every day and the environment that exists only to save the day. Active-active routing reduces that difference, but only when configuration, quotas, IAM, identity, integrations, alarms, and runbooks are treated as a product, not as a DR artifact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Active-active operating model for Amazon Connect Global Resiliency
&lt;/h2&gt;

&lt;p&gt;The core idea is to separate traffic distribution, agent distribution, and operational isolation. The diagram below shows where I would place the controls that prevent a regional change from becoming an incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  👤 Clientes e agentes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cliente voz/chat (user)&lt;/li&gt;
&lt;li&gt;Agente global sign-in (user)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 Plano global do Connect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Traffic Distribution Group 10% increments (network)&lt;/li&gt;
&lt;li&gt;Cross-region routing longest-available match (compute)&lt;/li&gt;
&lt;li&gt;Isolamento controlado UpdateCrossRegionRouting (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟦 Região A
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Connect A fluxos, filas, CCP (compute)&lt;/li&gt;
&lt;li&gt;Integrações A Lambda/API/CRM (compute)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟩 Região B
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Connect B config equivalente (compute)&lt;/li&gt;
&lt;li&gt;Integrações B mesmos nomes e políticas (compute)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Operação
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Métricas e busca visão consolidada (data)&lt;/li&gt;
&lt;li&gt;Service Quotas por região e instância (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;customer -&amp;gt; tdg: enters through global number&lt;/li&gt;
&lt;li&gt;tdg -&amp;gt; connect-a: traffic share&lt;/li&gt;
&lt;li&gt;tdg -&amp;gt; connect-b: traffic share&lt;/li&gt;
&lt;li&gt;agent -&amp;gt; routing: agent availability&lt;/li&gt;
&lt;li&gt;routing -&amp;gt; connect-a: regional offer&lt;/li&gt;
&lt;li&gt;routing -&amp;gt; connect-b: cross-region offer&lt;/li&gt;
&lt;li&gt;connect-a -&amp;gt; int-a: invokes flows and APIs&lt;/li&gt;
&lt;li&gt;connect-b -&amp;gt; int-b: invokes flows and APIs&lt;/li&gt;
&lt;li&gt;connect-a -&amp;gt; obs: events and contacts&lt;/li&gt;
&lt;li&gt;connect-b -&amp;gt; obs: events and contacts&lt;/li&gt;
&lt;li&gt;quotas -&amp;gt; isolation: operational threshold&lt;/li&gt;
&lt;li&gt;isolation -&amp;gt; routing: disables cross-region routing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Remediation starts before failover
&lt;/h2&gt;

&lt;p&gt;The first change I would make in a critical operation is to turn the secondary region into an ordinary path, even with a small initial share. Global Resiliency allows traffic and agents to be distributed across regions in 10% increments, or moved all at once. I would start with a small and deliberate slice, for example 10% of new contacts in a lower-risk queue and an agent group trained to operate on both sides. The goal on day one is not perfect balancing; it is discovering drift with controlled impact.&lt;/p&gt;

&lt;p&gt;That choice has cost and discipline attached to it. If both regions carry traffic, both need equivalent quotas, useful alarms, configuration pipelines, flow tests, and identity integration. The documentation is explicit about points I would not treat as details: the instance must be in supported regions, access to the feature requires engagement with AWS, and AWS recommends monthly failover testing. There is also a strong practical requirement: for flows that call Lambda, function names should be consistent across regions, and hardcoded ARNs need to be removed wherever the regional parameter is supported.&lt;/p&gt;

&lt;p&gt;In a financial environment, I would also add a post-deploy validation pipeline. After any change to queue, routing profile, security profile, flow, Lex bot, Lambda, or external integration, a canary should execute a minimal journey in both regions: entry, routing, enrichment, recording, after-contact work, and analytical event.&lt;/p&gt;

&lt;h2&gt;
  
  
  The weak point is no longer just voice
&lt;/h2&gt;

&lt;p&gt;The biggest trap in this architecture is assuming contact-center resilience ends when the contact finds an agent. In practice, service depends on a chain that includes SAML, CCP/Agent Workspace, CRM, internal APIs, profile stores, recording, transcription, classification, fraud controls, audit, and sometimes a conversational journey with Lex or AI agents. Amazon Connect may route the contact correctly, but the experience fails if the agent receives an empty screen or if an eligibility lookup gets stuck behind a regional API.&lt;/p&gt;

&lt;p&gt;That is why I would design integrations with explicit regional contracts. A Lambda called by a flow should have the same name in both regions when required by the Global Resiliency pattern. IAM permissions should constrain by &lt;code&gt;aws:RequestedRegion&lt;/code&gt;, &lt;code&gt;connect:InstanceId&lt;/code&gt; where applicable, and environment-scoped resources rather than improvised names. For internal APIs behind API Gateway, I would use idempotency keys based on &lt;code&gt;contactId&lt;/code&gt;, &lt;code&gt;initialContactId&lt;/code&gt;, and logical step, stored in DynamoDB with TTL to avoid duplicate charges during retries or re-offers.&lt;/p&gt;

&lt;p&gt;I would also separate operational state from analytical state. What is required to serve the customer must be available on the hot path with predictable latency. What is required for audit can move through EventBridge, Kinesis, or Firehose into S3 with replication and later reconciliation. Mixing both paths increases coupling exactly during failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability for the moment when everything looks green
&lt;/h2&gt;

&lt;p&gt;The unified analytics and contact-search visibility across regions is relevant, but I would not let operations depend only on aggregated dashboards. Aggregated dashboards are useful for management; incident investigation needs slicing by origin, active region, queue, routing profile, flow, integration, and quota. The Global Resiliency model itself exposes metadata such as origin region, active region, and Traffic Distribution Group in contact structures, and I would use that as a telemetry dimension from the start.&lt;/p&gt;

&lt;p&gt;My minimum signals would be: rate of contacts routed across regions, queue time by active region, error rate by flow block, p95/p99 latency of Lambdas invoked by flows, SAML authentication failures, contacts in after-contact work during a regional change, Amazon Connect API throttling, quota utilization by instance, and applied-capacity differences between regions. In CloudWatch, quota alarms should not wait for 100%; I usually start at 70% for trend and 80% for action, adjusted by criticality and seasonality.&lt;/p&gt;

&lt;p&gt;I also like creating explicit operational events for distribution changes: who changed it, from what to what, ticket, reason, window, expected rollback, and observed result after 15 and 60 minutes. That can go to EventBridge and to an immutable S3 bucket with Object Lock when the organization needs a stronger audit trail. In serious incidents, the question is not only 'is it back?'. It is 'do we know exactly what was shifted, by whom, and with what effect?'.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capacity: the bill that appears later
&lt;/h2&gt;

&lt;p&gt;In a contact center, capacity is not only concurrent calls. It is limits for users, queues, profiles, flows, numbers, APIs per second, integrations, recording, storage, and third parties. A poorly calibrated active-active design can fail in a counterintuitive way: region B receives only 10% of traffic for months, but one morning it must absorb 100%. If B's quotas were not raised at the same pace as A's, failover works in the routing plane and fails in the capacity plane.&lt;/p&gt;

&lt;p&gt;The Global Resiliency requirements documentation advises requesting that all quotas in the replica match the source. A recent AWS article on quotas reinforces a point I consider critical: Service Quotas requests are regional, and after initial replication, increases must be kept in sync by region. This is a good example of invisible operational debt. The team increases capacity on the side under daily pressure and forgets the other side because it looks quiet.&lt;/p&gt;

&lt;p&gt;I would solve this with declarative automation: daily inventory of applied quotas by instance and region, automatic diff, alert when the difference becomes non-zero for critical resources, and change blocking when a planned distribution exceeds estimated capacity. The practical rule is simple: if region B must receive 100% tomorrow, it must be measured as capable of receiving 100% today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Well-Architected reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;: Global sign-in and regional integrations need least-privilege IAM, well-governed SAML, consistent KMS for recordings and analytical data, and an auditable trail for distribution or isolation changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reliability&lt;/strong&gt;: The real gain comes from continuously exercising both regions, validating failover monthly, removing hardcoded configuration, and keeping quotas symmetric. I would define RTO/RPO per service journey, not only per Connect instance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Anti-patterns I would remove from the design
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Regional replica created once and never validated again with real traffic.&lt;/li&gt;
&lt;li&gt;Flows with fixed ARNs for Lambda, Lex, or regional resources without a substitution strategy.&lt;/li&gt;
&lt;li&gt;Quotas increased only in the primary region because that is where pain appears first.&lt;/li&gt;
&lt;li&gt;Global dashboards without drill-down by active region, origin region, and Traffic Distribution Group.&lt;/li&gt;
&lt;li&gt;Failover runbook that depends on a single administrator, single console session, or single regional endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My curator note:&lt;/strong&gt; I would not move a regulated contact center to active-active in the first weekend. I would start with controlled queues, measure errors by region, and increase distribution only after quotas, identity, flows, and integrations survived repeated tests. The lesson I learned in critical environments is that DR does not fail in the diagram; it fails in the detail nobody exercised under load. This launch is valuable precisely because it forces that detail to appear earlier.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/amazon-connect-global-resiliency-cross-region-routing/" rel="noopener noreferrer"&gt;AWS What's New: Amazon Connect Global Resiliency cross-region routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/connect/latest/adminguide/setup-connect-global-resiliency.html" rel="noopener noreferrer"&gt;Amazon Connect Administrator Guide: Set up Connect Customer Global Resiliency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/us_en/connect/latest/adminguide/get-started-connect-global-resiliency.html" rel="noopener noreferrer"&gt;Amazon Connect Administrator Guide: Get started with Global Resiliency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/connect/latest/adminguide/connect-global-resiliency-requirements.html" rel="noopener noreferrer"&gt;Amazon Connect Administrator Guide: Global Resiliency requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/contact-center/scale-your-contact-center-effectively-with-amazon-connect-and-service-quotas/" rel="noopener noreferrer"&gt;AWS Contact Center Blog: Scale your contact center with Service Quotas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/contact-center/amazon-connect-service-quota-monitor/" rel="noopener noreferrer"&gt;AWS Contact Center Blog: Amazon Connect Service Quota Monitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/amazon-connect/amazon-connect-streams/blob/master/Documentation-GR.md" rel="noopener noreferrer"&gt;Amazon Connect Streams: Global Resiliency documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is to treat Amazon Connect Global Resiliency cross-region routing as an operating program, not as a DR switch. Use real traffic in both regions, start small, keep quotas and integrations in parity, record every distribution change, and test isolation before you need it. For financial organizations, that is the difference between a failover that looks good in a presentation and an operation that keeps serving customers when infrastructure stops cooperating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; recommended-with-operational-discipline&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/amazon-connect-ativo-ativo-a-licao-de-resiliencia-amazon-conne" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>amazonconnect</category>
      <category>resilience</category>
      <category>dr</category>
    </item>
    <item>
      <title>Redshift and Iceberg v3: field notes for mutable lakes</title>
      <dc:creator>Fernando Azevedo</dc:creator>
      <pubDate>Tue, 01 Sep 2026 20:54:57 +0000</pubDate>
      <link>https://dev.to/fernando_azevedo_6844e930/redshift-and-iceberg-v3-field-notes-for-mutable-lakes-d5l</link>
      <guid>https://dev.to/fernando_azevedo_6844e930/redshift-and-iceberg-v3-field-notes-for-mutable-lakes-d5l</guid>
      <description>&lt;p&gt;When I look at Amazon Redshift support for Apache Iceberg v3 tables, the interesting part is not simply "it now reads and writes v3". The architectural point is that three old pains in analytical lakes start becoming table contracts: schema evolution with explicit defaults, stable row identity for incremental pipelines, and compact deletes for workloads with frequent update/delete operations. In financial-grade environments, that directly touches reconciliation, erasure workflows, audit trails, scan cost, and coupling between engines.&lt;/p&gt;

&lt;h2&gt;
  
  
  The situation: the lake is no longer only append-only
&lt;/h2&gt;

&lt;p&gt;For years, a relevant share of enterprise data lakes worked well because the implicit contract was simple: immutable Parquet files, predictable partitions, compaction jobs, and mostly append-only consumption. That model still holds for raw events, logs, and regulatory snapshots. It starts to creak when the platform becomes a shared data product across risk, fraud, customer operations, Open Finance, BI, credit models, and audit.&lt;/p&gt;

&lt;p&gt;In those scenarios, the operational question is not "can I query S3 with SQL?". The question is whether I can modify a row without destroying performance, add a column without reprocessing terabytes, propagate only changes to downstream consumers, and prove what changed between snapshots. The Redshift announcement on August 31, 2026 matters because it brings Iceberg v3 features into a SQL engine many organizations already use as a consumption, transformation, and governance layer.&lt;/p&gt;

&lt;p&gt;I would not read this as permission to turn every lake table into an OLTP database. Iceberg is still an analytical table format. The gain is reducing patches: CDC mirror tables, inconsistent technical columns, accumulated delete files, and pipelines that scan everything because there is no trustworthy change marker.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Redshift can now create or upgrade Iceberg v3 tables with the 'format-version' = '3' property, while keeping SQL DML syntax similar to v2.&lt;/li&gt;
&lt;li&gt;Default column values reduce reprocessing during schema evolution, but require governance over the historical meaning of the default.&lt;/li&gt;
&lt;li&gt;Row lineage exposes _row_id and _last_updated_sequence_number for incrementality, audit, and reconciliation, as long as consumers understand the contract.&lt;/li&gt;
&lt;li&gt;Deletion vectors replace new positional delete files in v3 and help workloads with many deletes, updates, and MERGEs, especially when table maintenance is disciplined.&lt;/li&gt;
&lt;li&gt;Compatibility is not universal: complex types and some Iceberg v3 types are not currently supported by Redshift, and downgrade from v3 to v2 is not supported.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Default values: schema evolution without rewriting the past
&lt;/h2&gt;

&lt;p&gt;The most pragmatic use of default values appears when a large table needs a new operational column: &lt;code&gt;source_system&lt;/code&gt;, &lt;code&gt;risk_bucket&lt;/code&gt;, &lt;code&gt;consent_status&lt;/code&gt;, &lt;code&gt;schema_version&lt;/code&gt;, &lt;code&gt;retention_class&lt;/code&gt;, or something similar. In Iceberg v2, many teams solved this with expensive backfills, views with &lt;code&gt;coalesce&lt;/code&gt;, or different rules per consumer. In Iceberg v3 on Redshift, a column added with a default can return the initial value for older files without rewriting data, and new INSERTs can write the default when the column is omitted.&lt;/p&gt;

&lt;p&gt;The trap is semantic. A default does not mean the historical data truly had that attribute at the original event time. In regulated environments, I separate technical defaults from business assertions. &lt;code&gt;schema_version DEFAULT 3&lt;/code&gt; is relatively safe. &lt;code&gt;customer_consent DEFAULT true&lt;/code&gt; is dangerous if there is no historical basis for it. It is also worth noting that defaults are literals, not dynamic expressions; I would not rely on them for processing timestamps or contextual rules.&lt;/p&gt;

&lt;p&gt;In practice, I would record each change in a short ADR, with effective date, reason, domain owner, and consumer impact. If the default changes metric interpretation, the publication needs a contract version and a coexistence window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Row lineage: analytical CDC with less guessing
&lt;/h2&gt;

&lt;p&gt;The feature I would watch most closely is row lineage. Redshift exposes &lt;code&gt;_row_id&lt;/code&gt; and &lt;code&gt;_last_updated_sequence_number&lt;/code&gt; pseudo-columns, which must be selected explicitly and are not included in &lt;code&gt;SELECT *&lt;/code&gt;. That is a good decision: it avoids accidental leakage into dashboards, but lets technical pipelines create sequence-based checkpoints. For an incremental pipeline, the basic contract becomes simple: persist the last processed sequence number, read rows with a sequence greater than or equal to the planned watermark, write downstream results idempotently, and advance the checkpoint only after the downstream commit.&lt;/p&gt;

&lt;p&gt;I would still not replace every CDC mechanism with this. In integrations with transactional systems, I still want source logs, partition ordering, and business events. Row lineage is strongest inside the lakehouse: deriving silver/gold tables, recalculating affected aggregates, feeding feature stores, rebuilding search indexes, and assembling analytical audit trails.&lt;/p&gt;

&lt;p&gt;One operational detail matters in a v2-to-v3 upgrade: pre-upgrade data does not immediately get useful lineage; Redshift documentation says the values return null until the first write after the upgrade, when values are generated for the table. So the migration needs an explicit cutover line. I would treat that line as a platform event, not an invisible detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Iceberg v3 table pattern for controlled mutations
&lt;/h2&gt;

&lt;p&gt;The design shows how I would isolate ingestion, table contract, incremental queries, and governance when adopting Iceberg v3 with Redshift.&lt;/p&gt;

&lt;h3&gt;
  
  
  🟦 Domínios produtores
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Eventos de negócio Kafka/MSK ou batch (messaging)&lt;/li&gt;
&lt;li&gt;Glue/EMR jobs validação e merge (compute)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟧 Contrato lakehouse
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS Glue Data Catalog metadados Iceberg (data)&lt;/li&gt;
&lt;li&gt;Tabela Iceberg v3 format-version=3 (storage)&lt;/li&gt;
&lt;li&gt;Deletion vectors Puffin + bitmap (storage)&lt;/li&gt;
&lt;li&gt;Row lineage _row_id + sequence (data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟥 Governança
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lake Formation FGAC e grants (security)&lt;/li&gt;
&lt;li&gt;KMS + S3 policies criptografia e perímetro (security)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟩 Consumo e operação
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Redshift Graviton provisioned/serverless (compute)&lt;/li&gt;
&lt;li&gt;Checkpoint incremental última sequência processada (data)&lt;/li&gt;
&lt;li&gt;CloudWatch/SLOs scan, latency, failures (compute)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Flows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;events -&amp;gt; etl: normalizes and validates&lt;/li&gt;
&lt;li&gt;etl -&amp;gt; table: INSERT/UPDATE/MERGE&lt;/li&gt;
&lt;li&gt;catalog -&amp;gt; table: schema and snapshots&lt;/li&gt;
&lt;li&gt;table -&amp;gt; dv: marks removed rows&lt;/li&gt;
&lt;li&gt;table -&amp;gt; lineage: identifies changes&lt;/li&gt;
&lt;li&gt;lf -&amp;gt; catalog: authorizes tables/columns/rows&lt;/li&gt;
&lt;li&gt;kms -&amp;gt; table: protects S3 objects&lt;/li&gt;
&lt;li&gt;redshift -&amp;gt; catalog: discovers table&lt;/li&gt;
&lt;li&gt;redshift -&amp;gt; lineage: queries by sequence&lt;/li&gt;
&lt;li&gt;redshift -&amp;gt; checkpoint: advances after commit&lt;/li&gt;
&lt;li&gt;redshift -&amp;gt; obs: emits operational signals&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deletion vectors: fewer delete files, not zero maintenance
&lt;/h2&gt;

&lt;p&gt;Deletion vectors address a familiar problem: updates and deletes on immutable files tend to generate auxiliary structures that hurt reads, planning, and compaction. In Iceberg v3, Redshift records removed positions in compact bitmaps stored in Puffin files, with at most one deletion vector per data file in a snapshot. That reduces positional delete file proliferation and makes regulatory deletes, customer-data corrections, and CDC MERGE workloads less costly to read and write.&lt;/p&gt;

&lt;p&gt;But I would not sell this internally as free maintenance. If a table receives random deletes all day, the data files still physically contain invalidated records. Reads are better than with many small delete files, but there is still additional work. For high-churn tables, I would keep explicit policies for compaction, file rewrite, and snapshot expiration, using low-demand windows for maintenance.&lt;/p&gt;

&lt;p&gt;A practical number I often use as an initial trigger is not absolute: when the share of logically deleted rows in hot partitions crosses 5% to 10%, or when P95 latency on queries over those partitions grows consistently, I review compaction. I am not presenting this as an AWS limit; it is an operational heuristic to start measuring before users feel it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture point: interoperability with clear boundaries
&lt;/h2&gt;

&lt;p&gt;The value of Iceberg is allowing multiple engines to share a table without turning the lake into accidental coupling. Redshift, Athena, EMR, Glue, and other tools can participate, but I would only allow multiple writers where ownership is explicit. For critical tables, I choose one primary writer per domain and treat the others as readers or transformers with very specific permissions.&lt;/p&gt;

&lt;p&gt;In Redshift, some details shape the design. The documentation states support for Lake Formation fine-grained access control on Iceberg tables, the use of Glue-generated column statistics for better performance, and different cost behavior depending on compute type: RG and Serverless use their own compute for S3 lake queries, while DC2 or RA3 use Redshift Spectrum. The pricing page confirms that Spectrum charges by bytes scanned, rounded to the next megabyte with a 10 MB minimum per query; in Serverless, external queries are part of the workgroup's RPU-hour consumption.&lt;/p&gt;

&lt;p&gt;I would configure this as a platform product: S3 bucket with SSE-KMS, policies conditioned on &lt;code&gt;aws:PrincipalArn&lt;/code&gt; and &lt;code&gt;aws:SecureTransport&lt;/code&gt;, Lake Formation as the authorization plane, static roles for writes, sensitivity tags, and workload-specific budgets. The common mistake is treating an open format as absence of governance. It is the opposite: the more open the format, the clearer the contract must be.&lt;/p&gt;

&lt;h2&gt;
  
  
  The adoption playbook I would use
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose a table with real mutation, not the most critical one&lt;/strong&gt; — Look for a table with frequent MERGE or DELETE activity, known consumers, and an operational rollback path. Avoid starting with accounting ledgers, intraday risk, or tables with multiple writers and no clear owner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit engines and types before the upgrade&lt;/strong&gt; — Confirm that all relevant readers and writers understand Iceberg v3. In Redshift, do not plan v3 for tables that depend on struct, list, map, variant, geometry, geography, binary, uuid, time, or nanosecond timestamps, because the documentation lists those limitations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define the incrementality contract&lt;/strong&gt; — Standardize checkpointing by &lt;code&gt;_last_updated_sequence_number&lt;/code&gt;, a reread window to tolerate retries, an idempotency key in the target, and a metric comparing rows read with rows actually applied.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run the upgrade as a platform change&lt;/strong&gt; — The format ALTER is metadata-only, but the consequence is not trivial: there is no downgrade to v2, pre-upgrade data has specific lineage behavior, and old positional deletes remain valid until later writes merge them into deletion vectors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Measure before and after with the same query set&lt;/strong&gt; — Collect P50/P95/P99, bytes scanned, file count, MERGE duration, Lake Formation permission failures, planning time, and cost by domain. Without a baseline, any improvement becomes a story.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Start with the contract, not with ALTER TABLE:&lt;/strong&gt; Before running &lt;code&gt;ALTER TABLE ... SET TABLE PROPERTIES ('format-version' = '3')&lt;/code&gt;, write down three things: who may write, how incremental consumers advance checkpoints, and which metric triggers compaction. The command is short; the governance around it is what prevents incidents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Anti-patterns I would avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upgrading to v3 because it is new, without inventorying the engines that read the table. In a lakehouse, silent incompatibility across tools costs more than the upgrade.&lt;/li&gt;
&lt;li&gt;Using default values to hide lack of data governance. A technical default helps evolution; a poorly defined business default creates historical error that looks like complete data.&lt;/li&gt;
&lt;li&gt;Treating &lt;code&gt;_last_updated_sequence_number&lt;/code&gt; as a universal substitute for domain events. It is excellent for analytical change, but it does not carry business causality by itself.&lt;/li&gt;
&lt;li&gt;Allowing multiple writers without an ownership, retry, and idempotency protocol. The format supports interoperability; it does not solve organizational contention.&lt;/li&gt;
&lt;li&gt;Ignoring column statistics and file maintenance. Redshift can optimize better when statistics exist; deletion vectors reduce pain, but they do not remove table hygiene.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Observability, security, and cost in production
&lt;/h2&gt;

&lt;p&gt;I would put Iceberg v3 under the same observability discipline as any critical service. For each candidate table, I keep a dashboard with hourly write volume, rows updated/deleted, age of the latest snapshot, small-file count, MERGE duration, read P95 by query class, and scanned-bytes variation. In Redshift Serverless, I would also use RPU-hour usage limits by day, week, or month; the documentation allows actions such as logging, alerting, or turning off user queries when the limit is reached.&lt;/p&gt;

&lt;p&gt;On security, I avoid relying only on IAM at the bucket. Lake Formation should express permissions by table, column, and where applicable row/cell; S3 and KMS should reinforce perimeter, encryption, and access by expected roles. Writing to Iceberg through Redshift should not use federated identity with &lt;code&gt;SESSION&lt;/code&gt;, according to the documented consideration; I prefer a static platform role with least privilege to specific table paths and corresponding KMS keys.&lt;/p&gt;

&lt;p&gt;For engineering leadership, the most important metric may be recovery time. If a faulty MERGE applies deletion vectors or bad defaults, how do I return to a previous snapshot, who approves it, how long does it take, and which consumers need reprocessing? Without that answer, adoption is not ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions I would ask in a design review
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should I convert all Iceberg v2 tables to v3?
&lt;/h3&gt;

&lt;p&gt;No. I would prioritize tables with frequent schema evolution, recurring MERGE/DELETE activity, or incremental consumers. Stable append-only tables can remain on v2 until there is clear benefit and validated compatibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does row lineage replace regulatory audit?
&lt;/h3&gt;

&lt;p&gt;Not by itself. It improves analytical traceability and incrementality, but regulatory audit still needs decision trails, actor identity, approval, source evidence, and controlled retention.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do deletion vectors eliminate compaction?
&lt;/h3&gt;

&lt;p&gt;No. They reduce the operational cost of deletes compared with many positional delete files, but high-mutation tables still need maintenance policy, file rewrite, and snapshot expiration.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the largest upgrade risk?
&lt;/h3&gt;

&lt;p&gt;Engine compatibility and data semantics. Redshift does not support downgrade from v3 to v2, and there are documented type limitations. I would validate readers, writers, Lake Formation grants, and critical queries on a copy before the change.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My curator note:&lt;/strong&gt; I would adopt Iceberg v3 on Redshift first where there is measurable pain: analytical CDC, regulatory deletions, and contract evolution on large tables. The practical lesson is that open formats do not reduce the need for architecture; they move the discipline into metadata, ownership, and operations. If I cannot explain who writes, who compacts, who authorizes, and who reprocesses, I do not yet have a production design.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/08/amazon-redshift-supports-apache-iceberg-v3/" rel="noopener noreferrer"&gt;AWS What's New: Amazon Redshift now supports Apache Iceberg v3 tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/dg/iceberg-v3-features.html" rel="noopener noreferrer"&gt;Documentação do Amazon Redshift: Apache Iceberg v3 features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/dg/querying-iceberg.html" rel="noopener noreferrer"&gt;Documentação do Amazon Redshift: Using Apache Iceberg tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/redshift/latest/dg/iceberg-integration_overview.html" rel="noopener noreferrer"&gt;Documentação do Amazon Redshift: Apache Iceberg compatibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/redshift/pricing/" rel="noopener noreferrer"&gt;Preços do Amazon Redshift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/big-data/accelerate-data-lake-operations-with-apache-iceberg-v3-deletion-vectors-and-row-lineage/" rel="noopener noreferrer"&gt;AWS Big Data Blog: Iceberg v3 deletion vectors and row lineage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iceberg.apache.org/spec/" rel="noopener noreferrer"&gt;Especificação Apache Iceberg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;My recommendation is to adopt Redshift with Iceberg v3 selectively and with discipline: use it for mutable analytical tables where default values, row lineage, and deletion vectors solve a real operational problem. Do not mass-upgrade. Inventory engines, validate supported types, define write ownership, monitor cost and performance, and treat the migration as a data contract change. For financial-grade platforms, this launch matters because it moves the lakehouse closer to an auditable and incremental model without abandoning S3, Glue Catalog, Lake Formation, and SQL; the value appears when the team combines the technical feature with production governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rating:&lt;/strong&gt; adopt selectively&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fernando.moretes.com/blog/redshift-e-iceberg-v3-notas-de-campo-para-lakes-mutaveis-amazon-redsh" rel="noopener noreferrer"&gt;fernando.moretes.com&lt;/a&gt;. By Fernando F. Azevedo — Senior Solutions Architect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>securityresilience</category>
      <category>redshift</category>
      <category>iceberg</category>
      <category>datalake</category>
    </item>
  </channel>
</rss>
