Download index.html from getreadystack/postgresql-17-azure-extended-support-map: direct link, hf CLI and curl.
- Browser
- Download file 55.9 kB
-
https://huggingface.co/spaces/getreadystack/postgresql-17-azure-extended-support-map/resolve/main/index.html
- Command line
-
hf download hf://spaces/getreadystack/postgresql-17-azure-extended-support-map/index.html
-
curl -L -o index.html https://huggingface.co/spaces/getreadystack/postgresql-17-azure-extended-support-map/resolve/main/index.html
55.9 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <title>Postgres 17 Upgrade — find old versions and upgrade lines</title> | |
| <meta name="description" content="Finds Azure PostgreSQL Flexible Servers pinned to older versions in Terraform, shows their monthly Extended Support bill, and gives the version 17 line."> | |
| <style> | |
| :root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512} | |
| .wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px} | |
| textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box} | |
| .bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer} | |
| input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px} | |
| table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65} | |
| .sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600} | |
| .note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa} | |
| </style> | |
| <script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script> | |
| <style data-yj-mfit="1">#out{max-width:100%}#out td,#out th{overflow-wrap:break-word}#out th{white-space:nowrap}#out pre{white-space:pre-wrap;overflow-wrap:anywhere}#out code{white-space:pre-wrap;overflow-wrap:break-word}@media (max-width:640px){#out td,#out th{overflow-wrap:anywhere}#out th{white-space:normal}table{display:block;max-width:100%;overflow-x:auto}pre{max-width:100%;overflow-x:auto}code,a{overflow-wrap:anywhere}img,svg,video,canvas,iframe{max-width:100%}textarea,input,select{max-width:100%;box-sizing:border-box}.yj-lgbar{position:static;justify-content:flex-end;margin:0 0 10px}h1,h2,h3,h4,p,li,dd,dt,blockquote,figcaption,summary,label,.res,.lead{overflow-wrap:anywhere}label{max-width:100%;box-sizing:border-box}#out table:not(:has(tr>:nth-child(4))){display:table;table-layout:fixed;width:100%}#out table:has(tr>:nth-child(4)),#out table:has(tr>:nth-child(4)) tbody,#out table:has(tr>:nth-child(4)) tr,#out table:has(tr>:nth-child(4)) td{display:block;width:auto;overflow:visible}#out table:has(tr>:nth-child(4)) thead{display:none}#out table:has(tr>:nth-child(4)) tr{padding:10px 0;border-bottom:1px solid rgba(128,128,128,.28)}#out table:has(tr>:nth-child(4)) td{border:0;padding:1px 0}#out table:has(tr>:nth-child(4)) td:nth-child(-n+3){display:inline-block;margin-right:10px;font-size:12px;opacity:.78}}</style> | |
| <!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/postgresql-17-azure-extended-support-map"><!--yj-trust-org-s191--><script type="application/ld+json" data-yj="yj-trust-org">{"@context": "https://schema.org", "@type": "Organization", "name": "ReadyStack", "url": "https://getreadystack.com/", "logo": "https://getreadystack.com/branding/readystack_profile.png", "email": "support@getreadystack.com", "contactPoint": {"@type": "ContactPoint", "contactType": "customer support", "email": "support@getreadystack.com", "availableLanguage": ["English", "German", "Japanese", "Spanish", "Portuguese"]}}</script><!--/yj-trust-org-s191--></head> | |
| <body> | |
| <div class="wrap"> | |
| <h1>Postgres 17 Upgrade — find old versions and upgrade lines</h1> | |
| <p class="lede">Finds every Azure PostgreSQL Flexible Server in your Terraform still pinned to 11, 12, 13 or 14, shows its Extended Support bill per month and the exact version = "17" line. Runs entirely in your browser — nothing is uploaded.</p> | |
| <textarea id="src" spellcheck="false">variable "reporting_pg_version" { | |
| type = string | |
| default = "12" | |
| } | |
| resource "azurerm_postgresql_flexible_server" "orders" { | |
| name = "orders-db" | |
| resource_group_name = azurerm_resource_group.main.name | |
| location = "eastus" | |
| version = "11" | |
| sku_name = "GP_Standard_D4s_v3" | |
| storage_mb = 131072 | |
| storage_type = "PremiumV2_LRS" | |
| } | |
| resource "azurerm_postgresql_flexible_server" "sessions" { | |
| name = "sessions-db" | |
| resource_group_name = azurerm_resource_group.main.name | |
| location = "eastus" | |
| version = "13" | |
| sku_name = "B_Standard_B2s" | |
| } | |
| resource "azurerm_postgresql_flexible_server" "reporting" { | |
| name = "reporting-db" | |
| resource_group_name = azurerm_resource_group.main.name | |
| location = "eastus" | |
| version = var.reporting_pg_version | |
| sku_name = "MO_Standard_E8ds_v4" | |
| } | |
| resource "azurerm_postgresql_flexible_server" "billing" { | |
| name = "billing-db" | |
| resource_group_name = azurerm_resource_group.main.name | |
| location = "eastus" | |
| version = "14" | |
| sku_name = "GP_Standard_D2ds_v5" | |
| lifecycle { | |
| ignore_changes = [version, zone] | |
| } | |
| } | |
| resource "azurerm_postgresql_flexible_server" "analytics" { | |
| name = "analytics-db" | |
| resource_group_name = azurerm_resource_group.main.name | |
| location = "eastus" | |
| version = "17" | |
| sku_name = "GP_Standard_D4ds_v5" | |
| }</textarea> | |
| <div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div> | |
| <div id="out" aria-live="polite"></div> | |
| <div id="paid"><strong>Free here:</strong> Check the open .tf file: every Azure PostgreSQL Flexible Server pinned to 11-14, its Extended Support cost per month, and the exact version = "17" line to replace it.. <strong>In the editor:</strong> The whole workspace in one dated migration report: every server across all .tf files mapped to PostgreSQL 17, with monthly Extended Support cost and billing start date, for the team and the auditor. — that part asks for a licence key.</div> | |
| <p class="note">Same engine as the VS Code extension, byte for byte.</p> | |
| </div> | |
| <script>var PG17_RULES = [ | |
| {"id": "pg11-extended-support", "sev": "error", "version": "11", "standard_end": "2026-07-31", "billing_start": "2026-09-01", "extended_end": "2027-03-31", "title": "PostgreSQL 11 is billed for Extended Support", "fix": "version = \"17\"", "source": "https://learn.microsoft.com/en-us/azure/postgresql/configure-maintain/extended-support"}, | |
| {"id": "pg12-extended-support", "sev": "error", "version": "12", "standard_end": "2026-07-31", "billing_start": "2026-09-01", "extended_end": "2027-11-13", "title": "PostgreSQL 12 is billed for Extended Support", "fix": "version = \"17\"", "source": "https://learn.microsoft.com/en-us/azure/postgresql/configure-maintain/extended-support"}, | |
| {"id": "pg13-extended-support", "sev": "error", "version": "13", "standard_end": "2026-07-31", "billing_start": "2026-09-01", "extended_end": "2028-11-12", "title": "PostgreSQL 13 is billed for Extended Support", "fix": "version = \"17\"", "source": "https://learn.microsoft.com/en-us/azure/postgresql/configure-maintain/extended-support"}, | |
| {"id": "pg14-extended-support-next", "sev": "warning", "version": "14", "standard_end": "2027-01-31", "billing_start": "2027-02-01", "extended_end": "2029-11-11", "title": "PostgreSQL 14 enters Extended Support on 2027-02-01", "fix": "version = \"17\"", "source": "https://learn.microsoft.com/en-us/azure/postgresql/configure-maintain/extended-support"}, | |
| {"id": "premiumv2-on-legacy-version", "sev": "error", "title": "PremiumV2_LRS storage does not support PostgreSQL 11, 12 or 13", "fix": "version = \"17\" in the same change, or storage_type = \"Premium_LRS\"", "source": "https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/postgresql_flexible_server"}, | |
| {"id": "version-in-ignore-changes", "sev": "warning", "title": "lifecycle.ignore_changes lists version, so an upgrade edit is never applied", "fix": "remove version from ignore_changes for the upgrade", "source": "https://developer.hashicorp.com/terraform/language/meta-arguments/lifecycle"}, | |
| {"id": "version-unresolved", "sev": "info", "title": "version comes from a variable or local with no value in this file", "fix": "check the .tfvars value; 11, 12 and 13 are billed since 2026-09-01", "source": "https://learn.microsoft.com/en-us/azure/postgresql/configure-maintain/extended-support"} | |
| ] | |
| ;</script> | |
| <script>// PostgreSQL 17 upgrade map for Azure Database for PostgreSQL Flexible Server pins in Terraform. | |
| // Dates: learn.microsoft.com/azure/postgresql/configure-maintain/extended-support · price: prices.azure.com (East US retail, 0.07 USD per vCore-hour). | |
| (function () { | |
| var RULES = (typeof module !== 'undefined' && typeof require !== 'undefined') ? require('./rules.json') : window.PG17_RULES; | |
| var BY = {}; RULES.forEach(function (r) { BY[r.id] = r; }); | |
| var PRICE = 0.07, HOURS = 730; | |
| var RES = 'azurerm_postgresql_flexible_server'; | |
| // blank comments char-for-char so offsets and line numbers stay true | |
| function strip(t) { | |
| var o = t.split(''), i = 0, n = t.length, inStr = false; | |
| while (i < n) { | |
| var c = t[i]; | |
| if (inStr) { if (c === '\\') { i += 2; continue; } if (c === '"') inStr = false; i++; continue; } | |
| if (c === '"') { inStr = true; i++; continue; } | |
| if (c === '#' || (c === '/' && t[i + 1] === '/')) { while (i < n && t[i] !== '\n') { o[i] = ' '; i++; } continue; } | |
| if (c === '/' && t[i + 1] === '*') { while (i < n && !(t[i] === '*' && t[i + 1] === '/')) { if (t[i] !== '\n') o[i] = ' '; i++; } if (i < n) { o[i] = ' '; o[i + 1] = ' '; i += 2; } continue; } | |
| i++; | |
| } | |
| return o.join(''); | |
| } | |
| function lineAt(t, off) { var l = 1; for (var i = 0; i < off && i < t.length; i++) if (t[i] === '\n') l++; return l; } | |
| function blockEnd(t, open) { var d = 0, s = false; for (var i = open; i < t.length; i++) { var c = t[i]; if (s) { if (c === '\\') { i++; continue; } if (c === '"') s = false; continue; } if (c === '"') s = true; else if (c === '{' || c === '[') d++; else if (c === '}' || c === ']') { d--; if (d === 0) return i; } } return t.length - 1; } | |
| function blocks(t, re) { var out = [], m; re.lastIndex = 0; while ((m = re.exec(t))) { var open = t.indexOf('{', m.index + m[0].length - 1); var end = blockEnd(t, open); out.push({ name: m[1], start: open + 1, end: end, body: t.slice(open + 1, end) }); } return out; } | |
| // attribute at nesting depth 0 of a block body | |
| function topAttr(b, name) { | |
| var d = 0, s = false, ls = 0, body = b.body; | |
| for (var i = 0; i <= body.length; i++) { | |
| var c = body[i]; | |
| if (i === body.length || c === '\n') { | |
| if (d === 0) { var line = body.slice(ls, i); var m = line.match(new RegExp('^\\s*' + name + '\\s*=\\s*(.+?)\\s*$')); if (m) return { raw: m[1], off: b.start + ls }; } | |
| ls = i + 1; continue; | |
| } | |
| if (s) { if (c === '\\') { i++; continue; } if (c === '"') s = false; continue; } | |
| if (c === '"') s = true; else if (c === '{' || c === '[') d++; else if (c === '}' || c === ']') d--; | |
| } | |
| return null; | |
| } | |
| function lit(raw) { var m = String(raw).match(/^"?(\d+)"?$/); return m ? m[1] : null; } | |
| function vcores(sku) { var m = String(sku || '').match(/Standard_[A-Za-z]+?(\d+)/); return m ? +m[1] : 0; } | |
| function money(x) { return x.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ','); } | |
| function day(s) { var m = String(s || '').match(/(\d{4})-(\d{2})-(\d{2})/); return m ? Date.UTC(+m[1], +m[2] - 1, +m[3]) : NaN; } | |
| function check(text, opts) { | |
| var raw = String(text || ''), t = strip(raw), findings = []; | |
| var today = day(opts && opts.today); | |
| var vars = {}; | |
| blocks(t, /variable\s+"([^"]+)"\s*\{/g).forEach(function (b) { var a = topAttr(b, 'default'); if (a && lit(a.raw)) vars[b.name] = { v: lit(a.raw), off: a.off }; }); | |
| blocks(t, new RegExp('resource\\s+"' + RES + '"\\s+"([^"]+)"\\s*\\{', 'g')).forEach(function (b) { | |
| var va = topAttr(b, 'version'); if (!va) return; | |
| var v = lit(va.raw), off = va.off, via = ''; | |
| var vm = va.raw.match(/^var\.([A-Za-z0-9_-]+)$/); | |
| if (!v && vm && vars[vm[1]]) { v = vars[vm[1]].v; off = vars[vm[1]].off; via = ' (default of var.' + vm[1] + ')'; } | |
| if (!v) { var u = BY['version-unresolved']; findings.push({ check: u.id, sev: u.sev, line: lineAt(t, va.off), msg: RES + '.' + b.name + ': version = ' + va.raw + ' has no value in this file. Check the .tfvars value; 11, 12 and 13 are billed for Extended Support since 2026-09-01.' }); return; } | |
| var sku = topAttr(b, 'sku_name'), skuV = sku ? sku.raw.replace(/"/g, '') : '', vc = vcores(skuV); | |
| var r = RULES.filter(function (x) { return x.version === v; })[0]; | |
| if (r) { | |
| var bs = day(r.billing_start), cost = vc ? vc + ' vCores (' + skuV + ') x 0.07 USD per vCore-hour x 730 h = ' + money(vc * PRICE * HOURS) + ' USD a month at the East US list price' : 'cost = vCores x 0.07 USD per vCore-hour (East US list price)'; | |
| var tail = ''; | |
| if (!isNaN(today)) { | |
| var dd = Math.round((today - bs) / 864e5); | |
| tail = dd < 0 ? ' Billing starts in ' + (-dd) + ' days.' : ' Billed for ' + dd + ' days so far' + (vc ? ' = ' + money(dd * 24 * vc * PRICE) + ' USD' : '') + '.'; | |
| } | |
| var when = r.sev === 'error' ? 'billed for Extended Support since ' + r.billing_start + ' (Standard Support ended ' + r.standard_end + ')' : 'Standard Support ends ' + r.standard_end + ', Extended Support billing starts ' + r.billing_start; | |
| findings.push({ check: r.id, sev: r.sev, line: lineAt(t, off), msg: 'PostgreSQL ' + v + ' on ' + RES + '.' + b.name + via + ': ' + when + '; Extended Support ends ' + r.extended_end + '. ' + cost + '.' + tail + ' Fix: ' + r.fix + ' (in-place major upgrade, irreversible: test on a copy, then ALTER EXTENSION ... UPDATE for pgvector/timescaledb).' }); | |
| } | |
| var st = topAttr(b, 'storage_type'); | |
| if (st && /PremiumV2_LRS/.test(st.raw) && /^(11|12|13)$/.test(v)) { var p = BY['premiumv2-on-legacy-version']; findings.push({ check: p.id, sev: p.sev, line: lineAt(t, st.off), msg: RES + '.' + b.name + ': storage_type = "PremiumV2_LRS" does not support PostgreSQL ' + v + ' (azurerm docs). Fix: ' + p.fix + '.' }); } | |
| blocks(b.body, /(lifecycle)\s*\{/g).forEach(function (lb) { | |
| var ig = lb.body.match(/ignore_changes\s*=\s*\[[^\]]*\bversion\b[^\]]*\]/); | |
| if (ig) { var q = BY['version-in-ignore-changes']; findings.push({ check: q.id, sev: q.sev, line: lineAt(t, b.start + lb.start + ig.index), msg: RES + '.' + b.name + ': lifecycle.ignore_changes lists version, so changing version to "17" never reaches Azure and the server stays on ' + v + '. Fix: ' + q.fix + '.' }); } | |
| }); | |
| }); | |
| findings.sort(function (a, b) { return a.line - b.line; }); | |
| return { findings: findings }; | |
| } | |
| var API = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length }; | |
| if (typeof module !== 'undefined' && module.exports) module.exports = API; | |
| if (typeof window !== 'undefined') window.PG17ENGINE = API; | |
| })(); | |
| </script> | |
| <script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다. | |
| ; | |
| function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); } | |
| function summaryLine(res) { | |
| const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length; | |
| return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.'; | |
| } | |
| function toText(res, label) { | |
| const f = (res && res.findings) || []; | |
| const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)]; | |
| f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); }); | |
| return lines.join('\n'); | |
| } | |
| function toHtml(res) { | |
| const f = (res && res.findings) || []; | |
| if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>'; | |
| const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join(''); | |
| return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>'; | |
| } | |
| var PG17REPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml }; | |
| if (typeof module !== 'undefined' && module.exports) module.exports = PG17REPORT; | |
| else window.PG17REPORT = PG17REPORT; | |
| </script> | |
| <script> | |
| (function(){ | |
| var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today'); | |
| today.value=new Date().toISOString().slice(0,10); | |
| function run(){ try { var res=window.PG17ENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.PG17REPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } } | |
| go.onclick=run; if (src.value.trim()) run(); | |
| })(); | |
| </script> | |
| <section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://open-vsx.org/extension/readystack/postgresql-17-azure-extended-support-map" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'postgresql-17-azure-extended-support-map',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/team" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section> | |
| <section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind PostgreSQL 17 Upgrade Map: Azure Extended Support every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"postgresql-17-azure-extended-support-map",lang:"en",source:"rule_alert"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);document.addEventListener("click",function(ev){var b=ev.target&&ev.target.closest?ev.target.closest("button,input[type=submit]"):null;if(b&&!b.closest("[data-yj],[data-yj-cta],[data-yj-install],[data-yj-alert],.yj-find,.yj-related,#yj-ask,.yjp"))mv(ev);},true);})();</script></section> | |
| <section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the full version <span class="yj-price">$29</span></h2><p class="yj-cta-paid" style="margin:.25rem 0 .6rem;color:#1f2a37">The whole workspace in one dated migration report: every server across all .tf files mapped to PostgreSQL 17, with monthly Extended Support cost and billing start date, for the team and the auditor.</p><p class="yj-cta-pay" style="margin:.25rem 0 1rem;color:#5b6b7c;font-size:.94rem">One payment, one licence key for this tool. The key is shown right after payment.</p><p class="yj-cta-anchor" style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Staying on PostgreSQL 11, 12 or 13 costs 0.07 USD per vCore-hour of Extended Support: 204.40 USD a month for one 4-vCore server at the East US list price.</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_cWSdTbIirshgChJ1js5qJV0Gd1flRba9XVdLN4UXqIc" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section><!--yj-trust-strip-s191--><aside data-yj="yj-trust-strip" style="max-width:46rem;margin:-1.8rem auto 2.4rem;padding:.9rem 1.2rem;border:1px solid #d8dee9;border-radius:12px;background:#f6f8fb;font:14.5px/1.55 system-ui,-apple-system,Segoe UI,sans-serif;color:#2b3640"><p style="margin:0 0 .3rem;font-weight:600">Buying here, plainly</p><ul style="margin:0;padding-left:1.2rem"><li style="margin:.25rem 0">Payment runs on Whop’s checkout: your card details go to Whop, not to us, and Whop emails you the receipt.</li><li style="margin:.25rem 0">Your licence key shows on the next page right after payment and stays in your Whop account (Your purchases).</li><li style="margin:.25rem 0">Chose a subscription? Cancel any time in your Whop account (Orders → Cancel membership); access lasts until the end of the period you paid.</li><li style="margin:.25rem 0">Your inputs are calculated in your browser and are not sent to us (unless you ask for the result by email).</li><li style="margin:.25rem 0">Questions before buying? support@getreadystack.com — we answer within 2 business days.</li></ul></aside><!--/yj-trust-strip-s191--> | |
| <!--yj-embed-s178--><details id="embed" data-yj="yj-embed" style="max-width:46rem;margin:1.6rem auto;padding:.85rem 1.1rem;border:1px solid #8884;border-radius:10px"><summary style="cursor:pointer;font-weight:600">Embed this tool on your site (free)</summary><p style="margin:.6rem 0;opacity:.85">Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.</p><textarea readonly rows="6" style="width:100%;font:12px/1.4 ui-monospace,Menlo,Consolas,monospace;border:1px solid #8886;border-radius:7px;padding:.5rem"><iframe src="https://getreadystack.com/embed/postgresql-17-azure-extended-support-map/" title="PostgreSQL 17 Upgrade Map: Azure Extended Support — free online check" loading="lazy" data-rs-embed="en-postgresql-17-azure-extended-support-map" style="width:100%;max-width:760px;height:640px;border:1px solid #e3e3e3;border-radius:10px"></iframe> | |
| <p style="font-size:13px;margin:6px 0 0"><a href="https://getreadystack.com/tools/postgresql-17-azure-extended-support-map">PostgreSQL 17 Upgrade Map: Azure Extended Support — free online check</a> by <a href="https://getreadystack.com/">ReadyStack</a></p> | |
| <script>window.addEventListener("message",function(e){if(e.origin!=="https://getreadystack.com"||!e.data||e.data.type!=="readystack-embed")return;var f=document.querySelectorAll("iframe[data-rs-embed]");for(var i=0;i<f.length;i++){if(f[i].contentWindow===e.source)f[i].style.height=Math.min(e.data.h+6,8000)+"px";}});</script></textarea><p style="margin:.5rem 0 0"><button type="button" data-yj="yj-embed-copy" style="font:inherit;padding:8px 14px;border:1px solid #8884;border-radius:9px;background:transparent;cursor:pointer">Copy code</button> <a href="/embed/">All embeddable tools</a></p><p style="margin:.7rem 0 0;font-size:.92em;opacity:.9">For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. <a href="/embed/pro/?ref=embed_box">See Pro →</a></p></details><script data-yj="yj-embed">(function(){var b=document.querySelector("[data-yj=yj-embed-copy]");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var a=b.closest("details").querySelector("textarea");var v=a.value;function d(){b.textContent="Copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(v).then(d,function(){a.select();});}else{a.select();}});})();</script><!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script> | |
| <script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script> | |
| <script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script> | |
| <script data-yj="yj-prefill-s181 v1">(function(){try{var q=new URLSearchParams(location.search);if(!q.toString())return;var P={"R": {"employee": ["employee|w-?2\\b|arbeitnehmer|angestellt|会社員|従業員|給与所得|trabajador|asalariad|empregad|clt\\b|salari", "Employee"], "self": ["self-?employ|freelanc|sole (trader|prop)|selbst(ä|ae)ndig|freiberuf|個人事業|フリーランス|aut(ó|o)nom|\\bmei\\b", "Freelancer / self-employed"], "landlord": ["landlord|rental|vermiet|大家|不動産|arrendador|alquiler|locador|aluguel", "Landlord"], "investor": ["invest|trader|anleger|投資|inversor|investidor", "Investor / trader"], "employer": ["employer|arbeitgeber|雇用主|事業主|empleador|empregador", "Employer"], "seller": ["seller|online shop|h(ä|ae)ndler|販売|vendedor|e-?commerce", "Online seller"]}, "C": {"US": "^(us|usa)$|united states|estados unidos|vereinigte staaten|アメリカ|米国", "UK": "^(uk|gb)$|united kingdom|great britain|reino unido|vereinigtes k|イギリス|英国", "DE": "^de$|germany|deutschland|alemania|alemanha|ドイツ", "JP": "^jp$|japan|jap(ó|ã|o)n?|日本", "ES": "^es$|spain|españa|espana|espanha|spanien|スペイン", "BR": "^br$|brazil|brasil|ブラジル"}, "B": "your 2027 dates", "L": "en"};function ours(el){return !!(el&&el.closest&&el.closest("[data-yj],[data-yj-cta],[data-yj-cal],.yj-email-gate,.yj-find,.yj-related,#yj-ask,#yjgo,#yjr,header,footer,nav"));}function fields(){var r=document.querySelector("main")||document.body;return [].filter.call(r.querySelectorAll("input,select,textarea"),function(el){var t=(el.type||"").toLowerCase();return !ours(el)&&!el.disabled&&["email","hidden","search","password","file","submit","button","reset","image"].indexOf(t)<0;});}function key(el){return el.getAttribute("data-k")||el.id||el.name||"";}function fire(el){["input","change"].forEach(function(n){try{el.dispatchEvent(new Event(n,{bubbles:true}))}catch(e){}});}function setv(el,v){v=String(v).slice(0,80);var t=(el.type||"").toLowerCase(),tg=el.tagName;if(tg=="SELECT"){var o=[].filter.call(el.options,function(o){return o.value==v||o.text.trim()==v})[0];if(!o)return false;el.value=o.value;}else if(t=="checkbox"||t=="radio"){if(!/^(1|0|true|false|on|off|yes|no)$/i.test(v))return false;el.checked=/^(1|true|on|yes)$/i.test(v);}else if(t=="number"||t=="range"){var n=parseFloat(v.replace(/\s/g,"").replace(",","."));if(!isFinite(n))return false;el.value=String(n);}else if(t=="date"){if(!/^\d{4}-\d{2}-\d{2}$/.test(v))return false;el.value=v;}else{if(/[<>]/.test(v))return false;el.value=v;}fire(el);return true;}function pick(el,rx){if(el.tagName!="SELECT")return false;var re=new RegExp(rx,"i");var o=[].filter.call(el.options,function(o){return re.test(o.value)||re.test(o.text)})[0];if(!o||el.value==o.value)return false;el.value=o.value;fire(el);return true;}function run(){var F=fields(),done={},n=0;q.forEach(function(v,k){if(n>=20||/^(ref|role|cc|utm_.*|fbclid|gclid)$/.test(k)||!/^[A-Za-z0-9_-]{1,40}$/.test(k))return;F.forEach(function(el){if(key(el)===k&&!done[k]&&setv(el,v)){done[k]=1;n++;}});});var cc=(q.get("cc")||"").toUpperCase().replace(/[^A-Z]/g,"");if(P.C[cc])F.forEach(function(el){var k=key(el);if(!done[k]&&/country|land|pa(i|í)s|pays|国/i.test(k+" "+(el.id||""))&&pick(el,P.C[cc])){done[k]=1;n++;}});var ro=(q.get("role")||"").replace(/[^a-z]/g,""),R=P.R[ro];if(R)F.forEach(function(el){var k=key(el);if(!done[k]&&el.tagName=="SELECT"&&[].some.call(el.options,function(o){return [].some.call(Object.keys(P.R),function(x){return new RegExp(P.R[x][0],"i").test(o.text)})})&&pick(el,R[0])){done[k]=1;n++;}});if(q.get("ref")=="calendar"){var h=document.querySelector("main h1")||document.querySelector("h1");var d=document.createElement("div");d.setAttribute("data-yj","yj-prefill-back");d.style.cssText="margin:.4rem 0 .8rem;font:15px/1.5 system-ui,sans-serif;opacity:.9";var a=document.createElement("a");a.href="/"+P.L+"/calendar/?ref=tool"+(R?"&role="+ro:"")+(P.C[cc]?"&cc="+cc:"");a.textContent=(R?R[1]+" \u00b7 ":"")+P.B+" \u2192";d.appendChild(a);if(h&&h.parentNode)h.parentNode.insertBefore(d,h.nextSibling);}document.documentElement.setAttribute("data-yj-prefilled",String(n));}if(document.readyState=="loading")document.addEventListener("DOMContentLoaded",run);else run();}catch(e){}})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&","<":"<",">":">",'"':"""}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-10-12">Updated 2026-10-12</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-10-12","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku642178_result_card.jpg" alt="Migrate from Azure PostgreSQL 11-13 Extended Support to PostgreSQL 17: find the Terraform lines that keep paying" loading="lazy" style="max-width:100%;border-radius:6px"></p> | |
| <p>PostgreSQL on Azure: 6 findings in one 50-line Terraform file, and 715.40 USD a month already billed, for a platform team in the United States running Azure Database for PostgreSQL Flexible Server through the azurerm provider.</p> | |
| <table><thead><tr><th>Line in main.tf</th><th>Server</th><th>What it costs</th><th>Fix</th></tr></thead><tbody><tr><td>default = "12"</td><td>reporting, MO_Standard_E8ds_v4 (8 vCores)</td><td>408.80 USD a month</td><td>default = "17"</td></tr><tr><td>version = "11"</td><td>orders, GP_Standard_D4s_v3 (4 vCores)</td><td>204.40 USD a month</td><td>version = "17"</td></tr><tr><td>storage_type = "PremiumV2_LRS"</td><td>orders, on 11</td><td>not supported</td><td>version = "17" in the same change</td></tr><tr><td>version = "13"</td><td>sessions, B_Standard_B2s (2 vCores)</td><td>102.20 USD a month</td><td>version = "17"</td></tr><tr><td>version = "14"</td><td>billing, GP_Standard_D2ds_v5 (2 vCores)</td><td>102.20 USD a month from 2027-02-01</td><td>version = "17"</td></tr><tr><td>ignore_changes = [version, zone]</td><td>billing</td><td>the upgrade never applies</td><td>ignore_changes = [zone]</td></tr></tbody></table> | |
| <p>On 2026-10-12 the three billed servers had run for 41 days at those rates: 551.04, 275.52 and 137.76 USD, or 964.32 USD in total.</p> | |
| <h3>The dates, from Microsoft's own page</h3> | |
| <p>Microsoft's Extended Support page for Azure Database for PostgreSQL gives the same Standard Support end date, 2026-07-31, for versions 11, 12 and 13. Servers were enrolled automatically on 2026-08-01, and after a one-month grace period billing started on 2026-09-01. The FAQ on that page answers "Can I opt out?" with no: the charge stops only when the server runs a supported version. PostgreSQL 14 is next. Standard Support ends 2027-01-31 and Extended Support starts 2027-02-01. Extended Support ends on 2027-03-31 for 11, 2027-11-13 for 12, 2028-11-12 for 13 and 2029-11-11 for 14.</p> | |
| <p>The price comes from Azure's public retail price API: the meter "Extended Support vCore" costs 0.07 USD per hour in East US. At 730 hours a month, each vCore costs 51.10 USD a month.</p> | |
| <h3>Why the portal is not enough</h3> | |
| <p>The portal shows that a server is enrolled. It does not show the reason your next terraform apply will keep it there. In our sample, the reporting server's version came from <code>var.reporting_pg_version</code>, whose default sat 25 lines above the resource. The billing server had <code>version</code> inside <code>lifecycle { ignore_changes = [...] }</code>, so editing the version to "17" would change nothing in Azure. The orders server asked for PremiumV2_LRS storage, which the azurerm documentation says does not support PostgreSQL 11, 12 or 13.</p> | |
| <h3>How the check works</h3> | |
| <p>The extension reads each <code>azurerm_postgresql_flexible_server</code> block. It resolves <code>var.</code> versions to the default in the same file, reads the vCores from <code>sku_name</code> (D4s = 4, E8ds = 8, B2s = 2), and multiplies by 0.07 and by 730. It applies 7 rules and takes 2 inputs: the file text and today's date. The date sets the "billed for N days so far" or "billing starts in N days" line. For the 14 server on 2026-10-12, that line read 112 days.</p> | |
| <h3>The fix is one line, then a test</h3> | |
| <p>azurerm accepts versions 11 to 18 for this resource, and Azure's supported-versions page lists 17.11 as the current minor release. Change the line to <code>version = "17"</code>. The in-place major upgrade cannot be undone, so run it on a restored copy first. Then update extensions such as pgvector with <code>ALTER EXTENSION ... UPDATE</code>, as Microsoft's FAQ recommends.</p> | |
| <p>The free check covers any open .tf file and shows every finding. The full version writes one dated report for the whole workspace, for the migration ticket.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku642178_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku642178_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does PostgreSQL 17 Upgrade Map: Azure Extended Support do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads a Terraform .tf file and flags every azurerm_postgresql_flexible_server pinned to PostgreSQL 11, 12, 13 or 14. It has 7 rules (pg11, pg12, pg13, pg14, PremiumV2_LRS on 11-13, version in ignore_changes, unresolved version) and takes 2 inputs: the file text and today's date. Each finding gives the Extended Support billing date, the monthly cost from sku_name vCores and the version = "17" fix.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is this PostgreSQL 17 upgrade check for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Platform, DevOps and FinOps engineers who run Azure Database for PostgreSQL Flexible Server through Terraform and the azurerm provider. It is for teams whose servers are still on 11, 12 or 13, which Azure has billed for Extended Support since 2026-09-01, or on 14, where billing starts 2027-02-01, and who need to know which .tf line to change.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just use the Azure portal or a chatbot?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Microsoft says the Azure portal shows which servers are enrolled in Extended Support, but it does not show the Terraform line that pins each one, the variable default behind it, or the lifecycle ignore_changes entry that would quietly drop your upgrade. A chatbot does not know your sku_name vCores, so it cannot work out your monthly cost at 0.07 USD per vCore-hour.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what does the full version add?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Free and complete: check any open .tf file and get every finding from all 7 rules, with the cost per month, the billing date and the exact fix line, using 2 inputs (file text, today's date). The full version, 29 USD once, scans the whole workspace and writes one dated Markdown migration report that maps every server to PostgreSQL 17, for the ticket and the auditor.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does staying on PostgreSQL 11, 12 or 13 cost on Azure?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Azure's retail price list shows Extended Support at 0.07 USD per vCore-hour in East US. At 730 hours a month, a 4-vCore GP_Standard_D4s_v3 server costs 204.40 USD a month and an 8-vCore MO_Standard_E8ds_v4 costs 408.80 USD. In our sample file of 4 servers, that came to 715.40 USD a month already billed.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is the next PostgreSQL date on Azure?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">PostgreSQL 14 loses Azure Standard Support on 2027-01-31, and Extended Support billing starts on 2027-02-01. Extended Support for PostgreSQL 11 ends on 2027-03-31, for 12 on 2027-11-13 and for 13 on 2028-11-12, according to Microsoft's Extended Support page for Azure Database for PostgreSQL.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does PostgreSQL 17 Upgrade Map: Azure Extended Support do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads a Terraform .tf file and flags every azurerm_postgresql_flexible_server pinned to PostgreSQL 11, 12, 13 or 14. It has 7 rules (pg11, pg12, pg13, pg14, PremiumV2_LRS on 11-13, version in ignore_changes, unresolved version) and takes 2 inputs: the file text and today's date. Each finding gives the Extended Support billing date, the monthly cost from sku_name vCores and the version = \"17\" fix."}}, {"@type": "Question", "name": "Who is this PostgreSQL 17 upgrade check for?", "acceptedAnswer": {"@type": "Answer", "text": "Platform, DevOps and FinOps engineers who run Azure Database for PostgreSQL Flexible Server through Terraform and the azurerm provider. It is for teams whose servers are still on 11, 12 or 13, which Azure has billed for Extended Support since 2026-09-01, or on 14, where billing starts 2027-02-01, and who need to know which .tf line to change."}}, {"@type": "Question", "name": "Why not just use the Azure portal or a chatbot?", "acceptedAnswer": {"@type": "Answer", "text": "Microsoft says the Azure portal shows which servers are enrolled in Extended Support, but it does not show the Terraform line that pins each one, the variable default behind it, or the lifecycle ignore_changes entry that would quietly drop your upgrade. A chatbot does not know your sku_name vCores, so it cannot work out your monthly cost at 0.07 USD per vCore-hour."}}, {"@type": "Question", "name": "What is free and what does the full version add?", "acceptedAnswer": {"@type": "Answer", "text": "Free and complete: check any open .tf file and get every finding from all 7 rules, with the cost per month, the billing date and the exact fix line, using 2 inputs (file text, today's date). The full version, 29 USD once, scans the whole workspace and writes one dated Markdown migration report that maps every server to PostgreSQL 17, for the ticket and the auditor."}}, {"@type": "Question", "name": "What does staying on PostgreSQL 11, 12 or 13 cost on Azure?", "acceptedAnswer": {"@type": "Answer", "text": "Azure's retail price list shows Extended Support at 0.07 USD per vCore-hour in East US. At 730 hours a month, a 4-vCore GP_Standard_D4s_v3 server costs 204.40 USD a month and an 8-vCore MO_Standard_E8ds_v4 costs 408.80 USD. In our sample file of 4 servers, that came to 715.40 USD a month already billed."}}, {"@type": "Question", "name": "What is the next PostgreSQL date on Azure?", "acceptedAnswer": {"@type": "Answer", "text": "PostgreSQL 14 loses Azure Standard Support on 2027-01-31, and Extended Support billing starts on 2027-02-01. Extended Support for PostgreSQL 11 ends on 2027-03-31, for 12 on 2027-11-13 and for 13 on 2028-11-12, according to Microsoft's Extended Support page for Azure Database for PostgreSQL."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:642178,slug:"postgresql-17-azure-extended-support-map",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/aks-eks-support-cliff-lint?ref=related"><span class="yj-rel-t">AKS LTS & EKS Extended Support Lint for Terraform</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/rds-extended-support-cost-lint?ref=related"><span class="yj-rel-t">RDS Extended Support Cost Lint for Terraform</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/gke-extended-channel-fee-lint?ref=related"><span class="yj-rel-t">GKE Extended Channel Fee Lint — Terraform</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/pg14-upgrade-blocker-lint?ref=related"><span class="yj-rel-t">PostgreSQL 14 Upgrade Lint (Aurora/RDS 2027)</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/skills/terraform-cost-lint/?ref=related"><span class="yj-rel-t">Terraform cost review skill for Claude Code — standing AWS and Azure charges</span><span class="yj-rel-p">$15</span></a><a class="yj-rel-c" href="https://getreadystack.com/skills/devops-skills-bundle/?ref=related"><span class="yj-rel-t">Three dated DevOps checks for Claude Code — Actions, Terraform, licences</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section><!--yj-trust-foot-s191--><footer data-yj="yj-trust-foot" style="margin:3rem auto 0;padding:1.2rem 1rem 2rem;border-top:1px solid rgba(128,128,128,.28);max-width:60rem;font:14px/1.6 system-ui,-apple-system,Segoe UI,sans-serif;color:#5b6570;text-align:center"><nav aria-label="ReadyStack" style="display:flex;gap:.4rem 1.1rem;justify-content:center;flex-wrap:wrap"><a href="/about" style="color:inherit">About</a><a href="/verify/" style="color:inherit">How we verify</a><a href="/privacy" style="color:inherit">Privacy</a><a href="/terms" style="color:inherit">Terms</a><a href="/contact.html" style="color:inherit">Contact</a><a href="mailto:support@getreadystack.com" style="color:inherit">support@getreadystack.com</a></nav><p style="margin:.6rem 0 0">🔒 Secure checkout by Whop · © 2026 ReadyStack</p></footer><!--/yj-trust-foot-s191--></body> | |
| </html> | |