<?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: frankgg</title>
    <description>The latest articles on DEV Community by frankgg (@frankgg).</description>
    <link>https://dev.to/frankgg</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%2F4233592%2F9310a927-f9e6-4fe3-9b20-ac60596d0cb2.png</url>
      <title>DEV Community: frankgg</title>
      <link>https://dev.to/frankgg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frankgg"/>
    <language>en</language>
    <item>
      <title>One curl, No Login, and a 71.9% Cut on Azure's Biggest SAP HANA VM</title>
      <dc:creator>frankgg</dc:creator>
      <pubDate>Sun, 08 Nov 2026 13:55:44 +0000</pubDate>
      <link>https://dev.to/frankgg/one-curl-no-login-and-a-719-cut-on-azures-biggest-sap-hana-vm-4316</link>
      <guid>https://dev.to/frankgg/one-curl-no-login-and-a-719-cut-on-azures-biggest-sap-hana-vm-4316</guid>
      <description>&lt;p&gt;We run &lt;a href="https://www.sap-ai-lab.cc/" rel="noopener noreferrer"&gt;SAP AI Lab&lt;/a&gt; — two of us, one in ML systems, the other in enterprise information systems. No affiliation with SAP or Microsoft, just a shared habit of reading pricing APIs instead of press releases.&lt;/p&gt;

&lt;p&gt;A while back a friend who manages an S/4HANA estate vented the standard complaint: "RISE is one contract, so why does my Azure bill still exist?" That question turned into the most useful arithmetic we've ever done, and it starts with a single flagship VM.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number that changed our mind about reservations
&lt;/h2&gt;

&lt;p&gt;Azure's largest memory-optimized HANA SKU, &lt;code&gt;Standard_M832is_16_v3&lt;/code&gt; (832 vCPU, 15,200 GiB RAM), lists at &lt;strong&gt;$163.856 per hour&lt;/strong&gt; pay-as-you-go in East US. Same VM, reserved for one year: &lt;strong&gt;$834,816 prepaid&lt;/strong&gt; for the term. Reserved for three years: &lt;strong&gt;$1,209,163&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Do the math against 730 hours a month and the discounts are &lt;strong&gt;41.8% for one year and 71.9% for three years&lt;/strong&gt;. For a two-node high-availability HANA pair that's roughly &lt;strong&gt;$239,200/month at list pay-as-you-go&lt;/strong&gt; versus &lt;strong&gt;~$67,200/month amortized on a three-year reservation&lt;/strong&gt;. All figures are Azure Retail Prices API rows for East US, USD, retrieved as of 2026-11-08 — list prices, not your negotiated rate, but the ratios held across every SKU we queried.&lt;/p&gt;

&lt;p&gt;The uncomfortable part: nobody is hiding this. The &lt;a href="https://prices.azure.com/api/retail/prices" rel="noopener noreferrer"&gt;Azure Retail Prices API&lt;/a&gt; needs no authentication. This curl prints the exact rows we're quoting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://prices.azure.com/api/retail/prices?&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;filter=armSkuName eq 'Standard_M832is_16_v3' and armRegionName eq 'eastus' and type eq 'Reservation'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One trap for first-time queriers: reservation rows report &lt;code&gt;unitOfMeasure&lt;/code&gt; as "1 Hour", but &lt;code&gt;retailPrice&lt;/code&gt; is the &lt;strong&gt;prepaid total for the whole term&lt;/strong&gt;. Read it as a monthly rate and you'll understate your cost by three orders of magnitude in a slide deck, which we have seen happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the subscription quote is not the estate cost
&lt;/h2&gt;

