<?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: Alexandr Kalashnikov</title>
    <description>The latest articles on DEV Community by Alexandr Kalashnikov (@alexandr_kalashnikov).</description>
    <link>https://dev.to/alexandr_kalashnikov</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%2F4241796%2F706facc5-e7ab-4239-aa86-fd5c6b04d09a.png</url>
      <title>DEV Community: Alexandr Kalashnikov</title>
      <link>https://dev.to/alexandr_kalashnikov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexandr_kalashnikov"/>
    <language>en</language>
    <item>
      <title>AWS Extended Support: what it costs and how to find everything you're about to pay for</title>
      <dc:creator>Alexandr Kalashnikov</dc:creator>
      <pubDate>Thu, 12 Nov 2026 22:39:21 +0000</pubDate>
      <link>https://dev.to/alexandr_kalashnikov/aws-extended-support-what-it-costs-and-how-to-find-everything-youre-about-to-pay-for-6i</link>
      <guid>https://dev.to/alexandr_kalashnikov/aws-extended-support-what-it-costs-and-how-to-find-everything-youre-about-to-pay-for-6i</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I build &lt;a href="https://expiry-radar.com" rel="noopener noreferrer"&gt;Expiry Radar&lt;/a&gt;, a tool that tracks dates like these. Nothing below needs it: the script uses only the AWS APIs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When a managed service version reaches the end of standard support, AWS doesn't stop your cluster or database. It moves it to &lt;strong&gt;Extended Support&lt;/strong&gt; and adds a line to your bill. No ticket, no page, no failed deploy. For a version you forgot about, the first sign is often the Cost Explorer graph.&lt;/p&gt;

&lt;p&gt;This post covers what Extended Support costs for EKS, RDS, Aurora and ElastiCache, which versions are already in it (some of you have been paying since August), how to find every affected resource across all regions and accounts with one read-only script, and how to get warned for free next time.&lt;/p&gt;

&lt;p&gt;All prices are us-east-1 list prices from the AWS Price List API as of November 2026. Other regions differ a little.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Extended Support is, and why nobody notices it
&lt;/h2&gt;

&lt;p&gt;AWS gives each version a fixed standard-support window. After it ends, the resource keeps running on the old version, now in Extended Support, and you pay a surcharge on top of the normal price. When Extended Support ends too, AWS upgrades the resource for you, on its schedule.&lt;/p&gt;

&lt;p&gt;Three things make it easy to miss:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Enrollment is automatic.&lt;/strong&gt; EKS clusters default to &lt;code&gt;upgradePolicy.supportType = EXTENDED&lt;/code&gt;. RDS and Aurora instances created through the CLI or API are enrolled by default (the console checkbox is off by default, the API default is on, so the same team can end up with both).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The warning goes to the wrong place.&lt;/strong&gt; AWS Health does announce these changes, usually at least 180 days ahead for major versions, but per account and by email to the account's contacts. In a multi-account setup that's often a shared mailbox nobody reads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The charge is a line item, not an incident.&lt;/strong&gt; Nothing breaks, so nothing pages anyone.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Standard&lt;/th&gt;
&lt;th&gt;Extended Support surcharge&lt;/th&gt;
&lt;th&gt;Year 3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EKS&lt;/td&gt;
&lt;td&gt;$0.10 per cluster-hour&lt;/td&gt;
&lt;td&gt;+$0.50 per cluster-hour ($0.60 total)&lt;/td&gt;
&lt;td&gt;— (extended support lasts 12 months)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS for PostgreSQL / MySQL, Aurora (provisioned)&lt;/td&gt;
&lt;td&gt;instance price&lt;/td&gt;
&lt;td&gt;+$0.10 per vCPU-hour&lt;/td&gt;
&lt;td&gt;+$0.20 per vCPU-hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora Serverless v2&lt;/td&gt;
&lt;td&gt;ACU price&lt;/td&gt;
&lt;td&gt;+$0.085 per ACU-hour&lt;/td&gt;
&lt;td&gt;+$0.17 per ACU-hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElastiCache for Redis OSS&lt;/td&gt;
&lt;td&gt;node price&lt;/td&gt;
&lt;td&gt;+80% of the On-Demand node price&lt;/td&gt;
&lt;td&gt;+160%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Details that change the math:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RDS charges every copy.&lt;/strong&gt; The Multi-AZ standby and every read replica on the old major version pay the surcharge too. Reserved Instance discounts don't apply to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElastiCache reservations don't cover the premium either.&lt;/strong&gt; It's a separate On-Demand line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenSearch has started too:&lt;/strong&gt; from 7 November 2026, Extended Support for several old Elasticsearch and OpenSearch versions is charged at the same rate as the instance itself. MSK and Amazon MQ have no paid extended support; they auto-upgrade after end of support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Three worked examples
&lt;/h3&gt;