&lt;p&gt;The reservation lever matters even under RISE with SAP, because SAP procures the infrastructure and the subscription price is built on these same public meters. What the bundle does &lt;em&gt;not&lt;/em&gt; cover, though, is everything outside the contracted systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom apps, data lakes, and analytics running on &lt;strong&gt;your&lt;/strong&gt; tenant land on your Azure bill.&lt;/li&gt;
&lt;li&gt;Satellite SAP systems under BYOL do too, and count toward your Microsoft consumption commitment.&lt;/li&gt;
&lt;li&gt;Implementation partner fees land on neither invoice — the classic line item nobody models.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the entitlement pool (you'll see it called RPE in deal collateral) is genuinely opaque: as of 2026-11-08 SAP publishes &lt;strong&gt;no definition, no pool size, no conversion terms&lt;/strong&gt; — it lives in order forms. Our blunt recommendation: get the pool's inventory, eligible products, expiry, and renewal impact in writing &lt;em&gt;before&lt;/em&gt; signing. Most RISE cost overruns trace back to answers assumed for questions never asked.&lt;/p&gt;

&lt;p&gt;Two smaller numbers that surprised us, same as-of date: the identical M-series SKU bills &lt;strong&gt;$38.27/hour more on Windows&lt;/strong&gt; than Linux (~$335k/year on one always-on VM), and a 100 TiB backup repository moves from ~$2,130/month on hot blob storage to ~$101/month on archive — a &lt;strong&gt;21x swing&lt;/strong&gt; that one lifecycle policy fixes.&lt;/p&gt;

&lt;p&gt;And a sizing warning, because reservations only help if the footprint is right: the HANA tier boundary is a step function, not a ramp. Doubling vCPUs from 416 to 832 costs about &lt;strong&gt;3.0x&lt;/strong&gt;, not 2x — the flagship SKUs carry a per-vCPU premium. The same asymmetry runs the other way on the SAP side: the &lt;a href="https://www.sap-ai-lab.cc/tutorials/rise-with-sap-cost-optimization-azure/" rel="noopener noreferrer"&gt;FUE ratios&lt;/a&gt; in the service description guide (1 FUE = 5 core users, 30 self-service users) are locked into your order form for the full term, so an inflated headcount estimate stays oversized for years. Measure twice, subscribe once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we'd do on your Monday morning
&lt;/h2&gt;

&lt;p&gt;Reserve the stable production core first — it usually carries the entire savings program by itself. Then reconcile your Azure export against the entitlement list quarterly: bundled systems already include SAP-managed backup inside the subscription, and we keep finding teams paying twice for the same protection ($80/month per HANA protected instance, incidentally, is the meter we checked).&lt;/p&gt;

&lt;p&gt;The full walkthrough with all the pricing sources and checklists is on our site: &lt;a href="https://www.sap-ai-lab.cc/tutorials/rise-with-sap-cost-optimization-azure/" rel="noopener noreferrer"&gt;RISE with SAP Cost Breakdown: What You Pay on Azure&lt;/a&gt;. It includes the exact queries for storage, backup, and egress meters, the eight-point reduction checklist, and the packaging context in our &lt;a href="https://www.sap-ai-lab.cc/tutorials/rise-with-sap-on-azure/" rel="noopener noreferrer"&gt;RISE with SAP on Azure guide&lt;/a&gt; if you want to know which systems the bundle covers before pricing them.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>sap</category>
      <category>devops</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Microsoft Retired the SAP Landing Zone Docs. We Rebuilt Them from the Git Archive.</title>
      <dc:creator>frankgg</dc:creator>
      <pubDate>Sun, 08 Nov 2026 13:54:38 +0000</pubDate>
      <link>https://dev.to/frankgg/microsoft-retired-the-sap-landing-zone-docs-we-rebuilt-them-from-the-git-archive-1a6h</link>
      <guid>https://dev.to/frankgg/microsoft-retired-the-sap-landing-zone-docs-we-rebuilt-them-from-the-git-archive-1a6h</guid>
      <description>&lt;p&gt;We run &lt;a href="https://www.sap-ai-lab.cc/" rel="noopener noreferrer"&gt;SAP AI Lab&lt;/a&gt; — two of us, one in ML systems, one in enterprise information systems, entirely independent of SAP and Microsoft. This spring our lab finally got approval to move a real SAP landscape to Azure, and before touching a single VM we spent three weeks arguing about landing zones. Half our search results led nowhere. Here's what we settled on, verified as of 2026-11-08.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pages we needed were gone
&lt;/h2&gt;

&lt;p&gt;The Cloud Adoption Framework once shipped SAP-specific enterprise-scale landing zone docs describing an "SAP on Azure construction set" of six design areas: identity and access, network topology, management and monitoring, business continuity/DR, security-governance-compliance, and platform automation and DevOps. Those pages are now retired from the live English site — requesting them today redirects to the generic landing zone overview. Nothing officially documented replaces their SAP-specific checklists one-for-one.&lt;/p&gt;

&lt;p&gt;So we went to the archive: the docs repository on GitHub, read at a pinned commit. Two recommendations from there we adopted verbatim — run &lt;strong&gt;at least two SAP management groups&lt;/strong&gt; so production and non-production get distinct controls, and keep the core SAP platform in dedicated subscriptions. When a fact comes from a 2021 revision, we label it as archived rather than pretending the live page exists. If you're designing this now, plan on doing the same archaeology.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the live framework does still say — and it's enough
&lt;/h2&gt;

&lt;p&gt;The current subscription design area explicitly names SAP, alongside high-performance computing and IoT, as a "large specialized workload" that should use &lt;strong&gt;separate subscriptions to avoid running up against platform limits&lt;/strong&gt;. Three reasons we now repeat in every review meeting: a subscription is a scale unit, a management boundary, and a policy boundary — "development environments have more relaxed policy requirements than production environments." A 2 TB-in-memory database box does not want to share a quota namespace or a policy scope with your chatbot demo.&lt;/p&gt;

&lt;p&gt;Our tree, after two failed drafts: tenant root → &lt;code&gt;Online&lt;/code&gt; (platform: identity, connectivity, management, security subscriptions — the design area is blunt that you "do not combine platform responsibilities into a single subscription") → a workload management group named &lt;code&gt;SAP&lt;/code&gt;, with &lt;code&gt;SAP-DEV&lt;/code&gt;, &lt;code&gt;SAP-TEST&lt;/code&gt;, and &lt;code&gt;SAP-PRD&lt;/code&gt; as separate children. Production under its own management group child is what makes "deny by default in prod, relaxed in dev" a two-click policy assignment instead of an exception spreadsheet. One counterintuitive mercy: subscriptions are global logical containers, so you do &lt;strong&gt;not&lt;/strong&gt; need one per region — the primary-plus-secondary DR pair shares a subscription unless it's independently managed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gotcha that cost us two days
&lt;/h2&gt;

&lt;p&gt;A service principal with only &lt;code&gt;Contributor&lt;/code&gt; cannot grant permissions to what it deploys. The SAP Deployment Automation Framework planning doc is explicit that automation identities &lt;em&gt;also&lt;/em&gt; need &lt;strong&gt;User Access Administrator&lt;/strong&gt; — and our first control-plane deployment failed for two days before we found that one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az role assignment create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--assignee&lt;/span&gt; &amp;lt;your-application-ID&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; &lt;span class="s2"&gt;"User Access Administrator"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--scope&lt;/span&gt; /subscriptions/&amp;lt;your-subscription-ID&amp;gt;/resourceGroups/&amp;lt;your-resource-group-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two smaller landmines, same price bracket. Every dedicated spoke subscription eats your account's subscription count, and the defaults are not generous — we requested a quota increase before creating the sixth spoke. And the archived governance page recommended excluding SAP database servers from automatic endpoint-protection policy installs; we nearly learned that one the painful way during a HANA storage-layer test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then, and only then, the compute
&lt;/h2&gt;

&lt;p&gt;The sequencing that actually worked: management groups and policy scopes → control plane (the DAF's hub subscription with deployer VMs, Key Vault, firewall, Bastion) → workload zones → systems. For one system instead of a landscape, Azure Center for SAP solutions and its Virtual Instance for SAP solutions resource bakes the separation-of-duties RBAC in for you — the framework and ACSS are complementary, not a decision between tribes. Naming is governance too: fight the DAF convention (&lt;code&gt;DEV-WEEU-SAP01-INFRASTRUCTURE&lt;/code&gt;) after you've deployed anything and you'll be miserable; decide it in the review meeting, not in the Terraform state.&lt;/p&gt;

&lt;p&gt;The full walkthrough with all the pricing sources and checklists is on our site: &lt;a href="https://www.sap-ai-lab.cc/tutorials/azure-landing-zone-sap-architecture/" rel="noopener noreferrer"&gt;Azure Landing Zone for SAP in 2026&lt;/a&gt; — the complete management-group layout, commit-pinned archive citations, and what we verified versus guessed. The compute decisions that come &lt;em&gt;after&lt;/em&gt; this carve-out live in our &lt;a href="https://www.sap-ai-lab.cc/tutorials/deploy-sap-hana-on-azure/" rel="noopener noreferrer"&gt;HANA deployment guide&lt;/a&gt;, and the contract-side reading is in &lt;a href="https://www.sap-ai-lab.cc/tutorials/rise-with-sap-on-azure/" rel="noopener noreferrer"&gt;RISE with SAP on Azure&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>sap</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Copilot Borrows Joule's Eyes: How the SAP–Microsoft Integration Actually Gates Your Data</title>
      <dc:creator>frankgg</dc:creator>
      <pubDate>Sun, 08 Nov 2026 13:45:20 +0000</pubDate>
      <link>https://dev.to/frankgg/copilot-borrows-joules-eyes-how-the-sap-microsoft-integration-actually-gates-your-data-f0n</link>
      <guid>https://dev.to/frankgg/copilot-borrows-joules-eyes-how-the-sap-microsoft-integration-actually-gates-your-data-f0n</guid>
      <description>&lt;p&gt;We run &lt;a href="https://www.sap-ai-lab.cc/" rel="noopener noreferrer"&gt;SAP AI Lab&lt;/a&gt; — two of us, one in ML systems, the other in enterprise information systems. Independent blog, no endorsement from SAP or Microsoft, and we like asking the questions enterprise architects ask at 2 a.m.&lt;/p&gt;

&lt;p&gt;Ours, this autumn: a friend managing a mixed SAP/M365 estate said "we bought Copilot licenses, so SAP data is in Copilot now, right?" It isn't, and the reason &lt;em&gt;why&lt;/em&gt; it isn't turned out to be the most interesting part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mental model that makes everything else click
&lt;/h2&gt;

&lt;p&gt;The managed integration between SAP Joule and Microsoft 365 Copilot — generally available since February 2026 (SAP News DE listing, 2026-02-09, "Allgemeine Verfügbarkeit"; Microsoft's operational doc last updated 2026-09-11; our verification pass as of 2026-11-08) — is bidirectional. In Teams, a buyer types &lt;code&gt;@Joule Show me open purchase orders that are past their expected delivery dates&lt;/code&gt; and the answer comes back into the chat. Inside Joule, the same user can ask for their own emails and Teams chats. Reversibility is the point: neither copilot owns the user.&lt;/p&gt;

&lt;p&gt;But here's the governance shape: &lt;strong&gt;Copilot borrows Joule's eyes, and Joule sees only what the mapped SAP user is permitted to see.&lt;/strong&gt; The request path is Entra ID authenticating the Microsoft 365 user → SAP Cloud Identity Services mapping that identity to &lt;em&gt;their&lt;/em&gt; SAP user → Joule executing against S/4HANA under that SAP identity, with the same OData-level permissions they'd have in Fiori. SAP's documentation says Joule use cases "follow the same configurations and permissions as those on the Web." Nobody is opening a side door into your ERP; the division of labor is explicit — SAP does the natural-language processing for SAP tasks, Microsoft owns the Copilot/Teams experience, and the join between them is an identity trust, nothing more.&lt;/p&gt;

&lt;p&gt;Which explains the most confusing support ticket in this whole area: when a supported question returns "no data" for user B but works for user A, &lt;strong&gt;that is expected behavior, not a bug.&lt;/strong&gt; Either user B lacks the SAP-side role, or their Entra→SAP provisioning was never completed — the #1 documented failure mode. Check SAP roles first, IAS mapping second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licensing has teeth on both sides
&lt;/h2&gt;

&lt;p&gt;Buying one side buys you an icon that returns nothing. You need Microsoft 365 Copilot seats &lt;em&gt;and&lt;/em&gt; the SAP entitlements for Joule. On the SAP side, Business AI activation is entitlement-driven through the AI Activation Dashboard in SAP for Me, on the &lt;strong&gt;new AI Unit SKU 8019164&lt;/strong&gt; (released 2025-05-20); the legacy SKU 8018592 still activates individual features but not through the new package flow. Mark two dates in the planner: the simplified activation flow arrived &lt;strong&gt;April 1, 2026&lt;/strong&gt;, and the legacy IAS-based activation path &lt;strong&gt;started deprecating May 1, 2026&lt;/strong&gt;. Teams still on the old path hit walls and need their SAP account engineer to migrate SKUs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Azure OpenAI actually sits
&lt;/h2&gt;

&lt;p&gt;Every Azure architect asks this, so we'll be precise about what the sources support. Documented: Joule runs on SAP BTP, whose model-serving layer is the generative AI hub in SAP AI Core, and SAP's AI Core documentation explicitly lists Azure OpenAI models — "additional selected models from OpenAI are supported via Azure," with Azure Content Safety and Prompt Shield in the hub's safety layer. Inferred: the GPT models behind Joule scenarios are served through Azure OpenAI infrastructure. Not documented: that &lt;em&gt;every&lt;/em&gt; prompt lands on an Azure OpenAI model — the hub is deliberately multi-provider (Claude, Gemini, Llama are in the catalog), and some GPT-4 endpoints are deprecated in favor of GPT-4.1 per SAP Note 3437766. For a compliance review, ask which model serves &lt;em&gt;your&lt;/em&gt; scenarios.&lt;/p&gt;

&lt;p&gt;Also be honest about the boundaries we verified: standard Joule and Copilot scenarios only — custom Copilot Studio agents do not ride this bridge (that's a different track with its own connector licensing), and the integration can't answer what Joule itself can't do. Our own gaps list, which we'd rather admit than smooth over: no English-language SAP press item pins the GA date, and prompt-retention specifics across the Copilot→Joule boundary aren't documented in the sources we could reach.&lt;/p&gt;

&lt;p&gt;The full walkthrough with all the pricing sources and checklists is on our site: &lt;a href="https://www.sap-ai-lab.cc/tutorials/sap-joule-m365-copilot-azure/" rel="noopener noreferrer"&gt;SAP Joule + M365 Copilot on Azure: How It Actually Works&lt;/a&gt;, including the worked request trace and the seven rollout pitfalls. If the managed bridge's "standard scenarios only" is where you chafe, the open-protocol path is our &lt;a href="https://www.sap-ai-lab.cc/tutorials/sap-a2a-protocol-agent-integration/" rel="noopener noreferrer"&gt;A2A integration guide&lt;/a&gt;, and the vocabulary cleanup is the &lt;a href="https://www.sap-ai-lab.cc/tutorials/sap-business-ai-joule-copilot-terminology/" rel="noopener noreferrer"&gt;Business AI terminology map&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sap</category>
      <category>azure</category>
      <category>ai</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>There Is No Box in SAP's Launchpad for Your Azure OpenAI Key</title>
      <dc:creator>frankgg</dc:creator>
      <pubDate>Sun, 08 Nov 2026 13:43:41 +0000</pubDate>
      <link>https://dev.to/frankgg/there-is-no-box-in-saps-launchpad-for-your-azure-openai-key-88l</link>
      <guid>https://dev.to/frankgg/there-is-no-box-in-saps-launchpad-for-your-azure-openai-key-88l</guid>
      <description>&lt;p&gt;We run &lt;a href="https://www.sap-ai-lab.cc/" rel="noopener noreferrer"&gt;SAP AI Lab&lt;/a&gt; — two of us, one in ML systems, the other in enterprise information systems; independent blog, endorsed by neither vendor. Wiring Azure OpenAI into SAP BTP is the most common "first AI project" for SAP architects in 2026, and we watched two attempts fail the same way before we got it right ourselves. Verified as of 2026-11-08.&lt;/p&gt;

&lt;p&gt;Both teams started with the same sentence in their design doc: &lt;em&gt;"register our Azure OpenAI endpoint in SAP AI Launchpad."&lt;/em&gt; There is no such registration. The Launchpad has no form where you paste your own &lt;code&gt;*.openai.azure.com&lt;/code&gt; URL and API key. What actually exists are two genuinely different paths, and confusing them is the single biggest source of failed setups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Path A: SAP-managed capacity — your keys are never involved
&lt;/h2&gt;

&lt;p&gt;The Generative AI hub in SAP AI Core offers Azure OpenAI models (&lt;code&gt;gpt-4o&lt;/code&gt;, &lt;code&gt;gpt-4o-mini&lt;/code&gt;, the &lt;code&gt;gpt-4.1&lt;/code&gt; family) through the &lt;code&gt;azure-openai&lt;/code&gt; executable, running on SAP-managed Azure capacity. Your application authenticates with a &lt;strong&gt;BTP service key&lt;/strong&gt;; SAP's Azure credentials never surface to you, and there is nothing to grant on your Azure subscription. This is the fast, well-trodden path — billed through your SAP AI Core subscription.&lt;/p&gt;

&lt;p&gt;Except it's gated by one line item nobody reads: the hub and its &lt;code&gt;foundation-models&lt;/code&gt;/&lt;code&gt;orchestration&lt;/code&gt; scenarios are &lt;strong&gt;not available in the Free or Standard service plans&lt;/strong&gt; — you need the AI Core &lt;strong&gt;&lt;code&gt;extended&lt;/code&gt; plan&lt;/strong&gt;. Every time a colleague posts "the Generative AI hub is missing from my Launchpad," the answer is the service plan, not a bug, not a permission. If you're setting up a subaccount and identity layer first, our &lt;a href="https://www.sap-ai-lab.cc/tutorials/sap-btp-subaccount-setup-entra-sso/" rel="noopener noreferrer"&gt;BTP subaccount + Entra SSO walkthrough&lt;/a&gt; covers that hour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Path B: bring your own — call your own resource, directly
&lt;/h2&gt;

&lt;p&gt;If the requirement is "inference must run on &lt;em&gt;our&lt;/em&gt; subscription, quota, and region" — billing against your own enterprise agreement — the path is REST from your BTP application straight to your Azure OpenAI deployment. The API key works, but the production answer is Entra ID with a data-plane role: &lt;code&gt;Cognitive Services OpenAI User&lt;/code&gt; (role ID &lt;code&gt;5e0bd9bd-7b93-4f28-af87-19fc36ad61bd&lt;/code&gt;) permits inference but not key reading or deployment management, with a token scoped to &lt;code&gt;https://cognitiveservices.azure.com/.default&lt;/code&gt;. One trap, straight from our incident log: management-plane roles govern the &lt;em&gt;resource&lt;/em&gt;; if you assigned only those, &lt;code&gt;chat/completions&lt;/code&gt; still 401s until the data-plane assignment exists. And the second-most-common 404 on this endpoint is semantic: the URL takes the &lt;strong&gt;deployment name&lt;/strong&gt;, not the model name — two very different strings.&lt;/p&gt;

&lt;h2&gt;
  
  
  The orchestration layer most teams skip and shouldn't
&lt;/h2&gt;

&lt;p&gt;On Path A, the &lt;code&gt;orchestration&lt;/code&gt; executable gives you a pipeline you'd otherwise rebuild badly in app code: grounding → templating → masking → input/output filtering → model configuration, invoked as one POST to &lt;code&gt;/v2/completion&lt;/code&gt;. Our favorite two features: a &lt;code&gt;masking&lt;/code&gt; module with SAP Data Privacy Integration that anonymizes entities (emails, phone numbers) &lt;em&gt;before&lt;/em&gt; the prompt reaches the model and re-substitutes on the way out; and turning &lt;code&gt;modules&lt;/code&gt; from an object into an &lt;strong&gt;array&lt;/strong&gt; converts the call into a fallback chain — &lt;code&gt;gpt-4o&lt;/code&gt; degrading to &lt;code&gt;gpt-4o-mini&lt;/code&gt; when the first fails. Small API honesty note: &lt;code&gt;max_tokens&lt;/code&gt; is deprecated in the current spec — use &lt;code&gt;max_completion_tokens&lt;/code&gt;, and if a parameter is silently dropped, the &lt;code&gt;X-Orchestration-Dropped-Model-Params&lt;/code&gt; response header tells you which.&lt;/p&gt;

&lt;p&gt;Two residency caveats before your compliance meeting: in SAP's model-availability matrix, &lt;code&gt;Yes*&lt;/code&gt; means a model &lt;em&gt;may be served cross-region&lt;/em&gt; for load balancing — pin regions and check the matrix before promising EU-only processing. And no, Cloud Connector is not your egress proxy: it tunnels to private networks behind it; it does not proxy arbitrary outbound REST to Azure's public endpoint.&lt;/p&gt;

&lt;p&gt;The full walkthrough with all the pricing sources and checklists is on our site: &lt;a href="https://www.sap-ai-lab.cc/tutorials/sap-btp-azure-openai-integration/" rel="noopener noreferrer"&gt;Connect Azure OpenAI to SAP BTP: Generative AI Orchestrator Setup&lt;/a&gt; — the complete CLI sequence, the Launchpad role collection, the working masking payload, and the error-by-error troubleshooting table. For what the same model layer means for Joule users, see our &lt;a href="https://www.sap-ai-lab.cc/tutorials/sap-joule-m365-copilot-azure/" rel="noopener noreferrer"&gt;Joule + M365 Copilot guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sap</category>
      <category>azure</category>
      <category>openai</category>
    </item>
    <item>
      <title>We Wired SAP Joule to an Azure AI Foundry Agent. The Protocol Was the Easy Part.</title>
      <dc:creator>frankgg</dc:creator>
      <pubDate>Sun, 08 Nov 2026 13:36:33 +0000</pubDate>
      <link>https://dev.to/frankgg/we-wired-sap-joule-to-an-azure-ai-foundry-agent-the-protocol-was-the-easy-part-p24</link>
      <guid>https://dev.to/frankgg/we-wired-sap-joule-to-an-azure-ai-foundry-agent-the-protocol-was-the-easy-part-p24</guid>
      <description>&lt;p&gt;We run &lt;a href="https://www.sap-ai-lab.cc/" rel="noopener noreferrer"&gt;SAP AI Lab&lt;/a&gt; — two of us, one in ML systems, one in enterprise information systems, independent of both vendors whose acronyms appear below. When SAP put A2A at the center of its BTP agentic stack at TechEd Berlin 2025 and Microsoft shipped an A2A endpoint in Foundry Agent Service, we tried to connect the two and wrote down every wall we hit. All facts below re-verified against SAP and Microsoft documentation as of 2026-11-08.&lt;/p&gt;

&lt;p&gt;First, one line of context for anyone arriving late: the &lt;a href="https://a2a-protocol.org/latest/specification/" rel="noopener noreferrer"&gt;Agent2Agent protocol&lt;/a&gt; is the open standard for agents calling &lt;em&gt;other agents&lt;/em&gt; — an Agent Card published at &lt;code&gt;/.well-known/agent-card.json&lt;/code&gt;, then tasks with a real lifecycle (&lt;code&gt;submitted&lt;/code&gt; → &lt;code&gt;working&lt;/code&gt; → terminal states, with &lt;code&gt;input-required&lt;/code&gt; for "a human must approve this"). It complements MCP rather than competing: MCP gives each agent depth against its tools, A2A gives the system reach across an organizational boundary. Google donated it to the Linux Foundation in 2025, where MCP also lives now, and both SAP and Microsoft ship first-party support.&lt;/p&gt;

&lt;p&gt;The protocol mechanics were fine. The platform edges are where we lost an afternoon. Three constraints shaped the entire design.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Joule waits ~60 seconds. Plan your task topology around that.
&lt;/h2&gt;

&lt;p&gt;The SAP side is clean on paper: a custom agent built in Joule Studio (GA since December 2025) with the namespace &lt;code&gt;joule.ext&lt;/code&gt;, a capability file using &lt;code&gt;agent-request&lt;/code&gt; against a BTP HTTP destination, deployed with the Joule Studio CLI. Two gotchas the docs make painful: the destination URL must point at the agent's base &lt;strong&gt;without&lt;/strong&gt; the &lt;code&gt;/.well-known/&lt;/code&gt; suffix — Joule appends it itself — and the whole call is synchronous with a budget of roughly 60 seconds. A credit-block review that takes four minutes cannot live behind that timeout. Long work must become a task you surface through a status update or a follow-up turn that passes the same &lt;code&gt;contextId&lt;/code&gt; and &lt;code&gt;taskId&lt;/code&gt; back. Design for handoff, not for holding the connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Foundry inbound endpoint will not stream to you.
&lt;/h2&gt;

&lt;p&gt;Microsoft exposes an existing prompt agent as an A2A endpoint — genuinely no bespoke glue — but read the limits before sketching architecture: incoming A2A is &lt;strong&gt;text modality only&lt;/strong&gt;, &lt;strong&gt;no SSE streaming&lt;/strong&gt;, tasks and contexts retained 60 days after last write, and v1.0 bound to JSON-RPC only (no gRPC). Enablement isn't in the portal; it's a REST PATCH against the agent's &lt;code&gt;endpoint/protocols/a2a&lt;/code&gt; path. Even if your SAP-side agent streams, cross this boundary with &lt;code&gt;GetTask&lt;/code&gt; polling. We rebuilt a pretty streaming demo into a poll loop in about forty minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Omit the version, and you silently get the old one.
&lt;/h2&gt;

&lt;p&gt;This is the one we'd tattoo on a client laptop. One Foundry endpoint serves both A2A v1.0 (generally available) and v0.3 (preview). Today, &lt;strong&gt;omitting the version falls back to v0.3&lt;/strong&gt; — not the GA version. Pin it explicitly with the &lt;code&gt;A2A-Version: 1.0&lt;/code&gt; header or the versioned card path, and note that conflicting signals return HTTP 400 &lt;code&gt;version-ambiguous&lt;/code&gt;. Pinning matters because v1.0 reshuffled the wire format: &lt;code&gt;message/send&lt;/code&gt; became &lt;code&gt;SendMessage&lt;/code&gt;, the &lt;code&gt;kind&lt;/code&gt; discriminator and &lt;code&gt;final&lt;/code&gt; flag are gone, enums are SCREAMING_SNAKE_CASE, and transport details moved into &lt;code&gt;supportedInterfaces&lt;/code&gt; with a per-interface &lt;code&gt;protocolVersion&lt;/code&gt;. Every v0.3-era snippet in your notes needs a moment of suspicion before you reuse it.&lt;/p&gt;

&lt;p&gt;Two security notes while we're here. A public agent card advertises your skills to anyone probing the well-known URI — gate it, or serve an authenticated extended card. And on the Azure side, an A2A caller needs the &lt;strong&gt;Foundry Agent Consumer&lt;/strong&gt; role at project or agent scope; key-based and anonymous card access aren't supported.&lt;/p&gt;

&lt;p&gt;Our reference build uses &lt;code&gt;a2a-sdk&lt;/code&gt; 1.3.0 (Python 3.12+) — the SDK handles wire format, task store, and streaming so your code is just an executor class. If the card format itself is what you're wrestling with, the &lt;a href="https://www.sap-ai-lab.cc/tutorials/a2a-agent-card-deep-dive/" rel="noopener noreferrer"&gt;Agent Card deep-dive&lt;/a&gt; covers URI, capabilities, and skills field by field, and the &lt;a href="https://www.sap-ai-lab.cc/tutorials/sap-btp-azure-openai-integration/" rel="noopener noreferrer"&gt;model layer behind your agents&lt;/a&gt; is its own integration project.&lt;/p&gt;

&lt;p&gt;The full walkthrough with all the pricing sources and checklists is on our site: &lt;a href="https://www.sap-ai-lab.cc/tutorials/sap-a2a-protocol-agent-integration/" rel="noopener noreferrer"&gt;A2A Protocol with SAP Joule &amp;amp; Azure AI Foundry: A Practical Guide&lt;/a&gt; — step-by-step build, the working executor code, the destination setup, and the smoke tests we run before registering any endpoint.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sap</category>
      <category>azure</category>
      <category>agents</category>
    </item>
    <item>
      <title>The Azure CLI Extension That Doesn't Exist — And Is Probably in Your SAP Runbook</title>
      <dc:creator>frankgg</dc:creator>
      <pubDate>Sun, 08 Nov 2026 13:35:50 +0000</pubDate>
      <link>https://dev.to/frankgg/the-azure-cli-extension-that-doesnt-exist-and-is-probably-in-your-sap-runbook-2jke</link>
      <guid>https://dev.to/frankgg/the-azure-cli-extension-that-doesnt-exist-and-is-probably-in-your-sap-runbook-2jke</guid>
      <description>&lt;p&gt;We run &lt;a href="https://www.sap-ai-lab.cc/" rel="noopener noreferrer"&gt;SAP AI Lab&lt;/a&gt; — two of us, one in ML systems, the other in enterprise information systems. We're independent and not affiliated with SAP or Microsoft, which is exactly why we rebuild deployment runbooks from primary sources instead of trusting them: a blog post is a snapshot, and this area moves. Our findings below trace to Microsoft Learn pages last updated between October 2025 and August 2026, verified as of 2026-11-08. Last month we nearly got burned anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;az extension add --name azure-ha&lt;/code&gt; will fail, and it should
&lt;/h2&gt;

&lt;p&gt;While checking a SAP HANA high-availability runbook line by line against Microsoft Learn, we searched the Azure CLI extension index for &lt;code&gt;azure-ha&lt;/code&gt; — the extension several tutorials, blog posts, and (increasingly) AI-generated runbooks tell you to install. &lt;strong&gt;It does not exist.&lt;/strong&gt; Nothing by that name ships in the index. If a runbook says otherwise, it is stale or hallucinated.&lt;/p&gt;

&lt;p&gt;What the real HA enablement actually consists of, per Microsoft's current docs (all pages we cite were updated between October 2025 and August 2026):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;az workloads&lt;/code&gt; command group — Azure Center for SAP solutions, backed by the &lt;code&gt;Microsoft.Workloads&lt;/code&gt; resource provider you must register first;&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;az hana&lt;/code&gt; module from the Azure/azure-hanaonazure-cli-extension repository;&lt;/li&gt;
&lt;li&gt;inside the guest, &lt;code&gt;fence-agents-azure-arm&lt;/code&gt; plus SBD/Pacemaker (&lt;code&gt;sudo zypper -n install fence-agents-azure-arm&lt;/code&gt; on SLES).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of it is named &lt;code&gt;azure-ha&lt;/code&gt;. The lesson generalizes: verify every CLI incantation against the official index before it reaches a production runbook, because confident-sounding fiction propagates fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second silent failure: certification lists
&lt;/h2&gt;

&lt;p&gt;The other trap that cost us a full afternoon of re-reading: &lt;strong&gt;NetWeaver-certified is not HANA-certified&lt;/strong&gt;. The source of truth for HANA on Azure VMs is the SAP HANA hardware directory, not the older NetWeaver VM list in SAP note 1928533. Microsoft's own reference tables mark &lt;code&gt;E16v3&lt;/code&gt; and &lt;code&gt;E32v3&lt;/code&gt; as "VM type not HANA certified" — and a system on those SKUs sails along until it silently misses HANA's storage latency KPIs (250 MB/s read and write on &lt;code&gt;/hana/log&lt;/code&gt; at 1 MB I/O, ≥400 MB/s read on &lt;code&gt;/hana/data&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What storage design looks like now
&lt;/h2&gt;

&lt;p&gt;If your mental model is P30/P40 LUN arithmetic, most of it is obsolete. The pattern today is &lt;strong&gt;Premium SSD v2&lt;/strong&gt; with rules you can memorize in one sitting: size &lt;code&gt;/hana/data&lt;/code&gt; at 1.2× VM RAM, &lt;code&gt;/hana/log&lt;/code&gt; at 0.5× RAM (capped at 500 GiB above 1 TiB), &lt;code&gt;/hana/shared&lt;/code&gt; at 1× RAM. A single v2 disk tops out at 1,200 MB/s and 80,000 IOPS, so the big M-series machines need striped sets.&lt;/p&gt;

&lt;p&gt;And caching, the most-mistaken setting on Premium SSD v1: &lt;code&gt;/hana/data&lt;/code&gt; gets None or read-only; &lt;code&gt;/hana/log&lt;/code&gt; gets &lt;strong&gt;None plus Write Accelerator&lt;/strong&gt; — mandatory on M-series with v1 disks, and it only works on those families; &lt;code&gt;/hana/shared&lt;/code&gt; gets read-only. Premium SSD v2 and Ultra Disk simplify all of this by offering &lt;strong&gt;no caching options at all&lt;/strong&gt; and meeting the latency KPIs without Write Accelerator.&lt;/p&gt;

&lt;p&gt;Two gotchas we'd rather hand you than watch you find: every VM SKU has an aggregate storage throughput budget, and an oversized &lt;code&gt;/hana/data&lt;/code&gt; volume whose savepoints saturate it will starve redo-log writes — throughput &lt;em&gt;at or below&lt;/em&gt; the VM's limit, deliberately. And HANA System Replication requires the &lt;strong&gt;same storage type on every replica&lt;/strong&gt; for data, and likewise for log; mixing Premium SSD on the primary with Ultra on the replica is unsupported, however tempting the benchmark looked.&lt;/p&gt;

&lt;p&gt;One networking note worth stealing before you build: attach NICs with Accelerated Networking at VM creation, give the HANA VMs &lt;strong&gt;no public IP&lt;/strong&gt; and manage them through Azure Bastion, and keep virtual network appliances out of the path between the app layer and the database — Microsoft marks that unsupported because it can double latency and break Pacemaker-to-SBD heartbeats, which turns a stretchy dev box into a very confident false failover.&lt;/p&gt;

&lt;p&gt;The full walkthrough with all the pricing sources and checklists is on our site: &lt;a href="https://www.sap-ai-lab.cc/tutorials/deploy-sap-hana-on-azure/" rel="noopener noreferrer"&gt;Deploy SAP HANA on Azure: VM Sizing, Storage &amp;amp; Configuration Guide&lt;/a&gt; — including the 14-point pre-&lt;code&gt;hdblcm&lt;/code&gt; checklist and the NSG port table where HSR silently breaks (&lt;code&gt;3xx13&lt;/code&gt;, &lt;code&gt;3xx15&lt;/code&gt;, &lt;code&gt;3xx40–3xx98&lt;/code&gt;). If you're closer to the invoice than to the OS disk, the cost side of these SKUs, meter by meter, is in our &lt;a href="https://www.sap-ai-lab.cc/tutorials/rise-with-sap-cost-optimization-azure/" rel="noopener noreferrer"&gt;RISE cost breakdown&lt;/a&gt;, and the subscription layout that makes these rules enforceable is in our &lt;a href="https://www.sap-ai-lab.cc/tutorials/azure-landing-zone-sap-architecture/" rel="noopener noreferrer"&gt;Azure landing zone guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>sap</category>
      <category>devops</category>
      <category>database</category>
    </item>
  </channel>
</rss>