&lt;p&gt;A month is ~730 hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One EKS cluster on 1.34 after 2 December:&lt;/strong&gt; $0.50 × 730 = &lt;strong&gt;$365 a month&lt;/strong&gt; extra, $4,380 a year, per cluster. The control plane fee goes from $73 to $438. A dev, staging and prod cluster on the same old version is ~$1,100 a month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RDS for PostgreSQL 14, db.r6g.xlarge (4 vCPU), Multi-AZ, after 28 February 2027:&lt;/strong&gt; 2 instances × 4 vCPU × $0.10 × 730 = &lt;strong&gt;$584 a month&lt;/strong&gt;, and $1,168 a month from year 3. Add a read replica of the same size and it's another $292 (then $584).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ElastiCache for Redis OSS 6, three cache.r6g.large nodes, after 31 January 2027:&lt;/strong&gt; 3 × $0.165 × 730 = &lt;strong&gt;$361 a month&lt;/strong&gt;, $723 from year 3.&lt;/p&gt;

&lt;p&gt;None of these are big numbers alone. They add up across environments, and they keep running until someone upgrades.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dates that matter now (November 2026)
&lt;/h2&gt;

&lt;p&gt;Already in Extended Support, so possibly already on your bill:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;In Extended Support since&lt;/th&gt;
&lt;th&gt;Extended Support ends&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RDS for MySQL 8.0&lt;/td&gt;
&lt;td&gt;1 Aug 2026&lt;/td&gt;
&lt;td&gt;31 Jul 2029&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS for PostgreSQL 13&lt;/td&gt;
&lt;td&gt;1 Mar 2026&lt;/td&gt;
&lt;td&gt;28 Feb 2029&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElastiCache Redis OSS 4 and 5&lt;/td&gt;
&lt;td&gt;1 Feb 2026&lt;/td&gt;
&lt;td&gt;31 Jan 2029 (then auto-upgraded to Valkey)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RDS for MySQL 5.7&lt;/td&gt;
&lt;td&gt;1 Mar 2024&lt;/td&gt;
&lt;td&gt;30 Jun 2029 (year 3 pricing since 1 Mar 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aurora MySQL 2 (5.7)&lt;/td&gt;
&lt;td&gt;1 Nov 2024&lt;/td&gt;
&lt;td&gt;30 Jun 2029&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EKS 1.32&lt;/td&gt;
&lt;td&gt;23 Mar 2026&lt;/td&gt;
&lt;td&gt;23 Mar 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Coming up:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;26 Nov 2026&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EKS 1.31 leaves Extended Support. AWS auto-upgrades the control plane, without a notification and without rollback. Nodes stay on 1.31.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2 Dec 2026&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EKS 1.34 leaves standard support. Billing starts at 00:00 UTC.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31 Jan 2027&lt;/td&gt;
&lt;td&gt;ElastiCache for Redis OSS 6 leaves standard support.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28 Feb 2027&lt;/td&gt;
&lt;td&gt;RDS and Aurora PostgreSQL 14 leave standard support.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31 Mar 2027&lt;/td&gt;
&lt;td&gt;RDS for PostgreSQL 11 leaves Extended Support (auto-upgrade).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I keep the full table, with links to the AWS documentation for each service, at &lt;a href="https://expiry-radar.com/aws-end-of-support" rel="noopener noreferrer"&gt;expiry-radar.com/aws-end-of-support&lt;/a&gt;. The source of truth is the AWS APIs below, which is also what the script uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find everything you're about to pay for
&lt;/h2&gt;

&lt;p&gt;AWS exposes the dates through APIs, so you don't need a spreadsheet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# EKS: every version with its support dates&lt;/span&gt;
aws eks describe-cluster-versions --include-all \
  --query &lt;span class="s1"&gt;'clusterVersions[].[clusterVersion,endOfStandardSupportDate,endOfExtendedSupportDate]'&lt;/span&gt; \
  --output table

&lt;span class="c"&gt;# RDS and Aurora: standard and extended support end dates per major version&lt;/span&gt;
aws rds describe-db-major-engine-versions --engine postgres \
  --query &lt;span class="s1"&gt;'DBMajorEngineVersions[].[MajorEngineVersion,SupportedEngineLifecycles[].LifecycleSupportEndDate]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That tells you the dates. It doesn't tell you which of &lt;em&gt;your&lt;/em&gt; clusters and databases are affected, in which region and account, and what they will cost. So I wrote a script that does:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;It's a single Python file, read-only, with boto3 as the only dependency. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;walks every enabled region of the current account, or every account in your AWS Organization with &lt;code&gt;--org-role&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;reads support dates from the live AWS APIs (EKS and RDS), and from the AWS documentation for ElastiCache, which has no lifecycle API;&lt;/li&gt;
&lt;li&gt;counts vCPUs per instance class, Multi-AZ standbys and replicas, and ElastiCache nodes per replication group;&lt;/li&gt;
&lt;li&gt;knows when a resource has opted out (EKS &lt;code&gt;supportType: STANDARD&lt;/code&gt;, RDS &lt;code&gt;open-source-rds-extended-support-disabled&lt;/code&gt;), so it shows an auto-upgrade instead of a charge;&lt;/li&gt;
&lt;li&gt;prints a table, or &lt;code&gt;--csv&lt;/code&gt; for a spreadsheet.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip install boto3
python3 aws-extended-support-report.py                  &lt;span class="c"&gt;# this account, all regions&lt;/span&gt;
python3 aws-extended-support-report.py --org-role ExtendedSupportReader
python3 aws-extended-support-report.py --all --csv &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; extended-support.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output (made-up resource names, run on 12 November 2026):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ACCOUNT       REGION     SERVICE      RESOURCE                              VERSION               STD ENDS    STATUS                           EXTRA/MONTH
123456789012  eu-west-1  RDS          old-wiki (db.t3.medium)               mysql 5.7             2024-02-29  EXTENDED, year 3                 $292
123456789012  eu-west-1  EKS          data-platform                         1.31                  2025-11-26  EXTENDED, forced upgrade in 14d  $365
123456789012  eu-west-1  ElastiCache  rate-limit (1 x cache.m5.large)       redis 5               2026-01-31  EXTENDED                         $91
123456789012  eu-west-1  RDS          analytics (db.r6g.2xlarge)            postgres 13           2026-02-28  EXTENDED                         $584
123456789012  eu-west-1  EKS          ci-runners                            1.32                  2026-03-23  EXTENDED                         $365
123456789012  eu-west-1  RDS          legacy-cms (db.m6g.large)             mysql 8.0             2026-07-31  EXTENDED                         $146
123456789012  eu-west-1  EKS          payments-prod                         1.34                  2026-12-02  extended in 20d                  $365
123456789012  eu-west-1  ElastiCache  sessions (2 x cache.r6g.large)        redis 6               2027-01-31  extended in 80d                  $241
123456789012  eu-west-1  RDS          orders-db (db.r6g.xlarge, Multi-AZ)   postgres 14           2027-02-28  extended in 108d                 $584
123456789012  eu-west-1  RDS          reporting-1 (Serverless v2, per ACU)  aurora-postgresql 14  2027-02-28  extended in 108d                 ?
123456789012  eu-west-1  EKS          staging                               1.35                  2027-03-27  auto-upgrade in 135d             $0

Extended Support you are paying now: ~$1,843/month
Starting within 365 days unless you upgrade: ~$1,190/month
1 resource(s) without an estimate (Serverless v2 or unknown instance type).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;staging&lt;/code&gt; cluster above opted out of Extended Support, so instead of a charge it gets an automatic upgrade on 27 March, which may be the bigger surprise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissions
&lt;/h3&gt;

&lt;p&gt;The script only reads. If you run it across the organization, don't assume &lt;code&gt;OrganizationAccountAccessRole&lt;/code&gt;: it has administrator access. Deploy a small role to every account (a CloudFormation StackSet works well) with this policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"ec2:DescribeRegions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"ec2:DescribeInstanceTypes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"eks:ListClusters"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"eks:DescribeCluster"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"eks:DescribeClusterVersions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"rds:DescribeDBInstances"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"rds:DescribeDBClusters"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"rds:DescribeDBMajorEngineVersions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"elasticache:DescribeCacheClusters"&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"*"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and a trust policy that allows only your management account (or whichever account you run it from) to assume it. The account you run from needs &lt;code&gt;organizations:ListAccounts&lt;/code&gt; and &lt;code&gt;sts:AssumeRole&lt;/code&gt; on that role.&lt;/p&gt;

&lt;p&gt;Caveats, so you can trust the numbers as far as they go: prices are us-east-1; Aurora Serverless v2 is billed per ACU, which depends on load, so it shows &lt;code&gt;?&lt;/code&gt;; AWS's docs say Aurora is charged per vCPU without spelling out readers, so the script charges every instance, the same way RDS charges replicas; and Aurora MySQL 2 has no published year-3 rate, so it stays at the year 1–2 rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with what you find
&lt;/h2&gt;

&lt;h3&gt;
  
  
  EKS
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check what blocks the upgrade&lt;/strong&gt; before you touch anything. EKS runs upgrade checks for you, including deprecated API usage by your workloads:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   aws eks list-insights --cluster-name &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;name&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; --filter &lt;span class="nv"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UPGRADE_READINESS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;aws eks start-insights-refresh --cluster-name &amp;lt;name&amp;gt;&lt;/code&gt; first if the results are old.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade one minor version at a time.&lt;/strong&gt; The control plane can only move one minor version per upgrade, so a 1.31 cluster needs three upgrades to reach 1.34. Upgrade the add-ons (VPC CNI, CoreDNS, kube-proxy) to versions that support the target, then the control plane, then the nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If a cluster is on 1.31 now, do it before 26 November.&lt;/strong&gt; After that, AWS upgrades the control plane on its own schedule and you can't roll back. Your node groups stay on 1.31 while the control plane moves on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide per cluster whether you want Extended Support at all.&lt;/strong&gt; For a cluster you'd rather auto-upgrade than pay for:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   aws eks update-cluster-config --name &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;name&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; --upgrade-policy &lt;span class="nv"&gt;supportType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;STANDARD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This only works while the cluster is still in standard support.&lt;/p&gt;

&lt;h3&gt;
  
  
  RDS and Aurora
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test the upgrade on a copy.&lt;/strong&gt; Restore a snapshot, upgrade it, run your test suite against it. For PostgreSQL, extensions are the usual blocker; RDS checks them before a major upgrade and fails early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Blue/Green Deployments&lt;/strong&gt; to upgrade production with a short switchover instead of a long in-place upgrade. It supports major version upgrades for MySQL and PostgreSQL (with logical replication limits on PostgreSQL, so read the prerequisites).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opt new databases out explicitly&lt;/strong&gt; if you'd rather be forced to upgrade than pay:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   aws rds create-db-instance ... --engine-lifecycle-support open-source-rds-extended-support-disabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put it in your Terraform/CloudFormation modules, because the API default is "enabled". Current AWS docs say you can also change it on existing instances with &lt;code&gt;modify-db-instance&lt;/code&gt;; older AWS CLI versions don't have the flag on &lt;code&gt;modify&lt;/code&gt; yet, and if standard support has already ended, disabling it triggers the major version upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  ElastiCache
&lt;/h3&gt;

&lt;p&gt;The cheapest fix may not be a Redis upgrade at all. ElastiCache supports upgrading Redis OSS clusters to &lt;strong&gt;Valkey&lt;/strong&gt;, which is out of the Extended Support cycle and, at us-east-1 list prices, about 20% cheaper per node (cache.m5.large: $0.1248 vs $0.156 an hour). If you stay on Redis OSS, upgrade 4, 5 and 6 to 7.x before the dates above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get warned for free next time
&lt;/h2&gt;

&lt;p&gt;You don't need a paid support plan for this. AWS Health sends lifecycle events to EventBridge for every account, at no cost. They're the &lt;code&gt;AWS_&amp;lt;SERVICE&amp;gt;_PLANNED_LIFECYCLE_EVENT&lt;/code&gt; event types (for example &lt;code&gt;AWS_EKS_PLANNED_LIFECYCLE_EVENT&lt;/code&gt; and &lt;code&gt;AWS_RDS_PLANNED_LIFECYCLE_EVENT&lt;/code&gt;), with the affected resources listed.&lt;/p&gt;

&lt;p&gt;One rule in &lt;strong&gt;us-west-2&lt;/strong&gt; receives account-specific Health events from all regions. Route them to an SNS topic and subscribe your team's channel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"aws.health"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"detail-type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"AWS Health Event"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;"eventTypeCategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"scheduledChange"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"eventTypeCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"wildcard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"*_PLANNED_LIFECYCLE_EVENT"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sns create-topic --name lifecycle-events --region us-west-2
aws events put-rule --region us-west-2 --name aws-lifecycle-events \
  --event-pattern file://lifecycle-pattern.json
aws events put-targets --region us-west-2 --rule aws-lifecycle-events \
  --targets &lt;span class="nv"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sns,Arn=arn:aws:sns:us-west-2:&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;account-id&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;:lifecycle-events
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(The SNS topic needs a resource policy that lets &lt;code&gt;events.amazonaws.com&lt;/code&gt; publish to it.)&lt;/p&gt;

&lt;p&gt;For many accounts, turn on &lt;strong&gt;AWS Health organizational view&lt;/strong&gt; in the management account. It's free in the console for every support plan, and then the management account (or a delegated admin) gets one organization-wide EventBridge feed, so one rule covers everything. The Health &lt;em&gt;API&lt;/em&gt; itself does need a Business or Enterprise support plan; EventBridge doesn't.&lt;/p&gt;

&lt;p&gt;The us-west-2 shortcut has no high availability. If you can't miss an event, create the rule in each region you use and deduplicate on &lt;code&gt;communicationId&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn't cover
&lt;/h2&gt;

&lt;p&gt;Extended Support is one kind of AWS deadline. The others don't come through Health's lifecycle events at all: imported ACM certificates (they never auto-renew), Route 53 domains with auto-renew off, IAM access keys past your rotation policy, Secrets Manager rotation, and Savings Plans and Reserved Instances that expire and bump next month's bill. That's the gap I built &lt;a href="https://expiry-radar.com" rel="noopener noreferrer"&gt;Expiry Radar&lt;/a&gt; for: one timeline across accounts, with alerts routed to the team that owns each resource. It's free for one account.&lt;/p&gt;

&lt;p&gt;If the script finds something surprising, or gets a number wrong for your setup, tell me in the comments and I'll fix it.&lt;/p&gt;

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