https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-BTP-Kyma-runtime-blog-posts.xml SAP Community - SAP BTP, Kyma runtime 2026-02-24T06:00:25.680560+00:00 python-feedgen SAP BTP, Kyma runtime blog posts in SAP Community https://community.sap.com/t5/technology-blog-posts-by-members/sal-sap-integrity-protection-format-secured-with-distributed-ledger/ba-p/14260756 SAL: SAP 'Integrity Protection Format' secured with Distributed Ledger Technology on SAP BTP Kyma πŸš€ 2025-11-04T21:48:39.476000+01:00 AndySilvey https://community.sap.com/t5/user/viewprofilepage/user-id/1397601 <P>Did you know,</P><P>the<EM> S/4HANA SAP Audit Log (SAL)&nbsp;</EM></P><P>has a configuration,&nbsp;</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">'Integrity Protection Format',</P><P>which enables (malicious) modifications to be detected:</P><P><A href="https://me.sap.com/notes/2033317" target="_blank" rel="noopener noreferrer">2033317 - Integrity protection format for Security Audit Log - SAP for Me</A></P><P><A href="https://me.sap.com/notes/2191612#Q21" target="_blank" rel="noopener noreferrer">2191612 - FAQ | Use of Security Audit Log as of NetWeaver 7.50 - SAP for Me</A></P><P>This integrity protection is an extremely important part of your holistic Security Posture.</P><P>As&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/5736">@kevinrichardson</a>&nbsp;showed and stated in this excellent picture, '<EM><STRONG>You cannot solve today's challenges with yesterday's tools</STRONG></EM>',</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_0-1762287465475.png" style="width: 689px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/336244iE100CA597DC718D8/image-dimensions/689x374/is-moderation-mode/true?v=v2" width="689" height="374" role="button" title="AndySilvey_0-1762287465475.png" alt="AndySilvey_0-1762287465475.png" /></span><FONT size="3">(Source:&nbsp;<A href="https://assets.dm.ux.sap.com/au-sap-business-unleashed-innovation-day-melbourne/pdfs/002_rise_with_sap_kr.pdf" target="_blank" rel="noopener noreferrer">002_rise_with_sap_kr.pdf</A>)</FONT></P><P>In the ERP modernisation and transformation which is happening everywhere, there is not enough being done on Security Posture Modernisation,&nbsp;SAL: SAP 'Integrity Protection Format', is available now included in your License and enabled with a Profile Parameter, so why not to do it ?</P><P>The OSS Notes explain that, SAL: SAP 'Integrity Protection Format', works like this:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_1-1762287621076.png" style="width: 691px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/336245iB59B816D17650091/image-dimensions/691x239/is-moderation-mode/true?v=v2" width="691" height="239" role="button" title="AndySilvey_1-1762287621076.png" alt="AndySilvey_1-1762287621076.png" /></span></P><P><A href="https://me.sap.com/notes/2033317" target="_blank" rel="noopener noreferrer">2033317 - Integrity protection format for Security Audit Log - SAP for Me</A></P><P>And that's all fine, but where does the, 'Distributed Ledger Technology on SAP BTP Kyma <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span>' fit in to the equation, where's the relevance ?</P><P>Here's the answer, this Note&nbsp;<A href="https://me.sap.com/notes/2191612#Q21" target="_blank" rel="noopener noreferrer">2191612 - FAQ | Use of Security Audit Log as of NetWeaver 7.50 - SAP for Me</A>&nbsp; has a pdf attached:&nbsp;&nbsp;<EM>Explain SAL Integrity Format.pdf ,&nbsp;</EM>and the pdf goes on to explain that,</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_2-1762287797394.png" style="width: 689px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/336246i729644AA630C9586/image-dimensions/689x212/is-moderation-mode/true?v=v2" width="689" height="212" role="button" title="AndySilvey_2-1762287797394.png" alt="AndySilvey_2-1762287797394.png" /></span></P><P>'<EM>You should download the HMAC Ident as a backup, but you should save it on a secure place. The log files written with that can only be checked with that. It’s important to have this HMAC key data after a system copy or if the files should be evaluated in another system than the original. '</EM></P><P>That's where the Blockchain / Distributed Ledger Technology running on the SAP BTP Kyma comes in,</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">store the HMAC Keys in the&nbsp;Distributed Ledger Technology running on the SAP BTP Kyma</P><P>This will ensure that nobody can tamper with the keys, and therefore nobody can tamper with the SAL Audit Logs and you have the least chance of losing the keys thanks to the built in characteristics of the&nbsp;Distributed Ledger Technology running on the SAP BTP Kyma, HA&amp;DR out of the box, distributed, immutable, etc.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_5-1762288844416.png" style="width: 676px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/336249i9DF9C85AF0CB499E/image-dimensions/676x380/is-moderation-mode/true?v=v2" width="676" height="380" role="button" title="AndySilvey_5-1762288844416.png" alt="AndySilvey_5-1762288844416.png" /></span></P><P>Source:&nbsp;<A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/bcp-business-continuity-planning-for-sap-s-4hana-made-easy-with-enterprise/ba-p/13647824" target="_blank">BCP: Business Continuity Planning for SAP S/4HANA - made easy with Enterprise Blockchain <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A></P><P>Creating digital finger prints of data is going to come in to our Security Posture whether it's protecting integrity of AI LLMs or Document Grounding, Log Files, Backups and more:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_4-1762288308473.png" style="width: 686px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/336248i0BAC76B133590049/image-dimensions/686x393/is-moderation-mode/true?v=v2" width="686" height="393" role="button" title="AndySilvey_4-1762288308473.png" alt="AndySilvey_4-1762288308473.png" /></span></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-ai-security-how-to-tamperproof-ai-llm-s-with-sap-btp-kyma-and/ba-p/14099291" target="_blank">SAP AI Security - How To: Tamperproof AI LLM's with SAP BTP Kyma and Enterprise Blockchain <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A>&nbsp;</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/cyber-security-protection-for-s-4hana-backups-with-enterprise-blockchain/ba-p/13872997" target="_blank">Cyber Security Protection for S/4HANA Backups with Enterprise Blockchain and SAP BTP Kyma <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A></P><P>If you want to try it out there's a blog here,&nbsp;<A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/running-your-own-blockchain-on-the-sap-btp-kyma-trial-a-hands-on-how-to/ba-p/13724580" target="_blank">Running Your Own Blockchain on The SAP BTP Kyma Trial: A Hands On How To Guide <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A>&nbsp;</P><P>Have a think about,&nbsp;<A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-enterprise-architecture-positioning-blockchain-database-as-an/ba-p/13629842" target="_blank">SAP Enterprise Architecture: Positioning Blockchain Database as an Enterprise Technology Standard <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A>&nbsp; and then you can&nbsp;<A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-enterprise-architecture-let-the-use-case-find-the-blockchain/ba-p/13632458" target="_blank">SAP Enterprise Architecture: Let the Use Case find the Blockchain<span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A>&nbsp; by following SAP Enterprise Architecture Principles and the&nbsp;<A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/enterprise-architecture-enterprise-blockchain-platform-business-capability/ba-p/13902640" target="_blank">Enterprise Architecture: Enterprise Blockchain Platform Business Capability Map <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A></P><P>And this is why,&nbsp;<A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/why-i-love-sap-and-blockchain-databases-and-why-you-should-too/ba-p/13625869" target="_blank">Why I love SAP and Blockchain Databases and why you should too <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A></P><P>If you learn one thing from this blog, it's that you can protect the integrity of your SAL Audit Logs with SAP&nbsp;'Integrity Protection Format', and that is a cool feature.</P><P>Until next time,</P><P>Andy Silvey.</P><P>Independent <EM>SAP Technical Architect and SAP Basis SME</EM> [you might also find my SAP S/4HANA RISE &amp; BTP Toolbox interesting:&nbsp;<SPAN>&nbsp;</SPAN><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/%EF%B8%8F-the-sap-s-4hana-rise-amp-sap-btp-toolbox-%EF%B8%8F/ba-p/13944069" target="_blank">πŸ§°πŸ‘·β€ The SAP S/4HANA RISE &amp; SAP BTP - Toolbox πŸ‘·β€πŸ§°</A>] and CEO of atkrypto (.) io</P><P>Author Bio:</P><P>Andy Silvey is a 26 years SAP Technology veteran&nbsp;[26<EM>&nbsp;years SAP Basis and&nbsp; including 12 years SAP Tech Arch including Tech, Integration, Security, Data from 3.1H to S/4HANA PCE on RISE and the BTP and everything in between, and<SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/welcome-corner-blog-posts/andy-silvey-scn-moderator-spotlight/ba-p/13054438" target="_self">former SCN Moderator and Mentor alumni</A>].</EM></P><P>Andy is also co-Founder of atkrypto inc, an startup whose ambition is to make Blockchain easy for Enterprise.</P><P>atkrypto (.) io's flagship product is the atkrypto Enterprise Blockchain Platform for SAP,&nbsp; and atkrypto (.) io is a SAP Partner Edge Open EcoSystem Partner.&nbsp;</P><P>The&nbsp;atkrypto Enterprise Blockchain Platform for SAP has been designed by SAP Independent Experts for the needs of SAP Customers and to be deployed on the SAP BTP Kyma Runtime Service and leverage native integration to SAP Products.</P><P>atkrypto&nbsp;Enterprise Blockchain Platform for SAP has a number of unique qualities, including being the only Blockchain software in the world which has a DataCenter version and a light mobile version which can run on Edge/IoT/Mobile devices and enables data to be written to the Blockchain at the Edge where that same Blockchain is running on a Server in the DataCenter, protecting the integrity and originality of data from the Edge to Insights. Taking Blockchain to the Data at the Edge instead of taking the Data to the Blockchain.</P><P>&nbsp;</P> 2025-11-04T21:48:39.476000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/sap-ea-real-world-asset-tokenization-with-distributed-ledger-technology-on/ba-p/14263514 SAP EA - Real World Asset Tokenization with Distributed Ledger Technology on the SAP BTP Kyma πŸš€ 2025-11-10T06:21:30.705000+01:00 AndySilvey https://community.sap.com/t5/user/viewprofilepage/user-id/1397601 <P>I is for Innovation....&nbsp; &nbsp;EA is about... the goal of this blog is to get us thinking and talking about tokenization before the Business turn up demanding it...</P><P>I've always wished and dreamed that us SAP EA's would know our Business so well and at the same time have Road Maps for all of our Technology Standards and including Emerging Standards so that we would know what Technical Capabilities the Business requires before they even come to us with their Demand.</P><P>In reality, in my experience 9 times out 10 it's the Business who come to EA with demands for new technologies (innovations).</P><P>How do we bring in or do "Innovation" ? Ideally with Roadmaps and Emerging Technology Standards.&nbsp;</P><P>SAP's next generation Customer CoE guides&nbsp;<A href="https://support.sap.com/en/offerings-programs/ccoe/cio-customer-coe-guides.html" target="_blank" rel="noopener noreferrer">SAP Guides for Customer COE</A>&nbsp;provide thought leadership on bringing in innovations,&nbsp;<A href="https://support.sap.com/content/dam/support/en_us/library/ssp/offerings-and-programs/customer-center-of-expertise/ccoe-document-store/ccoe_strategy_framework.pdf" target="_blank" rel="noopener noreferrer">Customer Center of Expertise - Strategy, Governance and Organization</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_0-1762682779455.png" style="width: 615px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337570i27B1E817EBC24DDA/image-dimensions/615x232/is-moderation-mode/true?v=v2" width="615" height="232" role="button" title="AndySilvey_0-1762682779455.png" alt="AndySilvey_0-1762682779455.png" /></span></P><P>and&nbsp;<A href="https://support.sap.com/content/dam/support/en_us/library/ssp/offerings-and-programs/customer-center-of-expertise/media-library/general-information/continuous-improvement-and-innovation-with-a-ccoe.pdf" target="_blank" rel="noopener noreferrer">continuous-improvement-and-innovation-with-a-ccoe.pdf</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_1-1762682809277.png" style="width: 666px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337571iADBDBB14302DDC90/image-dimensions/666x164/is-moderation-mode/true?v=v2" width="666" height="164" role="button" title="AndySilvey_1-1762682809277.png" alt="AndySilvey_1-1762682809277.png" /></span><FONT size="2"><EM><A href="https://support.sap.com/en/offerings-programs/ccoe.html" target="_blank" rel="noopener noreferrer">Customer Center of Expertise</A>&nbsp; &nbsp;</EM></FONT></P><P><FONT size="2"><EM><A href="https://support.sap.com/content/dam/support/en_us/library/ssp/offerings-and-programs/customer-center-of-expertise/ccoe-document-store/ccoe_continuous_success_en.pdf" target="_blank" rel="noopener noreferrer">ccoe_continuous_success_en.pdf</A></EM></FONT></P><P>In SAP's documentation, in the North Star Architecture, in the next generation SAP CCoE,&nbsp; innovation responsibilities come in to a number of Roles</P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Innovation.png" style="width: 494px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337572i4B08DA86F99069D2/image-dimensions/494x66/is-moderation-mode/true?v=v2" width="494" height="66" role="button" title="Innovation.png" alt="Innovation.png" /></span></P><P>And combined with the Digital Innovation Manager&nbsp;<A href="https://pages.community.sap.com/topics/digital-innovation/innovation-manager" target="_blank" rel="noopener noreferrer">Digital Innovation Manager | Digital Technology and Innovation Management| SAP Community</A></P><P>And that is what this blog is about, innovation, and innovation in the area of Tokenization and RWA Real World Asset Tokenization.</P><P>There is a silent digital revolution going on, where evidence, assets, transactions are being given a digital fingerprint, a hash on a Distributed Ledger and being tokenized.</P><P>What is Tokenization and who's doing it and where is it going ?</P><P>Let's start by looking at what's happening in the space:</P><P><FONT size="2"><EM>[Disclaimer - we cannot post links outside of the Community and if you want to read these articles then just go on your favourite search engine and find them]</EM></FONT></P><P><STRONG>Pairpoint - Vodafone Sumitomo JV</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_0-1762686128517.png" style="width: 660px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337573iA002B384AABC2C17/image-dimensions/660x200/is-moderation-mode/true?v=v2" width="660" height="200" role="button" title="AndySilvey_0-1762686128517.png" alt="AndySilvey_0-1762686128517.png" /></span></P><P>&nbsp;</P><P><STRONG>World Economic Forum</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_1-1762686256814.png" style="width: 672px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337574i4A7807BA9CE2E38D/image-dimensions/672x247/is-moderation-mode/true?v=v2" width="672" height="247" role="button" title="AndySilvey_1-1762686256814.png" alt="AndySilvey_1-1762686256814.png" /></span></P><P>&nbsp;</P><P><STRONG>Fortune - Asia's quiet tokenization revolution</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_2-1762686461543.png" style="width: 664px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337575i7E66101D3ED96765/image-dimensions/664x326/is-moderation-mode/true?v=v2" width="664" height="326" role="button" title="AndySilvey_2-1762686461543.png" alt="AndySilvey_2-1762686461543.png" /></span></P><P>&nbsp;</P><P><STRONG>CNBC</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_3-1762686822450.png" style="width: 671px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337576i70B3831229B65900/image-dimensions/671x354/is-moderation-mode/true?v=v2" width="671" height="354" role="button" title="AndySilvey_3-1762686822450.png" alt="AndySilvey_3-1762686822450.png" /></span></P><P>&nbsp;</P><P><STRONG>Oracle</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_4-1762687234784.png" style="width: 664px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337577iD169BB0792B6D8FE/image-dimensions/664x312/is-moderation-mode/true?v=v2" width="664" height="312" role="button" title="AndySilvey_4-1762687234784.png" alt="AndySilvey_4-1762687234784.png" /></span></P><P>from the same article, <STRONG>this is how Oracle sees it</STRONG>:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_5-1762687423595.png" style="width: 683px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337578iCB56818D0FFD22CB/image-dimensions/683x529/is-moderation-mode/true?v=v2" width="683" height="529" role="button" title="AndySilvey_5-1762687423595.png" alt="AndySilvey_5-1762687423595.png" /></span></P><P>&nbsp;</P><P>If they all see Tokenization that way then maybe the EA innovation leads in our Organisations should be having a look at Tokenization too.</P><P>This older SAP article considered common use cases&nbsp;<A href="https://pages.community.sap.com/topics/digital-innovation/non-fungible-token-nft#nft-digital-asset-representation-on-a-blockchain" target="_blank" rel="noopener noreferrer">NFT (Non-Fungible-Tokens) | Digital Technology and Innovation Management | SAP Community</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="AndySilvey_6-1762688278702.png" style="width: 643px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/337579iEC3BBC895BC4A3CD/image-dimensions/643x336/is-moderation-mode/true?v=v2" width="643" height="336" role="button" title="AndySilvey_6-1762688278702.png" alt="AndySilvey_6-1762688278702.png" /></span></P><P>SAP has dipped their toes into the water with the SAP Green Ledger&nbsp;<A href="https://help.sap.com/docs/green-ledger/introduction/introduction" target="_blank" rel="noopener noreferrer">What Is SAP Green Ledger? | SAP Help Portal</A>&nbsp;, in my opinion the scope is too narrow,&nbsp;<A href="https://www.sap.com/assetdetail/2023/05/52ec66b4-727e-0010-bca6-c68f7e60039b.html" target="_blank" rel="noopener noreferrer">Green Ledger: Where Carbon and Financial Accounting Unite</A>&nbsp; &nbsp;<A href="https://www.sap.com/assetdetail/2024/06/428fc78f-c17e-0010-bca6-c68f7e60039b.html" target="_blank" rel="noopener noreferrer">SAP Green Ledger and an ERP-centric approach to reinvent carbon accounting</A>&nbsp; &nbsp;and Carbon Accounting is the tip of the iceberg.</P><P>Learning.sap.com has some excellent resources including videos&nbsp;<A href="https://learning.sap.com/courses/helping-business-thrive-in-a-circular-economy/blockchain-_LE_2bf04a9e-f791-493b-82e3-072718564c9e" target="_blank" rel="noopener noreferrer">Blockchain</A>&nbsp; and this incredible Blockchain course&nbsp;<A href="https://learning.sap.com/courses/what-can-blockchain-do-for-you" target="_blank" rel="noopener noreferrer">What Can Blockchain Do for You</A>&nbsp;.</P><P>Have a think about how Tokenization and Distributed Ledger Technology capabilities fit towards your Business, your Business Processes, your Business Partners.</P><P>Have a think about drawing the <A href="https://community.sap.com/t5/technology-blog-posts-by-members/enterprise-architecture-enterprise-blockchain-platform-business-capability/ba-p/13902640" target="_self">Blockchain Capability Map</A>,&nbsp; <A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-enterprise-architecture-positioning-blockchain-database-as-an/ba-p/13629842" target="_self">positioning Enterprise Blockchain as an Emerging Technology Standard</A>, and then when the Business come with the Demand... <A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-enterprise-architecture-let-the-use-case-find-the-blockchain/ba-p/13632458" target="_self">let the use-case / Demand find the Blockchain</A>, and if you want to have a play with Enterprise Blockchain on the BTP Kyma, even the BTP Trial Edition Kyma <A href="https://community.sap.com/t5/technology-blog-posts-by-members/running-your-own-blockchain-on-the-sap-btp-kyma-trial-a-hands-on-how-to/ba-p/13724580" target="_self">then just follow this blog</A> and reach out if there are any questions.</P><P>And that's the purpose of this blog, to get Tokenization onto our EA radars.</P><P>What do you think, put your thoughts in the comments.</P><P>Ultimately this is all "<A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/why-i-love-sap-and-blockchain-databases-and-why-you-should-too/ba-p/13625869" target="_blank">Why I love SAP and Blockchain Databases and why you should too <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></A>".</P><P>Andy Silvey.</P><P>Independent<SPAN>&nbsp;</SPAN><EM>SAP Technical Architect and SAP Basis SME</EM><SPAN>&nbsp;</SPAN>[you might also find my SAP S/4HANA RISE &amp; BTP Toolbox interesting:&nbsp;<SPAN>&nbsp;</SPAN><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/%EF%B8%8F-the-sap-s-4hana-rise-amp-sap-btp-toolbox-%EF%B8%8F/ba-p/13944069" target="_blank">πŸ§°πŸ‘·β€ The SAP S/4HANA RISE &amp; SAP BTP - Toolbox πŸ‘·β€πŸ§°</A>] and CEO of atkrypto (.) io</P><P>Author Bio:</P><P>Andy Silvey is a 26 years SAP Technology veteran&nbsp;[26<EM>&nbsp;years SAP Basis and&nbsp; including 12 years SAP Tech Arch including Tech, Integration, Security, Data from 3.1H to S/4HANA PCE on RISE and the BTP and everything in between, and<SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/welcome-corner-blog-posts/andy-silvey-scn-moderator-spotlight/ba-p/13054438" target="_self">former SCN Moderator and Mentor alumni</A>].</EM></P><P>Andy is also co-Founder of atkrypto inc, an startup whose ambition is to make Blockchain easy for Enterprise.</P><P>atkrypto (.) io's flagship product is the atkrypto Enterprise Blockchain Platform for SAP,&nbsp; and atkrypto (.) io is a SAP Partner Edge Open EcoSystem Partner.&nbsp;</P><P>The&nbsp;atkrypto Enterprise Blockchain Platform for SAP has been designed by SAP Independent Experts for the needs of SAP Customers and to be deployed on the SAP BTP Kyma Runtime Service and leverage native integration to SAP Products.</P><P>atkrypto&nbsp;Enterprise Blockchain Platform for SAP has a number of unique qualities, including being the only Blockchain software in the world which has a DataCenter version and a light mobile version which can run on Edge/IoT/Mobile devices and enables data to be written to the Blockchain at the Edge where that same Blockchain is running on a Server in the DataCenter, protecting the integrity and originality of data from the Edge to Insights. Taking Blockchain to the Data at the Edge instead of taking the Data to the Blockchain.</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P> 2025-11-10T06:21:30.705000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/new-kyma-telemetry-docs-simplified-task-oriented-and-user-first/ba-p/14261505 New Kyma Telemetry Docs: Simplified, Task-Oriented, and User-First 2025-11-11T05:13:44.605000+01:00 NHingerl35 https://community.sap.com/t5/user/viewprofilepage/user-id/131218 <P>We're happy to announce the release of the completely restructured and rewritten documentation for the Kyma Telemetry module! We've moved from a component-centric view to a user-first, task-oriented structure, all centered around a new, unified&nbsp;Telemetry Pipeline API.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="Telemetry Module Docs.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/336634i9190AAC42FF253EC/image-size/large?v=v2&amp;px=999" role="button" title="Telemetry Module Docs.png" alt="Telemetry Module Docs.png" /></span></P><H2 id="toc-hId-1764560176">&nbsp;</H2><H2 id="toc-hId-1568046671">What's New for Our Users?</H2><UL><LI><STRONG>The Unified Telemetry Pipeline API</STRONG><SPAN>&nbsp;</SPAN>– At the heart of the new structure is the<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/telemetry-pipeline-api?locale=en-US&amp;version=Cloud" target="_self" rel="noopener noreferrer">Telemetry Pipeline API</A>. With the introduction of OTLP-based LogPipelines, you can now use a consistent set of CRDs to configure all your telemetry signals, which reduces complexity and makes your setup easier to maintain.</LI><LI><P><STRONG>A Clearer, Task-Based Structure</STRONG><SPAN>&nbsp;</SPAN>– Find what you need faster with new top-level guides for<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/collecting-logs?locale=en-US&amp;version=Cloud" target="_self" rel="noopener noreferrer">Collecting Logs</A>,<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/collecting-traces?locale=en-US&amp;version=Cloud" target="_self" rel="noopener noreferrer">Collecting Traces</A>, and<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/collecting-metrics?locale=en-US&amp;version=Cloud" target="_self" rel="noopener noreferrer">Collecting Metrics</A>. Each guide walks you through the process for a specific signal, from minimal setup to advanced configuration</P></LI><LI><P><STRONG>A Clear Migration Path</STRONG><SPAN>&nbsp;</SPAN>– If you're still using the legacy Fluent Bit (HTTP) log output, read<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/migrate-your-logpipeline-from-http-to-otlp?locale=en-US&amp;version=Cloud" target="_self" rel="noopener noreferrer">Migrate Your LogPipeline From HTTP to OTLP</A><SPAN>, which&nbsp;</SPAN>guides you step-by-step to switch to the new OTLP setup without data loss.</P></LI></UL><H2 id="toc-hId-1371533166">The 'Why' Behind the Change: A Look at the Craft</H2><P><SPAN>If you're a fellow tech writer or just curious about the <EM>why</EM></SPAN>, this wasn't just a rewrite; it was a fundamental shift in our information architecture:</P><P>Our previous documentation was<SPAN>&nbsp;</SPAN><STRONG>component-centric</STRONG>. It described each component (Telemetry Manager, gateways, agents, pipelines...) and its internal architecture, explaining <EM>"What does the component do?"</EM>. Based on that, the reader had to figure out how to accomplish a task.</P><P>Our new approach is<SPAN>&nbsp;</SPAN><STRONG>goal-oriented</STRONG>, built on principles from the DITA (Darwin Information Typing Architecture) and industry best practices. Our guiding question is "What is the user trying to <EM>achieve</EM>?" This led us to structure the content as self-contained pages, each focusing on a user goal. For readers interested in the nitty-gritty details - you still find all of those in the consolidated <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/telemetry-architecture?version=Cloud&amp;locale=en-US" target="_self" rel="noopener noreferrer">Architecture docs</A>.</P><H2 id="toc-hId-1175019661">Why This Matters</H2><P>This new structure makes it easier to see what's common and what's different for the Telemetry pipeline types. Furthermore, we've re-centered the documentation on the actions you need to perform:</P><UL><LI><STRONG>Start with your goal:</STRONG>&nbsp;Task-oriented titles such as <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/monitor-pipeline-health?version=Cloud&amp;locale=en-US" target="_self" rel="noopener noreferrer">Monitor Pipeline Health</A> help you find what you need without knowing our internal component names.</LI><LI><STRONG>Progressive disclosure of information:</STRONG><SPAN>&nbsp;</SPAN>Get started with a minimal configuration quickly, and then explore advanced operations like filtering or processing only when you need them.</LI><LI><STRONG>Get straight to the point:</STRONG><SPAN>&nbsp;With consolidated <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/troubleshooting-for-telemetry-module?version=Cloud&amp;locale=en-US" target="_self" rel="noopener noreferrer">troubleshooting</A> instructions on the top level, you can start start fixing issues immediately&nbsp;without reading through unrelated details</SPAN>.</LI></UL><H2 id="toc-hId-978506156">Get Started Today</H2><P>We invite you to dive into the new<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/kyma-telemetry-module?locale=en-US&amp;version=Cloud" target="_self" rel="noopener noreferrer">Telemetry module documentation</A>. We're proud of this new structure and believe it's a clear step up for clarity and usability.</P><H2 id="toc-hId-781992651">Your Feedback Matters</H2><P>Whether you're a user of the module or a fellow writer, we'd love to hear your thoughts. Give us feedback directly on the SAP Help Portal pages. Your input is crucial as we continue to evolve our content.</P> 2025-11-11T05:13:44.605000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/from-open-source-to-help-portal-the-kyma-documentation-journey/ba-p/14270084 From Open Source to Help Portal: The Kyma Documentation Journey 2025-11-19T10:31:28.324000+01:00 gosia_swieca https://community.sap.com/t5/user/viewprofilepage/user-id/155979 <P><SPAN>Embarking on the journey of migrating Kyma modules documentation from open source to the SAP Help Portal was no small feat. This transition aimed to centralize and enhance the quality of documentation for external Kyma users, ensuring clarity and accessibility.</SPAN></P><H2 id="toc-hId-1765449348">Planning the Migration and Resetting Mindsets</H2><P><SPAN>The journey began with a thorough discovery phase, which included interviews with all <a href="https://community.sap.com/t5/c-khhcw49343/SAP+BTP%25252C+Kyma+runtime/pd-p/73554900100800003012" class="lia-product-mention" data-product="12-1">SAP BTP, Kyma runtime</a>&nbsp;Product Owners, Lead Architect, Product Manager, and the SAP BTP Foundation Information Architect. We focused on understanding our users and audience as well as grasping the expectations of Kyma developers. This groundwork clarified what external users needed from Kyma documentation and how those&nbsp;</SPAN><SPAN>needs differed from an open-source audience.</SPAN></P><P><SPAN>Equally important was a shift in mindset. While open-source documents seemed well-structured, they often blurred the lines between conceptual information and step-by-step procedures. </SPAN><SPAN>Moving to the Help Portal enabled&nbsp;</SPAN><SPAN>us to refine, separate, and validate content types </SPAN><SPAN>so</SPAN><SPAN> that concepts, tasks, and references were clearly distinguished.</SPAN><SPAN> This set the tone for how we would write, review, and organize topics throughout the migration.</SPAN></P><H2 id="toc-hId-1568935843">Piloting Telemetry and Establishing a Repeatable System</H2><P><SPAN>Choosing Telemetry as the pilot module was a strategic decision that provided invaluable insights. Working through this module, we developed templates and guidelines that would streamline the documentation process for all subsequent modules. </SPAN><SPAN>Telemetry underwent numerous review and improvement cycles, which helped us define a repeatable approach: </SPAN><SPAN>establishing</SPAN><SPAN> the information architecture, </SPAN><SPAN>applying</SPAN><SPAN> consistent standards, </SPAN><SPAN>iterating</SPAN><SPAN>&nbsp;on technical accuracy, and </SPAN><SPAN>polishing</SPAN><SPAN> language and structure.</SPAN></P><P><SPAN>The pilot not only produced better content for Telemetry, but also a blueprin</SPAN><SPAN>t for future success.&nbsp;</SPAN><SPAN>With templates, authoring conventions, and a clear workflow, we were equipped to scale the migration to other Kyma modules without sacrificing quality.</SPAN></P><H2 id="toc-hId-1372422338">Collaborating for Quality and Consistency</H2><P><SPAN>Quality was a shared responsibility. Throughout the migration, we participated in Quality Review Sessions within the BTPX Foundation unit. These sessions provided structured feedback from colleagues outside of Kyma, helping us spot gaps, eliminate ambiguity, and align with SAP Help Portal standards. The cross-team collaboration ensured consistency in style, terminology, and organization across modules, and it accelerated decision-making on tricky or nuanced topics.</SPAN></P><H2 id="toc-hId-1175908833">Results, Impact, and the Road Ahead</H2><P><SPAN>The migration covered 10 Kyma modules over approximately 22 months of non-continuous work, and engaged 5 UA developers. The outcome was about 120 Help Portal topics, each crafted to serve external users with clear conceptual explanations, actionable procedures, and reliable references. </SPAN><SPAN>Centralizing SAP BTP</SPAN><SPAN>, </SPAN><SPAN>Kyma runtime documentation in the Help Portal </SPAN><SPAN>provides</SPAN><SPAN> users with a cohesive, comprehensive resource that’s easier to discover, navigate, and trust.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2025-11-18 at 12.30.18.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342233i61566B9B133310DC/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Screenshot 2025-11-18 at 12.30.18.png" alt="Screenshot 2025-11-18 at 12.30.18.png" /></span></SPAN></P><P><SPAN>This journey was not just about moving conten</SPAN><SPAN>t. I</SPAN><SPAN>t was about elevating the user experience - clarifying what users should understand, guiding </SPAN><SPAN>them on what they should</SPAN><SPAN>&nbsp;do, and ensuring the documentation remains a reliable and valuable resource for all. The foundations we built - clear content types, repeatable processes, and cross-team quality practices - position Kyma documentation for ongoing improvement and scalability.</SPAN></P><P><SPAN>Enjoy reading about &nbsp;<A href="https://help.sap.com/docs/btp/sap-business-technology-platform/kyma-modules-db6b63f8a36543d985dd0dfa641273bb?version=Cloud" target="_blank" rel="noopener noreferrer">Kyma Modules</A>:</SPAN></P><UL><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/istio-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>Istio Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/api-gateway-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>API Gateway Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/sap-btp-operator-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>SAP BTP Operator Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/cloud-manager-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>Cloud Manager Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/application-connector-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>Application Connector Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/eventing-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>Eventing Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/keda-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>Keda Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/nats-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>NATS Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/serverless-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>Serverless Module</SPAN></A></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/kyma-telemetry-module?version=Cloud" target="_self" rel="noopener noreferrer"><SPAN>Telemetry Module</SPAN></A></LI></UL><P>Whether you're using the modules or contributing as an author, we welcome your thoughts. Leave your feedback on the SAP Help Portal pages. Your input is key to how we enhance our content.</P> 2025-11-19T10:31:28.324000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570 Authorization management with OpenSearch's Document Level Security - SAP Cloud Logging 2025-11-24T23:51:25.092000+01:00 Hariharan-Gandhi https://community.sap.com/t5/user/viewprofilepage/user-id/1468554 <P><SPAN>The shift to <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Cloud+Logging+service/pd-p/677561eb-932b-4fd7-b107-52aa39f47dc8" class="lia-product-mention" data-product="1251-1">SAP Cloud Logging service</a>&nbsp;introduces <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/from-application-logging-to-cloud-logging-service-innovation-guide/ba-p/13938380" target="_self">several improvements over its predecessor</A>, the SAP Application Logging service (Cloud Foundry). One major benefit is the ability to use <STRONG>a single Cloud Logging instance across multiple CF spaces and even multiple CF orgs/subaccounts.&nbsp;</STRONG>(For more details, see the blog post <I><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/instance-sharing-sap-cloud-logging/ba-p/14179941" target="_blank">Instance Sharing – SAP Cloud Logging.)</A></I></SPAN></P><P><SPAN>However, the <STRONG>authorization model </STRONG>is different fromSAP Application Logging service (Cloud Foundry). Application Logging supported only read-only access and implicitly reused CF space permissions. &nbsp;</SPAN></P><P><SPAN>Cloud Logging, on the other hand:</SPAN></P><UL><LI>Supports read/write use cases</LI><LI>Allows creating custom content</LI><LI>Enables centralization and sharing</LI></UL><P>In order to support such extended scenarios, Cloud Logging integrates with&nbsp;<STRONG><A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/what-is-identity-authentication?version=Cloud" target="_self" rel="noopener noreferrer">SAP Cloud Identity Services - Identity Authentication (IAS)</A>&nbsp;</STRONG>for flexible authentication and authorization.</P><P><SPAN>This document guides on how to leverage <STRONG><A href="https://docs.opensearch.org/2.19/security/access-control/document-level-security/" target="_self" rel="nofollow noopener noreferrer">Document Level Security (DLS)</A> in OpenSearch Roles (+) <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/user-groups?version=Cloud" target="_blank" rel="noopener noreferrer">IAS Groups</A></STRONG> to setup flexible authorization. It explains using few common use cases including the prominent one - replicating the familiar space-level separation, based on&nbsp;user's CF Space assignment, within a unified logging instance.</SPAN></P><P><ul =""><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-1764619970">OpenSearch Security Model Overview</a></li><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-1568106465">Index-Level vs. Document-Level Security</a></li><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-1371592960">The DLS Strategy: Restricting Views by Space ID</a></li><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-1175079455">Use Case 1: Fixed Authorization for Specific Spaces (Space-A and Space-B)</a></li><li style="list-style-type:square; margin-left:40px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-1107648669">Step 1:Create IAS Groups (Backend Roles)</a></li><li style="list-style-type:square; margin-left:40px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-911135164">Step 2: Define OpenSearch Roles</a></li><li style="list-style-type:square; margin-left:40px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-714621659">Step 3: Map Backend Roles to OpenSearch Roles</a></li><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-389025435">Use Case 2: Multi-Space Access for Shared Teams (e.g., Finance)</a></li><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId-192511930">Use Case 3: Using Other Fields</a></li><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId--4001575">Use Case 4: Parameter Substitution for Dynamic Authorization</a></li><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId--49774228">High-Level Overview: IAS Group Mapping and Space-Based Access Control in OpenSearch</a></li><li style="list-style-type:square; margin-left:20px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId--246287733">Important Considerations (DLS Best Practices)</a></li><li style="list-style-type:square; margin-left:60px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId--1029607252">1. Avoid Wildcard Index Match (*) :</a></li><li style="list-style-type:square; margin-left:60px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId--1226120757">2. DLS and Write Permissions:</a></li><li style="list-style-type:square; margin-left:60px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId--1422634262">3. Admin Roles Combined with DLS Roles</a></li><li style="list-style-type:square; margin-left:60px; margin-bottom:1px;"><a href="https://community.sap.com/t5/technology-blog-posts-by-sap/authorization-management-with-opensearch-s-document-level-security-sap/ba-p/14263570#toc-hId--1815661272">4. DLS Query Syntax: Precision is Key</a></li></ul></P><HR /><H2 id="toc-hId-1764619970"><SPAN>OpenSearch Security Model Overview</SPAN></H2><P><SPAN>OpenSearch's security model provides the foundation for integrating with external Identity Providers (IdPs) like SAP IAS:</SPAN></P><TABLE border="1" width="100%"><TBODY><TR><TD width="33.333333333333336%" height="25px"><STRONG>Component</STRONG></TD><TD width="33.333333333333336%" height="25px"><STRONG>Definition</STRONG></TD><TD width="33.333333333333336%" height="25px"><STRONG>Integration</STRONG></TD></TR><TR><TD width="33.333333333333336%" height="57px"><STRONG>Users</STRONG></TD><TD width="33.333333333333336%" height="57px"><SPAN>Individual accounts accessing OpenSearch.</SPAN></TD><TD width="33.333333333333336%" height="57px"><SPAN>Authenticated via SAP IAS.</SPAN></TD></TR><TR><TD width="33.333333333333336%" height="152px"><STRONG>OpenSearch Roles</STRONG></TD><TD width="33.333333333333336%" height="152px"><P><SPAN>Collections of permissions (read, write, manage) and security filters (DLS).</SPAN></P><P><SPAN>Cloud Logging ships with default roles, and customers may create additional ones.</SPAN></P></TD><TD width="33.333333333333336%" height="152px">The mechanism for authorization.</TD></TR><TR><TD width="33.333333333333336%" height="85px"><STRONG>Backend Roles</STRONG></TD><TD width="33.333333333333336%" height="85px"><SPAN>Groups or roles assigned to the user within the SAML/OIDC Identity Provider β€” in this case SAP IAS Group names.</SPAN></TD><TD width="33.333333333333336%" height="85px">The bridge between SAP IAS and OpenSearch Roles.</TD></TR><TR><TD width="33.333333333333336%" height="57px"><STRONG>Roles Mapping</STRONG></TD><TD width="33.333333333333336%" height="57px"><SPAN>The link that connects </SPAN><STRONG>IAS groups (backend roles) </STRONG>to<STRONG>&nbsp;OpenSearch roles.</STRONG></TD><TD width="33.333333333333336%" height="57px">&nbsp;How users inherit OpenSearch permissions.</TD></TR></TBODY></TABLE><P><SPAN><STRONG>Note:</STRONG>&nbsp;</SPAN></P><P><SPAN>Since IAS groups are customer-defined, Cloud Logging can only pre-map the IAS group that should serve as <STRONG>instance admin to OpenSearch’s <CODE>all_access role</CODE>. </STRONG>All other mappings must be configured by the customer.</SPAN></P><H2 id="toc-hId-1568106465"><SPAN>Index-Level vs. Document-Level Security</SPAN></H2><UL><LI><P><STRONG>Index-Level Security </STRONG>controls <I>which indices a user can access.</I></P></LI><LI><STRONG>Document-Level Security (DLS) </STRONG>controls <I>which documents inside an index a user can access.</I></LI></UL><P><SPAN>To restrict users to logs from a specific CF space, you apply <STRONG>DLS.</STRONG></SPAN></P><H2 id="toc-hId-1371592960"><SPAN>The DLS Strategy: Restricting Views by Space ID</SPAN></H2><P><SPAN>To achieve security separation, every log document must contain a field that identifies its CF source. We assume this field is named <STRONG><CODE>space_name</CODE>&nbsp;</STRONG>(mapped as&nbsp;<CODE>space_name.keyword</CODE>&nbsp;in OpenSearch).</SPAN></P><P><SPAN>DLS works by appending a mandatory filterβ€”an OpenSearch Query DSL statementβ€”to every search request made by a user assigned to the role. This filter ensures the user only retrieves documents where the <CODE>space_name.keyword</CODE>&nbsp;matches their authorized space(s).</SPAN></P><H2 id="toc-hId-1175079455"><SPAN>Use Case 1: Fixed Authorization for Specific Spaces (Space-A and Space-B)</SPAN></H2><P><SPAN>When you have a small number of distinct spaces (e.g., <CODE>space-A and space-B</CODE>), and each requires a dedicated authorization group, you create a static OpenSearch Role for each.</SPAN></P><H3 id="toc-hId-1107648669"><SPAN>Step 1:&nbsp;Create IAS Groups (Backend Roles)</SPAN></H3><UL><LI><CODE>space-A-read-only</CODE></LI><LI><CODE>space-B-read-only</CODE></LI></UL><H3 id="toc-hId-911135164"><SPAN>Step 2: Define OpenSearch Roles</SPAN></H3><P><SPAN>We will define two roles, each allowing read-only access to log indices but restricted by DLS.</SPAN></P><P><SPAN><STRONG>A. Role for Space-A (<CODE>role-space-A-read-only)</CODE></STRONG></SPAN></P><OL><LI><P><STRONG>Navigate to OpenSearch Dashboards &gt; Security &gt; Roles.</STRONG></P></LI><LI>Clone the default <CODE>readall</CODE>&nbsp;role and name it <STRONG><CODE>role-space-A-read-only.</CODE></STRONG></LI><LI><STRONG>Cluster permissions: <CODE>cluster_composite_ops_ro</CODE></STRONG></LI><LI><STRONG>Index Permissions:</STRONG></LI><UL><LI><P><STRONG>Index Pattern: <CODE>logs-*</CODE></STRONG>(Specify a pattern like this instead of only specifying an asterisk <STRONG><CODE>*</CODE></STRONG>&nbsp;to avoid applying DLS to system indices).</P></LI><LI><STRONG>Index Permissions: Select <CODE>read</CODE></STRONG></LI><LI><STRONG>Document Level Security: </STRONG>Enter the DLS query for the specific space:&nbsp;</LI></UL></OL><pre class="lia-code-sample language-json"><code>{ "term": { "space_name.keyword": "space-A" } }​</code></pre><P><SPAN><STRONG>B. Role for Space-B (<CODE>role-space-B-read-only)</CODE></STRONG></SPAN></P><P><SPAN>Repeat the above steps for <CODE>role-space-B-read-only</CODE>, changing the value in the DLS query to <CODE>"space-B"</CODE>.</SPAN></P><H3 id="toc-hId-714621659"><SPAN>Step 3: Map Backend Roles to OpenSearch Roles</SPAN></H3><P><SPAN>This step links the SAP IAS groups to the newly created security filters.</SPAN></P><OL><LI><P><STRONG>Navigate to OpenSearch Dashboards &gt; Security &gt; Roles.</STRONG></P></LI><LI><P>Select <STRONG><CODE>role-space-A-read-only.</CODE></STRONG></P></LI><LI><P>Click the <STRONG>Mapped Users tab and then Manage Mapping.</STRONG></P></LI><LI><P>Under <STRONG>Backend roles, add the SAP IAS group name: <CODE>space-A-read-only.</CODE></STRONG></P></LI></OL><P><SPAN>Repeat this process for <CODE>role-space-B-read-only</CODE>, mapping it to the <CODE>space-B-read-only</CODE>&nbsp;backend role.</SPAN></P><P><SPAN><STRONG>Crucial Note on Dashboards Access: </STRONG>You must also map these new Backend Roles <STRONG>(<CODE>space-A-read-only, space-B-read-only)</CODE></STRONG>to the OpenSearch role <STRONG><CODE>global_tenant_read_access</CODE></STRONG>&nbsp;to allow users to see and use shared dashboards and visualizations.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HariharanGandhi_0-1763433092786.png" style="width: 822px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342049i81A64358D8AE927A/image-dimensions/822x998/is-moderation-mode/true?v=v2" width="822" height="998" role="button" title="HariharanGandhi_0-1763433092786.png" alt="HariharanGandhi_0-1763433092786.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HariharanGandhi_1-1763433164910.png" style="width: 840px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342050iCE4C1BA5FB419DF3/image-dimensions/840x536/is-moderation-mode/true?v=v2" width="840" height="536" role="button" title="HariharanGandhi_1-1763433164910.png" alt="HariharanGandhi_1-1763433164910.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HariharanGandhi_2-1763433204821.png" style="width: 859px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342051iA8E3ED858E09420F/image-dimensions/859x492/is-moderation-mode/true?v=v2" width="859" height="492" role="button" title="HariharanGandhi_2-1763433204821.png" alt="HariharanGandhi_2-1763433204821.png" /></span></P><H2 id="toc-hId-389025435"><SPAN>Use Case 2: Multi-Space Access for Shared Teams (e.g., Finance)</SPAN></H2><P><SPAN>If you need to define a single role for a department (e.g., Finance) that needs access to a specific <I>list of CF spaces (<CODE>space-A, space-C, space-D)</CODE></I>, you can use <I><CODE>terms</CODE></I>&nbsp;query to add multiple values.</SPAN></P><P><SPAN><STRONG>UI Steps for a <CODE>finance_spaces_read_only Role:</CODE></STRONG></SPAN></P><OL><LI><P>Clone the default OpenSearch Role <CODE>readall</CODE>&nbsp;and name it&nbsp;<CODE>finance_spaces_read_only</CODE>.</P></LI><LI>Set the Index Pattern and Permissions&nbsp;as explained in Use Case 1.</LI><LI><STRONG>Document Level Security: Enter the <CODE>terms</CODE></STRONG> query to include all required spaces:&nbsp;</LI></OL><pre class="lia-code-sample language-json"><code>{ "terms": { "space_name.keyword": [ "space-A", "space-C", "space-D" ] } }</code></pre><P><SPAN>Map this role to the relevant SAP IAS group (e.g., </SPAN><CODE>finance_spaces_read_only</CODE>) as explained in Use Case 1.</P><H2 id="toc-hId-192511930"><SPAN>Use Case 3: Using Other Fields</SPAN></H2><P><SPAN>The same DLS concepts apply to:</SPAN></P><UL><LI><P><CODE>organization_id</CODE></P></LI><LI><DIV><CODE>organization_name</CODE></DIV></LI><LI><CODE>app_name</CODE></LI></UL><P><SPAN>You can restrict access on any&nbsp;well-defined keyword field stored in your logs.&nbsp;</SPAN></P><H2 id="toc-hId--4001575"><SPAN>Use Case 4: Parameter Substitution for Dynamic Authorization</SPAN></H2><P><SPAN>For maximum scalability, instead of creating one OpenSearch role per space, you can create a single role that dynamically substitutes the user’s backend roles into the DLS query.</SPAN></P><P><SPAN>This works when IAS group names match the field values β€” for example:</SPAN></P><UL><LI><DIV><SPAN>finance_space_prod</SPAN></DIV></LI><LI><DIV><CODE>finance_space_staging</CODE></DIV></LI><LI><CODE>finance_space_dev</CODE></LI></UL><P><SPAN>In OpenSearch, the variable <CODE>${user.roles}</CODE>&nbsp;references the list of backend roles (IAS groups) assigned to the user.</SPAN></P><P><SPAN><STRONG>UI Steps for a Dynamic Role:</STRONG></SPAN></P><OL><LI><P>Create a single OpenSearch Role (e.g., <CODE>dynamic_space_member).</CODE></P></LI><LI><P>Set the Index Pattern and Permissions as before.</P></LI><LI><P><STRONG>Document Level Security: Use the <CODE>${user.roles}</CODE></STRONG>&nbsp;substitution variable in a terms query:&nbsp;</P></LI></OL><pre class="lia-code-sample language-json"><code>{ "terms": { "space_name.keyword": [ ${user.roles} ] } }</code></pre><P><SPAN>Result: When a user logs in, if they are assigned to the IAS groups <STRONG><I><CODE>finance_space_staging</CODE></I></STRONG>&nbsp;and <STRONG><I><CODE>finance_space_dev</CODE></I></STRONG>, the DLS query automatically evaluated to&nbsp;<STRONG><I><CODE>"terms": { "space_name.keyword": ["finance_space_staging", "finance_space_dev"] }</CODE></I></STRONG><I>.&nbsp;</I>The user is only shown logs where <STRONG><I><CODE>space_name</CODE></I></STRONG>&nbsp;exactly matches one of their assigned IAS groups.</SPAN></P><P>Map this role to a general backend role pattern (e.g., <CODE>finance_space*</CODE>) to cover all relevant IAS groups.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HariharanGandhi_3-1763433288173.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342052iD770C1752D8D924A/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="HariharanGandhi_3-1763433288173.png" alt="HariharanGandhi_3-1763433288173.png" /></span></P><H2 id="toc-hId-146739277">&nbsp;</H2><HR /><H2 id="toc-hId--49774228">High-Level Overview: IAS Group Mapping and Space-Based Access Control in OpenSearch</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="DLS.drawio.svg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/344589i1A75352708F7197C/image-size/large?v=v2&amp;px=999" role="button" title="DLS.drawio.svg" alt="DLS.drawio.svg" /></span></P><HR /><H2 id="toc-hId--246287733">Important Considerations (DLS Best Practices)</H2><H4 id="toc-hId--1029607252"><STRONG>1. Avoid Wildcard Index Match (<CODE>*</CODE>) :</STRONG></H4><P>Avoid using a plain wildcard (<CODE>*</CODE>) for index patterns in your DLS roles. This includes system indices (like <CODE>.kibana</CODE>), which can break Dashboards functionality when DLS is applied. Always use a targeted pattern like <CODE>logs-*, otel-*</CODE></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="HariharanGandhi_4-1763433314359.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342054i384D03EFAF6B767E/image-size/large?v=v2&amp;px=999" role="button" title="HariharanGandhi_4-1763433314359.png" alt="HariharanGandhi_4-1763433314359.png" /></span></P><H4 id="toc-hId--1226120757"><STRONG>2. DLS and Write Permissions:</STRONG></H4><P>A user with a DLS-configured role <STRONG>must not</STRONG> be granted <CODE>write</CODE> permissions. If they index a document they cannot retrieve (due to DLS filtering), it creates invisible data they cannot manage. DLS is intended for read-only access control.</P><H4 id="toc-hId--1422634262">3. Admin Roles Combined with DLS Roles</H4><P>When a user with multiple roles (usually Admins) logs in, OpenSearch combines DLS rules from multiple roles using a logical <STRONG><CODE>OR</CODE></STRONG>. However if a restricted<STRONG> role with DLS</STRONG> is combined with a <STRONG>role with empty DLS</STRONG>, the unrestricted role <STRONG><EM>will not</EM></STRONG> override the DLS rule, and access remains restricted according to role with DLS.</P><P>This is the secure, expected behaviour:</P><UL><LI><P>Admin role: empty DLS</P></LI><LI>Restricted role: with a restricted DLS</LI><LI>Combined: restricted&nbsp;<SPAN>role takes precedence</SPAN> (since empty DLS does NOT override a restrictive one)</LI></UL><P>Background: The admin role has an "empty" DLS configuration which by default does not override a restrictive one. In Cloud Logging,&nbsp;<CODE>plugins.security.dfm_empty_overrides_all</CODE> <STRONG>is disabled</STRONG>, so empty DLS doesn’t override.</P><H5 id="toc-hId--1912550774"><STRONG>Workaround to Give Admins Full Access</STRONG></H5><OL><LI><P>Duplicate the <CODE>all_access</CODE> role β†’ <CODE>all_access_advanced</CODE></P></LI><LI>Change index pattern: from <CODE>*</CODE>&nbsp;to a targeted pattern like&nbsp;<CODE>logs-*</CODE></LI><LI>Add a match-all DLS:&nbsp;&nbsp;<CODE>{"match_all":{}}</CODE></LI><LI>Ensure admin backend role is mapped to this new role.</LI></OL><H4 id="toc-hId--1815661272">4. DLS Query Syntax: Precision is Key</H4><P>For security and performance, use DLS filters with&nbsp;<CODE>term</CODE> query on a <CODE>.keyword</CODE> field.</P><pre class="lia-code-sample language-json"><code># Option 1: works but has limitations { "bool": { "must": { "match": { "space_name.keyword": "space-name-A" } } } } vs. # Option 2: preferred { β€― "term": { β€―β€―β€― "space_name.keyword": "space-name-A" β€― } } </code></pre><UL><LI><SPAN class=""><SPAN class="">Although <CODE>match</CODE>&nbsp;</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>(combined with <CODE>.keyword</CODE>)<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">work</SPAN><SPAN class="">s</SPAN><SPAN class="">, it triggers analyzers and scoring logic. </SPAN></SPAN></LI><LI><SPAN class=""><SPAN class="">Furthermore, it is not guaranteed to remain exact under future mapping or<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">analyzer changes which<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">are</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>risky when<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">used</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>for authorization.</SPAN></SPAN></LI><LI><SPAN class=""><SPAN class=""><CODE>term</CODE> is faster, safer, and the only deterministic<SPAN>&nbsp;</SPAN></SPAN><SPAN class="">option</SPAN><SPAN class=""><SPAN>&nbsp;</SPAN>for Lucene-level DLS.</SPAN></SPAN></LI></UL><H5 id="toc-hId-1989389512"><SPAN>Term Look&nbsp;up:</SPAN><SPAN>&nbsp;</SPAN></H5><P><SPAN>If you use&nbsp;</SPAN><A href="https://docs.opensearch.org/2.19/query-dsl/term/terms/#terms-lookup" target="_blank" rel="noopener nofollow noreferrer"><SPAN>term lookup queries</SPAN></A><SPAN>&nbsp;(not the simple Term query)&nbsp;or other&nbsp;constructs, DLS falls back to&nbsp;</SPAN><SPAN>Filter-level DLS</SPAN><SPAN>&nbsp;instead of the most efficient&nbsp;</SPAN><SPAN>Lucene-level DLS&nbsp;</SPAN><SPAN>which&nbsp;might have to be considered when filtering on large data&nbsp;sets.</SPAN><SPAN>&nbsp;(read more on <A href="https://docs.opensearch.org/2.19/security/access-control/document-level-security/#dls-evaluation-modes" target="_blank" rel="noopener nofollow noreferrer">DLS evaluation modes</A>).</SPAN></P><P><span class="lia-unicode-emoji" title=":end_arrow:">πŸ”š</span></P><P><SPAN>Official OpenSearch DLS documentation:&nbsp;</SPAN><SPAN><A href="https://docs.opensearch.org/2.19/security/access-control/document-level-security/" target="_blank" rel="noopener nofollow noreferrer">https://docs.opensearch.org/2.19/security/access-control/document-level-security/</A>&nbsp;</SPAN></P> 2025-11-24T23:51:25.092000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/event-driven-sap-cap-on-kyma-with-agentic-ai-and-ui-auto-refresh/ba-p/14280626 Event Driven SAP CAP on Kyma with Agentic AI and UI Auto Refresh 2025-12-01T05:11:39.765000+01:00 Shahid https://community.sap.com/t5/user/viewprofilepage/user-id/15422 <P><U><STRONG>Introduction:</STRONG></U><BR />This prototype demonstrates how a simple CAP application can evolve into an event-driven architecture enriched with autonomous agentic AI. The objective was to show how CAP can react to external events in real time, refresh the UI automatically, and trigger an AI workflow that identifies duplicate citizens without any user action. The solution combines Kyma, SAP CAP, SAP HANA Cloud DB, SAP Integration Suite, a Python agent/Open AI, all running together.</P><P><U><STRONG>Demo:</STRONG></U><BR /><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FNz1C5A_ViTY%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DNz1C5A_ViTY&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FNz1C5A_ViTY%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="200" height="113" scrolling="no" title="Event Driven SAP CAP on Kyma with Agentic AI and UI Auto Refresh" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P><U><STRONG>End-to-End Flow:</STRONG></U><BR />This application is built around a simple idea: when a citizen is created in the system, everything should react automatically.</P><P>The process starts in SAP Integration Suite. This is the continuation of the last <A title="Event Driven Integration Using SAP Integration Suite, Solace, HANA DB, and OpenAI Validation" href="https://community.sap.com/t5/technology-blog-posts-by-sap/event-driven-integration-using-sap-integration-suite-solace-hana-db-and/ba-p/14273167" target="_blank">Blog Post</A>&nbsp;. The iFlow inserts the new citizen into HANA Cloud and then calls CAP’s notify endpoint with a simple JSON payload. This notify call is the explicit trigger, because CAP does not detect database changes on its own. Once CAP receives the notification, it broadcasts the event through its citizen stream endpoint using Server-Sent Events.</P><P>The UI and the Python agent are both listening to this stream. When they receive the event, each reacts independently. The UI refreshes its Fiori Elements binding and displays the new record. The agent retrieves the citizen through CAP OData, performs duplicate detection, prompts Open AI, and writes its suggestions back through CAP. CAP exposes the suggestions via virtual enrichment fields so that the UI automatically displays AI insights during the next read.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="diagram.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346814iBD6E8476FC0B9A70/image-size/large?v=v2&amp;px=999" role="button" title="diagram.jpg" alt="diagram.jpg" /></span></P><P>&nbsp;</P><P><U>iFlow Changes:</U></P><P><U><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cpi.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346817i5075F9C5D7EE783D/image-size/large?v=v2&amp;px=999" role="button" title="cpi.jpg" alt="cpi.jpg" /></span></U></P><P><U><STRONG>Code:</STRONG></U></P><P>GitHub: User - shahidla. Repository - citizen-master-cap-docker</P><P><U><STRONG>Agentic AI:</STRONG></U><BR />The agent is packaged as a Python container running in Kyma. It listens continuously to the citizen stream. When it receives a CitizenCreated event it reads the citizen through OData, prompts Open AI with a structured tool-based instruction set and follows the returned JSON. Open AI selects the next actions such as fetching the citizen again, running a duplicate search or writing the final suggestion.</P><P>To make the AI transparent, a thinking log table records each step in the agent run including search inputs, candidate lists, scores and final reasoning. Users can view not only the AI result but also how the agent reached that conclusion. This makes the system trustworthy and audit friendly rather than a black box.</P><P><U><STRONG>Execution results:</STRONG></U></P><P>AI Agent Thinking Logs:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ai.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/346818i8AD12645DE7E5F35/image-size/large?v=v2&amp;px=999" role="button" title="ai.jpg" alt="ai.jpg" /></span></P><P><U><STRONG>Conclusion:</STRONG></U><BR />This prototype shows that a CAP application can be extended into a fully event driven and agentic AI and can all run together inside Kyma without additional infrastructure The result is a responsive and intelligent application that reacts to new information immediately and explains every decision it makes.</P><P><U><STRONG>Disclaimer:</STRONG></U><BR />This prototype intended for learning and demonstration. It is not production grade and does not include full durability. AI reasoning results should be validated and not used for decisions without proper governance. <SPAN>A real solution would require reviewing security, performance, and data privacy aspects. Terminology may have been used freely as part of experimentation.</SPAN></P> 2025-12-01T05:11:39.765000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/streamlined-kyma-deployment-for-cap-applications/ba-p/14284687 Streamlined Kyma deployment for CAP applications 2025-12-08T05:32:49.745000+01:00 rupamaity https://community.sap.com/t5/user/viewprofilepage/user-id/9300 <P>SAP BTP, Kyma runtime (a fully managed cloud-native Kubernetes application runtime based on the open-source "Kyma<SPAN>" project</SPAN>) enables developers to deploy highly scalable, modular, and secure microservices. The SAP Cloud Application Programming (CAP) model supports Kyma deployments as one of the recommended approaches in the <A href="https://help.sap.com/docs/btp/btp-developers-guide/cloud-application-programming-model?locale=en-US" target="_blank" rel="noopener noreferrer">SAP BTP Developer’s Guide </A></P><P><STRONG>What’s New</STRONG></P><P>In the November release of CAP, we have introduced several key improvements that significantly simplify the deployment of CAP applications to Kyma.</P><P>Here is a quick look at the changes:</P><OL><LI><STRONG>Streamlined project</STRONG><STRONG> setup</STRONG>: The new <EM>cds add kyma</EM> command quickly configures your Kyma project and serves as the central entry point for configuring deployments to Kyma.</LI><LI><STRONG>Interactive credential handling</STRONG>: When using <EM>cds up -2 k8s</EM>, you’ll receive prompts for any missing registry credentials on your Kyma cluster, eliminating guesswork during deployment.</LI><LI><STRONG>Automatic UI5 build</STRONG>: The <EM>cds up -2 k8s</EM> command now automatically builds your SAP UI5 applications, removing an extra manual step from your workflow.</LI><LI><STRONG>Intelligent build optimization</STRONG>: Builds now trigger only when artifact changes are detected, eliminating unnecessary build cycles and notably speeding up your deployment process.</LI><LI><STRONG>Simplified tooling</STRONG>: The standalone containerize tool (also known as ctz) is no longer required. The <EM>cds up -2 k8s</EM> command handles containerization directly reducing external dependencies</LI></OL><P class="">Ready to try it out? Make sure to have the latest cli version with npm i -g <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1862993">@Pa_Vi</a>/cds-dk@latest, also check out the <A href="https://cap.cloud.sap/docs/guides/deployment/to-kyma#deploy-to-kyma" target="_blank" rel="noopener nofollow noreferrer"><SPAN class="">updated documentation</SPAN></A>&nbsp; and our <A href="https://cap.cloud.sap/docs/releases/nov25" target="_blank" rel="noopener nofollow noreferrer"><SPAN class="">release notes</SPAN></A> for complete details on these improvements.</P><P class="">As always, if you have any questions, do not hesitate to reach out to us on <A href="mailto:cap@sap.com" target="_blank" rel="noopener nofollow noreferrer"><SPAN class="">cap@sap.com</SPAN></A> &nbsp;</P><P>&nbsp;</P> 2025-12-08T05:32:49.745000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/ho-ho-ho-a-christmas-present-from-sap-job-scheduling-service-free-plan-on/ba-p/14292434 πŸŽ„ Ho Ho Ho! A Christmas Present from SAP Job Scheduling Service: Free Plan on BTP Trial 🎁 2025-12-17T14:00:31.636000+01:00 DenisDuev https://community.sap.com/t5/user/viewprofilepage/user-id/180332 <P><SPAN>The holiday season brings joy, festivities, and... a brand new&nbsp;</SPAN><STRONG>Free service plan</STRONG><SPAN>&nbsp;for <A title="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/what-is-sap-job-scheduling-service?version=Cloud" href="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/what-is-sap-job-scheduling-service?version=Cloud" target="_blank" rel="noopener noreferrer">SAP Job Scheduling Service</A> on BTP Trial! <span class="lia-unicode-emoji" title=":santa_claus:">πŸŽ…</span></SPAN></P><P>Starting now, you can unwrap the power of automated job scheduling without any cost constraints during your trial period. Just like Santa's workshop needs schedules to deliver presents on time, your applications can now schedule tasks with our new Free plan!</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="hero-image.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/353139i5954C99A4AE22BC1/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="hero-image.png" alt="hero-image.png" /></span></P><DIV class=""><H2 id="toc-hId-1767359661"><span class="lia-unicode-emoji" title=":wrapped_gift:">🎁</span>What's Under the Tree?</H2></DIV><P>The<SPAN>&nbsp;</SPAN><STRONG>Free plan</STRONG><SPAN>&nbsp;</SPAN>gives you access to the same powerful scheduling capabilities as the Standard plan, with some carefully chosen limitations perfect for learning, prototyping, and small-scale projects:</P><DIV class=""><H3 id="toc-hId-1699928875"><span class="lia-unicode-emoji" title=":clipboard:">πŸ“‹</span>Plan Details</H3></DIV><P><STRONG>Technical name:</STRONG><SPAN>&nbsp;</SPAN><CODE>free</CODE><BR /><STRONG>Display name:</STRONG><SPAN>&nbsp;</SPAN>Free</P><P><STRONG>Capabilities:</STRONG></P><UL><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span>Schedule one-time and recurring jobs</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span>Schedule synchronous and asynchronous jobs</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span>Execute Cloud Foundry tasks</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span>Integration with SAP Alert Notification service for SAP BTP</LI></UL><P><STRONG>Important Note:</STRONG><SPAN>&nbsp;</SPAN><span class="lia-unicode-emoji" title=":warning:">⚠️</span><BR />Only community support is available for free service plans, and these are not subject to SLAs. Use of free tier service plans is subject to additional terms and conditions as provided in the<SPAN>&nbsp;</SPAN><A href="https://www.sap.com/about/trust-center/agreements/cloud/cloud-services.html" target="_blank" rel="noopener noreferrer">Business Technology Platform Supplemental Terms and Conditions</A>.</P><DIV class=""><H2 id="toc-hId-1374332651"><span class="lia-unicode-emoji" title=":thinking_face:">πŸ€”</span>Why Free? Why not using Lite plan?</H2></DIV><P>Lite plan has many restrictions and works way different than what we have as standard plan. In order to provide better experience to our users we have created free plan which is more aligned with standard plan. What this mean is that we will deprecate lite plan in near future and remove it from BTP Trial.</P><P>The good news - you can expect Free plan to also be available for BTP Live in near future!</P><DIV class=""><H2 id="toc-hId-1177819146"><span class="lia-unicode-emoji" title=":santa_claus:">πŸŽ…</span>Technical Features: What's in Your Stocking?</H2></DIV><P>Here's what Santa has packed in the Free plan:</P><DIV class=""><H3 id="toc-hId-1110388360"><span class="lia-unicode-emoji" title=":alarm_clock:">⏰</span>Minimal Schedule Interval: 1 Hour</H3></DIV><P>You cannot create intervals between schedules of less than 1 hour. Perfect for hourly reports, regular cleanup tasks, or periodic data synchronization.</P><HR /><DIV class=""><H3 id="toc-hId-913874855"><span class="lia-unicode-emoji" title=":bar_chart:">πŸ“Š</span>Number of Schedules: 15</H3></DIV><P>You can create up to 15 schedules - more than enough for testing, learning, and small applications. Think of it like Santa's Nice List - carefully curated and just the right size!</P><HR /><DIV class=""><H3 id="toc-hId-717361350"><span class="lia-unicode-emoji" title=":bell:">πŸ””</span>Send Events to SAP Alert Notification Service: Unlimited</H3></DIV><P>You can enable your job or task to send events for success or failure to SAP Alert Notification service for SAP BTP - with no limits! This works like Santa's notification system - you'll know immediately if your jobs succeed or need attention.</P><BLOCKQUOTE><P><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>Only available in the Cloud Foundry environment.</P></BLOCKQUOTE><P><span class="lia-unicode-emoji" title=":books:">πŸ“š</span>Learn more:</P><UL><LI><A href="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/integration-with-sap-alert-notification-service-for-sap-btp" target="_blank" rel="noopener noreferrer">Integration with SAP Alert Notification Service for SAP BTP</A></LI><LI><A href="https://help.sap.com/docs/alert-notification/sap-alert-notification-for-sap-btp/jobscheduler-job-execution?version=Cloud" target="_blank" rel="noopener noreferrer">SAP Job Scheduling Service Job Execution</A></LI><LI><A href="https://help.sap.com/docs/alert-notification/sap-alert-notification-for-sap-btp/jobscheduler-task-execution?version=Cloud" target="_blank" rel="noopener noreferrer">SAP Job Scheduling Service Task Execution</A></LI></UL><HR /><DIV class=""><H2 id="toc-hId-391765126"><span class="lia-unicode-emoji" title=":christmas_tree:">πŸŽ„</span>Feature Comparison Table</H2></DIV><TABLE><TBODY><TR><TD><STRONG>Feature</STRONG></TD><TD><STRONG>Free Plan</STRONG></TD><TD><STRONG>Standard Plan</STRONG></TD></TR><TR><TD>Minimal schedule interval</TD><TD>1 hour <span class="lia-unicode-emoji" title=":alarm_clock:">⏰</span></TD><TD>5 minutes <span class="lia-unicode-emoji" title=":high_voltage:">⚑</span></TD></TR><TR><TD>Number of schedules</TD><TD>15 <span class="lia-unicode-emoji" title=":bar_chart:">πŸ“Š</span></TD><TD>Unlimited <span class="lia-unicode-emoji" title=":infinity:">β™Ύ</span>️</TD></TR><TR><TD>Multitenancy</TD><TD>Tenant-aware&nbsp;<span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD>Tenant-aware&nbsp;<span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD>Alert Notification Service integration</TD><TD>Unlimited <span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD>Unlimited <span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD>One-time &amp; recurring jobs</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD>Sync &amp; async jobs</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD>Cloud Foundry tasks</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD>Support</TD><TD>Community <span class="lia-unicode-emoji" title=":busts_in_silhouette:">πŸ‘₯</span></TD><TD>SLA-backed <span class="lia-unicode-emoji" title=":shield:">πŸ›‘</span>️</TD></TR></TBODY></TABLE><DIV class=""><H2 id="toc-hId-195251621"><span class="lia-unicode-emoji" title=":santa_claus:">πŸŽ…</span>Getting Started</H2></DIV><P>Ready to unwrap your present? Here's how to get started:</P><OL><LI><STRONG>Access BTP Trial</STRONG><SPAN>&nbsp;</SPAN>- Visit the<SPAN>&nbsp;</SPAN><A href="https://cockpit.hanatrial.ondemand.com/" target="_blank" rel="nofollow noopener noreferrer">SAP BTP Trial</A><SPAN>&nbsp;</SPAN>and log in</LI><LI><STRONG>Navigate to Service Marketplace</STRONG><SPAN>&nbsp;</SPAN>- Find "Job Scheduling Service"</LI><LI><STRONG>Create Instance</STRONG><SPAN>&nbsp;</SPAN>- Select the<SPAN>&nbsp;</SPAN><STRONG>"free"</STRONG><SPAN>&nbsp;</SPAN>plan</LI><LI><STRONG>Bind to Your Application</STRONG><SPAN>&nbsp;</SPAN>- Connect it to your Cloud Foundry app or create a service key</LI><LI><STRONG>Start Scheduling!</STRONG><SPAN>&nbsp;</SPAN>- Use the dashboard or REST API to create your first job</LI></OL><DIV class="">&nbsp;</DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="create-instance.png" style="width: 743px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/353140i2DEF9EBF54A323CB/image-size/large?v=v2&amp;px=999" role="button" title="create-instance.png" alt="create-instance.png" /></span></P><DIV class="">&nbsp;</DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="dashboard.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/353141i2114CFADA6D262EE/image-size/large?v=v2&amp;px=999" role="button" title="dashboard.png" alt="dashboard.png" /></span></P><DIV class=""><H2 id="toc-hId--1261884"><span class="lia-unicode-emoji" title=":wrapped_gift:">🎁</span>Perfect For...</H2></DIV><P>The Free plan is your ideal companion for:</P><UL><LI><span class="lia-unicode-emoji" title=":graduation_cap:">πŸŽ“</span><SPAN>&nbsp;</SPAN><STRONG>Learning</STRONG><SPAN>&nbsp;</SPAN>- Explore Job Scheduling capabilities without commitment</LI><LI>πŸ§ͺ<SPAN>&nbsp;</SPAN><STRONG>Prototyping</STRONG><SPAN>&nbsp;</SPAN>- Test your scheduling logic before production</LI><LI><span class="lia-unicode-emoji" title=":artist_palette:">🎨</span><SPAN>&nbsp;</SPAN><STRONG>Small Projects</STRONG><SPAN>&nbsp;</SPAN>- Build demos, proof-of-concepts, and personal projects</LI><LI><span class="lia-unicode-emoji" title=":books:">πŸ“š</span><SPAN>&nbsp;</SPAN><STRONG>Tutorials</STRONG><SPAN>&nbsp;</SPAN>- Follow along with our blog posts and documentation</LI><LI><span class="lia-unicode-emoji" title=":direct_hit:">🎯</span><SPAN>&nbsp;</SPAN><STRONG>Trial Applications</STRONG><SPAN>&nbsp;</SPAN>- Integrate scheduling into your BTP Trial apps</LI></UL><DIV class=""><H2 id="toc-hId-149478968"><span class="lia-unicode-emoji" title=":glowing_star:">🌟</span>Happy Scheduling!</H2></DIV><P>This holiday season, we're excited to make SAP Job Scheduling Service more accessible than ever. Whether you're just starting your cloud journey or experimenting with automation, the Free plan is our gift to you!</P><P>Ho ho ho! May your schedules always run on time and your jobs always succeed! <span class="lia-unicode-emoji" title=":christmas_tree:">πŸŽ„</span><span class="lia-unicode-emoji" title=":sparkles:">✨</span></P><HR /><DIV class=""><H2 id="toc-hId--47034537"><span class="lia-unicode-emoji" title=":books:">πŸ“š</span>Additional Resources</H2></DIV><UL><LI><A href="https://help.sap.com/docs/JOB_SCHEDULER" target="_blank" rel="noopener noreferrer">SAP Job Scheduling Service Documentation</A></LI><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/job-scheduler-in-sap-business-technology-platform-overview-of-blog-posts/ba-p/13510707" target="_blank">Overview of Blog Posts</A></LI><LI><A href="https://discovery-center.cloud.sap/serviceCatalog/job-scheduling-service" target="_blank" rel="nofollow noopener noreferrer">Discovery Center</A></LI><LI><A href="https://cockpit.hanatrial.ondemand.com/" target="_blank" rel="nofollow noopener noreferrer">BTP Trial</A></LI></UL><HR /><P><EM>Disclaimer: Free tier service plans are subject to the Business Technology Platform Supplemental Terms and Conditions. Community support only - no SLA applies to free plans.</EM></P><P><STRONG>Happy Holidays from the SAP Job Scheduling Service Team! <span class="lia-unicode-emoji" title=":santa_claus:">πŸŽ…</span><span class="lia-unicode-emoji" title=":christmas_tree:">πŸŽ„</span><span class="lia-unicode-emoji" title=":wrapped_gift:">🎁</span></STRONG></P> 2025-12-17T14:00:31.636000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-integration-suite-workflows-with-job-scheduling-service/ba-p/14308557 SAP Integration Suite Workflows with Job Scheduling Service πŸš€ 2026-01-16T12:45:07.749000+01:00 DenisDuev https://community.sap.com/t5/user/viewprofilepage/user-id/180332 <H1 id="toc-hId-1658774176"><SPAN>Schedule Your SAP Integration Suite Workflows with Job Scheduling Service – Secured with JWT Authentication! <span class="lia-unicode-emoji" title=":locked_with_key:">πŸ”</span><span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></SPAN></H1><P>Are you using SAP Integration Suite? You may be wondering is it possible to use the SAP Job Scheduling service to start integrations on a timely matter.</P><P>I was wondering the same. And the answer is YES! You can use the SAP Job Scheduling service to trigger integrations in the Integration Suite. But how?</P><P>To achieve this, you need to expose your integration as an HTTP endpoint. This can be done by creating API in the Integration Suite's API Management - this will allow your workflow to be triggered via HTTP requests. Ok this is something trivial for Integration Suite users.</P><P>But now to ensure that only the SAP Job Scheduling service can trigger your integration? In your API setup you need to implement authentication mechanisms - verify that the token coming from the Job Scheduling service is valid. For this, you can use verifyJWT policy. And that's it!</P><P>Now let's show it step by step.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="hero-jss-integration-suite.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361908i9F40FCAEAF232085/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="hero-jss-integration-suite.png" alt="hero-jss-integration-suite.png" /></span></P><P class="lia-align-center" style="text-align: center;"><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/job-scheduling-service-in-sap-business-technology-platform-overview-of-blog/ba-p/13510707" target="_blank"><EM>For more cool Job Scheduling Service Blog Posts check the Overview page</EM></A></P><DIV class=""><H3 id="toc-hId-1720426109">Prerequisites</H3></DIV><P>For my setup I have used the BTP Trial account + followed some SAP Tutorials to get a workflow and API up and running.</P><OL><LI><A href="https://developers.sap.com/tutorials/hcp-create-trial-account.html" target="_blank" rel="noopener noreferrer">Get an Account on SAP BTP Trial</A></LI><LI><A href="https://developers.sap.com/tutorials/cp-starter-isuite-onboard-subscribe.html" target="_blank" rel="noopener noreferrer">Set Up Integration Suite Trial</A></LI><LI><A href="https://developers.sap.com/tutorials/cp-starter-integration-cpi-design-iflow.html" target="_blank" rel="noopener noreferrer">Design and Deploy Your First Integration Flow</A></LI><LI><A href="https://developers.sap.com/tutorials/cp-starter-isuite-api-management.html" target="_blank" rel="noopener noreferrer">Expose Integration Flow Endpoint as API and Test the Flow</A></LI></OL><P>With this done you get an endpoint that can be triggered via HTTP request. But beware because this endpoint is public - anyone knowing the URL can trigger it.</P><DIV class=""><H3 id="toc-hId-1523912604">Create Job Scheduling Service Instance</H3></DIV><P>Now let's create a Job Scheduling service instance that will be used to trigger our Integration Suite API on a schedule.</P><DIV class=""><H4 id="toc-hId-1456481818">Using BTP Cockpit</H4></DIV><OL><LI>Navigate to your<SPAN>&nbsp;</SPAN><STRONG>BTP Trial Subaccount</STRONG></LI><LI>Go to<SPAN>&nbsp;</SPAN><STRONG>Services</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>Service Marketplace</STRONG></LI><LI>Search for<SPAN>&nbsp;</SPAN><STRONG>Job Scheduling Service</STRONG><SPAN>&nbsp;</SPAN>(or<SPAN>&nbsp;</SPAN><CODE>jobscheduler</CODE>)</LI><LI>Click on the service tile</LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Create</STRONG><SPAN>&nbsp;</SPAN>button</LI><LI>Fill in the instance details:<UL><LI><STRONG>Service</STRONG>:<SPAN>&nbsp;</SPAN><CODE>Job Scheduling Service</CODE></LI><LI><STRONG>Plan</STRONG>: Select<SPAN>&nbsp;</SPAN><CODE>free</CODE><SPAN>&nbsp;</SPAN>(or<SPAN>&nbsp;</SPAN><CODE>standard</CODE><SPAN>&nbsp;</SPAN>in BTP Production)</LI><LI><STRONG>Runtime Environment</STRONG>: Cloud Foundry</LI><LI><STRONG>Space</STRONG>:<SPAN>&nbsp;</SPAN><CODE>dev</CODE><SPAN>&nbsp;</SPAN>if you are using trial (or your space name for BTP Production)</LI><LI><STRONG>Instance Name</STRONG>:<SPAN>&nbsp;</SPAN><CODE>jobscheduler-integration-suite</CODE><SPAN>&nbsp;</SPAN>(or any name you prefer)</LI></UL></LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Create</STRONG><SPAN>&nbsp;</SPAN>(no need to add parrameters)</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="create-service-instance.png" style="width: 756px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361899i7BD8C4E353D34EAC/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="create-service-instance.png" alt="create-service-instance.png" /></span></P><DIV class=""><H4 id="toc-hId-1259968313">Using CF CLI</H4></DIV><P>Alternatively, you can use the Cloud Foundry CLI:</P><DIV class=""><PRE>cf create-service jobscheduler free jobscheduler-integration-suite</PRE></DIV><P>Wait for the service instance to be created. You can check the status with:</P><DIV class=""><PRE>cf service jobscheduler-integration-suite</PRE></DIV><P>Once the service is created, you can access the Job Scheduling service dashboard through the BTP Cockpit by clicking on your service instance and selecting<SPAN> <STRONG>View</STRONG></SPAN><STRONG>&nbsp;Dashboard</STRONG>.</P><DIV class=""><H3 id="toc-hId-934372089">Create a Job in Job Scheduling Service that Triggers the Integration</H3></DIV><P>Now that we have both the Job Scheduling service instance and the Integration Suite API endpoint, let's create a job that will trigger the integration on a schedule.</P><DIV class=""><H4 id="toc-hId-866941303">Step 1: Get Your Integration API Endpoint URL</H4></DIV><P>From the Integration Suite API Management, you need to get the full URL of your API endpoint. Go to <STRONG>Configure</STRONG> -&gt; <STRONG>APIs</STRONG> and then <EM>choose</EM> your API. Inside you can find your <STRONG>API Proxy URL</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="api-proxy-url.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361895i2AD0E924D6AE0761/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="api-proxy-url.png" alt="api-proxy-url.png" /></span></P><P>Make sure to copy this URL - you'll need it in the next step.</P><DIV class=""><H4 id="toc-hId-670427798">Step 2: Open the Job Scheduling Dashboard</H4></DIV><OL><LI>Navigate to your<SPAN>&nbsp;</SPAN><STRONG>BTP Trial Subaccount</STRONG></LI><LI>Go to<SPAN>&nbsp;</SPAN><STRONG>Services</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>Instances and Subscriptions</STRONG></LI><LI>Find your Job Scheduling service instance (<CODE>jobscheduler-integration-suite</CODE>)</LI><LI>Click on the instance name</LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>View Dashboard</STRONG><SPAN>&nbsp;</SPAN>button</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="open-dashboard.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361903iA39AA64983867FA1/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="open-dashboard.png" alt="open-dashboard.png" /></span></P><BLOCKQUOTE><P><STRONG>Note</STRONG>: You may need to log in with your BTP credentials when accessing the dashboard for the first time.</P></BLOCKQUOTE><DIV class=""><H4 id="toc-hId-473914293">Step 3: Create a Job</H4></DIV><OL><LI>In the Job Scheduling dashboard, click<SPAN>&nbsp;</SPAN><STRONG>Jobs</STRONG><SPAN>&nbsp;</SPAN>from the left-hand menu</LI><LI>Click the<SPAN>&nbsp;</SPAN><STRONG>Create Job</STRONG><SPAN>&nbsp;</SPAN>button</LI><LI>Fill in the job details:<UL><LI><STRONG>Name</STRONG>:<SPAN>&nbsp;</SPAN><CODE>Trigger Integration Flow</CODE><SPAN>&nbsp;</SPAN>(or any meaningful name)</LI><LI><STRONG>Description</STRONG>:<SPAN>&nbsp;</SPAN><CODE>Triggers the Integration Suite API endpoint</CODE></LI><LI><STRONG>Action</STRONG>: Paste your Integration&nbsp;<STRONG>API Proxy URL</STRONG> (from Step 1) + <EM>add</EM><SPAN>&nbsp;</SPAN><CODE>/details</CODE></LI><LI><STRONG>HTTP Method</STRONG>: Select<SPAN>&nbsp;</SPAN><CODE>POST</CODE><SPAN>&nbsp;</SPAN>(as we follow the tutorial)</LI></UL></LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Save</STRONG></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="create-job.png" style="width: 701px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361897iA771D867A8214E73/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="create-job.png" alt="create-job.png" /></span></P><BLOCKQUOTE><P><STRONG>Note</STRONG>: After saving, you'll see a warning icon next to the job. This is normal - it means the job needs a schedule to actually run.</P></BLOCKQUOTE><DIV class=""><H4 id="toc-hId-277400788">Step 4: Create a Schedule</H4></DIV><OL><LI>Click on the<SPAN>&nbsp;</SPAN><STRONG>job name</STRONG><SPAN>&nbsp;</SPAN>you just created to open its details</LI><LI>From the left-hand menu, click<SPAN>&nbsp;</SPAN><STRONG>Schedules</STRONG></LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Create Schedule</STRONG><SPAN>&nbsp;</SPAN>button</LI><LI>Configure the schedule:<UL><LI><STRONG>Pattern</STRONG>: Leave<SPAN>&nbsp;</SPAN><STRONG>One Time</STRONG></LI><LI><STRONG>Value</STRONG>: Enter<SPAN>&nbsp;</SPAN><CODE>now</CODE></LI><LI><STRONG>Data</STRONG>: Add your payload, if you have followed the previous tutorial to create an integration that expects a payload:</LI></UL><DIV class=""><PRE>{ <SPAN class="">"productIdentifier"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>HT-2000<SPAN class="">"</SPAN></SPAN> }</PRE></DIV></LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Save</STRONG></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="create-schedule.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361898i16FAB2BDDDDAB0D4/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="create-schedule.png" alt="create-schedule.png" /></span></P><DIV class=""><H4 id="toc-hId--416829812">Step 5: Verify the Job Execution</H4></DIV><OL><LI>After saving the schedule, click on the<SPAN>&nbsp;</SPAN><STRONG>schedule description</STRONG><SPAN>&nbsp;</SPAN>to view its details</LI><LI>From the left-hand menu, select<SPAN>&nbsp;</SPAN><STRONG>Run Logs</STRONG></LI><LI>Wait for the scheduled time to pass (or if you used<SPAN>&nbsp;</SPAN><CODE>now</CODE><SPAN>&nbsp;</SPAN>as the pattern, it should execute immediately)</LI><LI>Refresh the page to see the execution results</LI><LI>You should see a status of<SPAN>&nbsp;</SPAN><STRONG>COMPLETED</STRONG><SPAN>&nbsp;</SPAN>with a green checkmark if successful</LI></OL><P>Click on the<SPAN>&nbsp;</SPAN><STRONG>Run Log ID</STRONG><SPAN>&nbsp;</SPAN>to see detailed information about the execution, including:</P><UL><LI>HTTP status code received from your Integration endpoint</LI><LI>Response body</LI><LI>Execution timestamp</LI><LI>Duration</LI></UL><P><STRONG>Success! - without security yet.</STRONG></P><P>At this point, your job is successfully calling the Integration Suite API endpoint. However, this endpoint is still publicly accessible - anyone with the URL can trigger it. In the next section, we'll secure it so that only the Job Scheduling service can call it.</P><DIV class=""><H3 id="toc-hId--319940310">Secure the Integration Endpoint</H3></DIV><P>To ensure that only the Job Scheduling Service can trigger your integration, you need to implement JWT (JSON Web Token) authentication in your API using<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/sap-api-management/sap-api-management-for-neo-environment/verify-jwt?version=Cloud" target="_blank" rel="noopener noreferrer">Integration Suite's API Management policies</A>.</P><P>The Job Scheduling service automatically sends a JWT token in the<SPAN>&nbsp;</SPAN><CODE>Authorization</CODE><SPAN>&nbsp;</SPAN>header when calling your endpoint. We'll configure the API to verify this token, ensuring only legitimate calls from your Job Scheduler instance are accepted.</P><BLOCKQUOTE><P><STRONG>Reference</STRONG>: This section is inspired by<SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-1-modeling-the-jwt-token-verification-flows-in-sap-cloud-platform-api/ba-p/13419841" target="_blank">Part 1: Modeling the JWT token verification flows in SAP Cloud Platform API Management</A></P></BLOCKQUOTE><DIV class=""><H4 id="toc-hId--809856822">Understanding the JWT Verification Flow</H4></DIV><P>The verification process involves these steps:</P><OL><LI><STRONG>Fetch JWKS from XSUAA</STRONG><SPAN>&nbsp;</SPAN>- Get them from the Job Scheduler's XSUAA service<SPAN>&nbsp;</SPAN><CODE>/token_keys</CODE></LI><LI><STRONG>Get the public certificate</STRONG><SPAN>&nbsp;</SPAN>- to verify the JWT signature</LI><LI><STRONG>Verify JWT token</STRONG><SPAN>&nbsp;</SPAN>- Validate the incoming token using the public certificate and check claims like<SPAN>&nbsp;</SPAN><CODE>issuer</CODE><SPAN>&nbsp;</SPAN>and<SPAN>&nbsp;</SPAN><CODE>audience</CODE>.</LI></OL><BLOCKQUOTE><P>Note: we will not include caching for this example to keep it simple</P></BLOCKQUOTE><DIV class=""><H4 id="toc-hId--1006370327">Step 1: Get Your Job Scheduler Service Key</H4></DIV><P>First, you need to get the XSUAA credentials from your Job Scheduling service instance.</P><OL><LI>Navigate to your<SPAN>&nbsp;</SPAN><STRONG>BTP Cockpit</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>Subaccount</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>Spaces</STRONG></LI><LI>Go to<SPAN>&nbsp;</SPAN><STRONG>Services</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>Instances</STRONG></LI><LI>Find your<SPAN>&nbsp;</SPAN><CODE>jobscheduler-integration-suite</CODE><SPAN>&nbsp;</SPAN>instance</LI><LI>Click on the instance, then go to<SPAN>&nbsp;</SPAN><STRONG>Service Keys</STRONG></LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Create</STRONG><SPAN>&nbsp;</SPAN>to create a new service key (name it<SPAN>&nbsp;</SPAN><CODE>api-integration-key</CODE>)</LI><LI>Click on the service key to view its JSON content</LI></OL><P>You'll need these values from the service key:</P><UL><LI><STRONG><CODE>uaa.url</CODE></STRONG>: The XSUAA server URL (e.g.,<SPAN>&nbsp;</SPAN><CODE><A href="https://dadb4adetrial.authentication.ap21.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://dadb4adetrial.authentication.ap21.hana.ondemand.com</A></CODE>)</LI><LI><STRONG><CODE>uaa.clientid</CODE></STRONG>: The application name (e.g.,<SPAN>&nbsp;</SPAN><CODE>sb-377fab0e-30b1-49e2-8632-01968ee8d436!b97749|sap-jobscheduler!b4</CODE>)</LI></UL><P>The information about the token can be found on<SPAN>&nbsp;</SPAN><CODE>{uaa.url}/.well-known/openid-configuration</CODE></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="openid-config.png" style="width: 739px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361889iC0B0FA371CE7AD3B/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="openid-config.png" alt="openid-config.png" /></span></P><P>The JWKS endpoint URL will be:<SPAN>&nbsp;</SPAN><CODE>{uaa.url}/token_keys</CODE>. It contains the public keys needed to verify the JWT tokens.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="token-keys.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361906i1F16B0949E3D4E50/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="token-keys.png" alt="token-keys.png" /></span></P><DIV class=""><H4 id="toc-hId--1202883832">Step 2: Open Your API in Integration Suite</H4></DIV><OL><LI>Navigate to<SPAN>&nbsp;</SPAN><STRONG>Integration Suite</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>Configure</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>APIs</STRONG></LI><LI>Select your API that you created in the prerequisites<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="apis.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361896iC4639ED7610DDDF9/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="apis.png" alt="apis.png" /></span></LI></OL><P>&nbsp;</P><OL><LI>Click on<SPAN>&nbsp;</SPAN><STRONG>Policies</STRONG><SPAN>&nbsp;</SPAN>to open the Policy Editor</LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Edit</STRONG><SPAN>&nbsp;</SPAN>to enter edit mode</LI></OL><DIV class="">&nbsp;</DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="edit-policies.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361902i948F580B8F87FFFE/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="edit-policies.png" alt="edit-policies.png" /></span></P><DIV class=""><H4 id="toc-hId--1399397337">Step 3: Add JWT Verification Policies</H4></DIV><P>We'll add 4 policies in the<SPAN>&nbsp;</SPAN><STRONG>ProxyEndpoint</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>PreFlow</STRONG><SPAN>&nbsp;</SPAN>section (these run before your integration is called):</P><DIV class=""><H5 id="toc-hId--1889313849">3.1 Add Service Callout Policy</H5></DIV><P>This policy fetches the JWKS from XSUAA if they're not in cache.</P><OL><LI><P>Click the<SPAN>&nbsp;</SPAN><STRONG>+</STRONG><SPAN>&nbsp;</SPAN>button next to<SPAN>&nbsp;</SPAN><STRONG>Service Callout</STRONG><SPAN>&nbsp;</SPAN>(under Extension Policies)</P></LI><LI><P>Name it:<SPAN>&nbsp;</SPAN><CODE>readJWKS</CODE></P></LI><LI><P>Click<SPAN>&nbsp;</SPAN><STRONG>Add</STRONG></P></LI><LI><P>Replace the policy content with (update the URL with your<SPAN>&nbsp;</SPAN><CODE>{uaa.url}/token_keys</CODE><SPAN>&nbsp;</SPAN>endpoint from above):</P></LI></OL><DIV class=""><PRE>&lt;?<SPAN class="">xml</SPAN><SPAN class=""> version</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>1.0<SPAN class="">"</SPAN></SPAN><SPAN class=""> encoding</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>UTF-8<SPAN class="">"</SPAN></SPAN><SPAN class=""> standalone</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>yes<SPAN class="">"</SPAN></SPAN>?&gt; &lt;<SPAN class="">ServiceCallout</SPAN> <SPAN class="">async</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>false<SPAN class="">"</SPAN></SPAN> <SPAN class="">continueOnError</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>false<SPAN class="">"</SPAN></SPAN> <SPAN class="">enabled</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>true<SPAN class="">"</SPAN></SPAN> <SPAN class="">xmlns</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>http://www.sap.com/apimgmt<SPAN class="">"</SPAN></SPAN>&gt; &lt;<SPAN class="">Response</SPAN>&gt;JWTKeys&lt;/<SPAN class="">Response</SPAN>&gt; &lt;<SPAN class="">Timeout</SPAN>&gt;30000&lt;/<SPAN class="">Timeout</SPAN>&gt; &lt;<SPAN class="">HTTPTargetConnection</SPAN>&gt; &lt;<SPAN class="">URL</SPAN>&gt;your.uaa.url/token_keys&lt;/<SPAN class="">URL</SPAN>&gt; &lt;/<SPAN class="">HTTPTargetConnection</SPAN>&gt; &lt;/<SPAN class="">ServiceCallout</SPAN>&gt;</PRE></DIV><BLOCKQUOTE><P><STRONG>Important</STRONG>: Replace the URL with your actual XSUAA<SPAN>&nbsp;</SPAN><CODE>token_keys</CODE><SPAN>&nbsp;</SPAN>endpoint from Step 1.</P></BLOCKQUOTE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="service-callout-policy.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361893i6A19C103A8CC9867/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="service-callout-policy.png" alt="service-callout-policy.png" /></span></P><DIV class=""><H5 id="toc-hId--2085827354">3.2 Extract Public Certificates</H5></DIV><P>In this step, we extract the public keys from the JWKS response. So that it can be used later in the JWT verification.</P><P>Why is this the step needed? Because the response from the<SPAN>&nbsp;</SPAN><CODE>token_keys</CODE><SPAN>&nbsp;</SPAN>endpoint may contains different fields and we need exactly the public keys.</P><OL><LI>Click the<SPAN>&nbsp;</SPAN><STRONG>+</STRONG><SPAN>&nbsp;</SPAN>button next to<SPAN>&nbsp;</SPAN><STRONG>Extract Variables</STRONG><SPAN>&nbsp;</SPAN>(under Message Policies)</LI><LI>Name it:<SPAN>&nbsp;</SPAN><CODE>extractPublicKeys</CODE></LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Add</STRONG></LI><LI>Replace the policy content with:</LI></OL><DIV class=""><PRE>&lt;<SPAN class="">ExtractVariables</SPAN> <SPAN class="">xmlns</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>http://www.sap.com/apimgmt<SPAN class="">"</SPAN></SPAN> <SPAN class="">async</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>false<SPAN class="">"</SPAN></SPAN> <SPAN class="">continueOnError</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>false<SPAN class="">"</SPAN></SPAN> <SPAN class="">enabled</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>true<SPAN class="">"</SPAN></SPAN>&gt; &lt;<SPAN class="">Source</SPAN>&gt;JWTKeys.content&lt;/<SPAN class="">Source</SPAN>&gt; &lt;<SPAN class="">JSONPayload</SPAN>&gt; <SPAN class="">&lt;!-- Pull the PEM from the "value" field --&gt;</SPAN> &lt;<SPAN class="">Variable</SPAN> <SPAN class="">name</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>PUBLIC_KEY_PEM<SPAN class="">"</SPAN></SPAN>&gt; &lt;<SPAN class="">JSONPath</SPAN>&gt;$.keys[0].value&lt;/<SPAN class="">JSONPath</SPAN>&gt; &lt;/<SPAN class="">Variable</SPAN>&gt; &lt;/<SPAN class="">JSONPayload</SPAN>&gt; &lt;<SPAN class="">IgnoreUnresolvedVariables</SPAN>&gt;true&lt;/<SPAN class="">IgnoreUnresolvedVariables</SPAN>&gt; &lt;/<SPAN class="">ExtractVariables</SPAN>&gt;</PRE></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="extract-variables-policy.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361890iBB109742E998643F/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="extract-variables-policy.png" alt="extract-variables-policy.png" /></span></P><DIV class=""><H5 id="toc-hId-2012626437">3.3 Add Verify JWT Policy</H5></DIV><P>This is the main policy that validates the JWT token from Job Scheduler.</P><OL><LI>Click the<SPAN>&nbsp;</SPAN><STRONG>+</STRONG><SPAN>&nbsp;</SPAN>button next to<SPAN>&nbsp;</SPAN><STRONG>Verify JWT</STRONG><SPAN>&nbsp;</SPAN>(under Security Policies)</LI><LI>Name it:<SPAN>&nbsp;</SPAN><CODE>verifyJWT</CODE></LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Add</STRONG></LI><LI>Replace the policy content with (update the issuer):</LI></OL><DIV class=""><PRE>&lt;?<SPAN class="">xml</SPAN><SPAN class=""> version</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>1.0<SPAN class="">"</SPAN></SPAN><SPAN class=""> encoding</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>UTF-8<SPAN class="">"</SPAN></SPAN><SPAN class=""> standalone</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>yes<SPAN class="">"</SPAN></SPAN>?&gt; &lt;<SPAN class="">VerifyJWT</SPAN> <SPAN class="">async</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>false<SPAN class="">"</SPAN></SPAN> <SPAN class="">continueOnError</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>false<SPAN class="">"</SPAN></SPAN> <SPAN class="">enabled</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>true<SPAN class="">"</SPAN></SPAN> <SPAN class="">xmlns</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>http://www.sap.com/apimgmt<SPAN class="">"</SPAN></SPAN>&gt; &lt;<SPAN class="">Algorithm</SPAN>&gt;RS256&lt;/<SPAN class="">Algorithm</SPAN>&gt; &lt;<SPAN class="">PublicKey</SPAN>&gt; &lt;<SPAN class="">Value</SPAN> <SPAN class="">ref</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>PUBLIC_KEY_PEM<SPAN class="">"</SPAN></SPAN>/&gt; &lt;/<SPAN class="">PublicKey</SPAN>&gt; &lt;<SPAN class="">Issuer</SPAN>&gt;your.uaa.url/oauth/token&lt;/<SPAN class="">Issuer</SPAN>&gt; &lt;<SPAN class="">Audience</SPAN>&gt;uaa.clientid&lt;/<SPAN class="">Audience</SPAN>&gt; &lt;/<SPAN class="">VerifyJWT</SPAN>&gt;</PRE></DIV><BLOCKQUOTE><P><STRONG>Important</STRONG>:</P><UL><LI>Update<SPAN>&nbsp;</SPAN><CODE>&lt;Issuer&gt;</CODE><SPAN>&nbsp;</SPAN>with your XSUAA URL +<SPAN>&nbsp;</SPAN><CODE>/oauth/token</CODE></LI><LI>Update<SPAN>&nbsp;</SPAN><CODE>&lt;Audience&gt;</CODE><SPAN>&nbsp;</SPAN>with your<SPAN>&nbsp;</SPAN><CODE>clientid</CODE><SPAN>&nbsp;</SPAN>from the service key</LI><LI>These values must match exactly or the token verification will fail</LI></UL></BLOCKQUOTE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="verify-jwt-policy.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361892i8FFA68112098F7AD/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="verify-jwt-policy.png" alt="verify-jwt-policy.png" /></span></P><DIV class=""><H4 id="toc-hId-2109515939">Step 4: Save and Deploy</H4></DIV><OL><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Update</STRONG><SPAN>&nbsp;</SPAN>in the Policy Editor to save all policies</LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Save</STRONG><SPAN>&nbsp;</SPAN>to persist the API changes</LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Deploy</STRONG><SPAN>&nbsp;</SPAN>to deploy the updated API</LI><LI>The API is now protected with JWT authentication!</LI></OL><DIV class=""><H4 id="toc-hId-2081186125">Step 5: Understanding the Policy Flow</H4></DIV><P>Here's what happens when Job Scheduler calls your API:</P><DIV class=""><PRE><CODE>1. Job Scheduler β†’ API (with JWT token in Authorization header) 2. readJWKS β†’ Fetches JWKS from XSUAA 3. extractPublicKeys β†’ Extracts public key from JWKS into variable 4. verifyJWT β†’ Validates JWT token with JWKS 5. IF valid β†’ Integration Flow executes 6. IF invalid β†’ Returns 401 Unauthorized</CODE></PRE></DIV><DIV class=""><H3 id="toc-hId--2116891669">Testing the Secured Integration</H3></DIV><P>Now let's test that the JWT verification is working correctly.</P><DIV class=""><H4 id="toc-hId-1688159115">Test 1: Job Scheduler Should Succeed</H4></DIV><OL><LI>Go back to the<SPAN>&nbsp;</SPAN><STRONG>Job Scheduling Dashboard</STRONG></LI><LI>Navigate to your job and schedule</LI><LI>Manually trigger the one time job by activating it (or wait for the next scheduled run if the job is recurring)</LI><LI>Check the<SPAN>&nbsp;</SPAN><STRONG>Run Logs</STRONG></LI><LI>You should see<SPAN>&nbsp;</SPAN><STRONG>COMPLETED</STRONG><SPAN>&nbsp;</SPAN>status with HTTP 200</LI></OL><P>This proves that Job Scheduler can successfully authenticate with the JWT token.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="successful-secured-run.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361905i354E7429F425B5A0/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="successful-secured-run.png" alt="successful-secured-run.png" /></span></P><DIV class=""><H4 id="toc-hId-1491645610">Test 2: Direct API Call Should Fail</H4></DIV><P>To verify the security is working, try calling the API directly without a valid token:</P><OL><LI>In Integration Suite, go to your API</LI><LI>Click on<SPAN>&nbsp;</SPAN><STRONG>Test</STRONG><SPAN>&nbsp;</SPAN>tab</LI><LI>Try to call the API without authorization</LI><LI>You should receive a<SPAN>&nbsp;</SPAN><STRONG>401 Unauthorized</STRONG><SPAN>&nbsp;</SPAN>response</LI></OL><P>Or test with curl:</P><DIV class=""><PRE>curl -X POST <SPAN class=""><SPAN class="">"</SPAN>https://your-api-url.com/your-integration-path<SPAN class="">"</SPAN></SPAN> \ -H <SPAN class=""><SPAN class="">"</SPAN>Content-Type: application/json<SPAN class="">"</SPAN></SPAN> \ -d <SPAN class=""><SPAN class="">'</SPAN>{"productIdentifier": "HT-2000"}<SPAN class="">'</SPAN></SPAN></PRE></DIV><P>Expected error response:</P><DIV class=""><PRE>{ <SPAN class="">"fault"</SPAN>: { <SPAN class="">"faultstring"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>Failed to Resolve Variable : policy(verifyJWT) variable(null)<SPAN class="">"</SPAN></SPAN>, <SPAN class="">"detail"</SPAN>: { <SPAN class="">"errorcode"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>steps.jwt.FailedToResolveVariable<SPAN class="">"</SPAN></SPAN> } } }</PRE></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="unauthorized-error.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361907iC9775B6B29CDB572/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="unauthorized-error.png" alt="unauthorized-error.png" /></span></P><DIV class=""><H4 id="toc-hId-1295132105">Test 3: Wrong Job Scheduler Instance Should Fail</H4></DIV><P>If you have multiple Job Scheduling service instances, try calling from a different instance:</P><OL><LI>Create a job in a<SPAN>&nbsp;</SPAN><STRONG>different</STRONG><SPAN>&nbsp;</SPAN>Job Scheduler instance</LI><LI>Point it to the same Integration API endpoint</LI><LI>Run the job</LI><LI>Check the Run Logs - you should see<SPAN>&nbsp;</SPAN><STRONG>REQUEST_ERROR (401)</STRONG></LI></OL><P>Expected error from a different Job Scheduler instance:</P><DIV class=""><PRE>{ <SPAN class="">"fault"</SPAN>: { <SPAN class="">"faultstring"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>Invalid Claim: policy(verifyJWT) claim(aud)<SPAN class="">"</SPAN></SPAN>, <SPAN class="">"detail"</SPAN>: { <SPAN class="">"errorcode"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>steps.jwt.InvalidClaim<SPAN class="">"</SPAN></SPAN> } } }</PRE></DIV><P>This happens because the<SPAN>&nbsp;</SPAN><CODE>audience</CODE><SPAN>&nbsp;</SPAN>claim in the JWT token doesn't match the one configured in your<SPAN>&nbsp;</SPAN><CODE>verifyJWT</CODE><SPAN>&nbsp;</SPAN>policy, proving that only your<SPAN>&nbsp;</SPAN><STRONG>specific</STRONG><SPAN>&nbsp;</SPAN>Job Scheduler instance can trigger the integration.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="another-scheduler-invalid-claim.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361894iA3A0BB9E4D657CF2/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="another-scheduler-invalid-claim.png" alt="another-scheduler-invalid-claim.png" /></span></P><DIV class=""><H3 id="toc-hId-1392021607">Conclusion</H3></DIV><P>Congratulations! <span class="lia-unicode-emoji" title=":party_popper:">πŸŽ‰</span> You've successfully:</P><OL><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span>Created a Job Scheduling service instance in BTP</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span>Configured a job to trigger your Integration Suite API endpoint on a schedule</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span>Secured the API endpoint using JWT token verification</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span>Ensured only your specific Job Scheduler instance can call the integration</LI></OL><DIV class=""><H4 id="toc-hId-902105095">What You've Learned</H4></DIV><UL><LI>How to integrate SAP Job Scheduling Service with Integration Suite APIs</LI><LI>How to implement JWT-based authentication in API Management</LI><LI>How to use JWKS for token verification with caching</LI><LI>How the JWT verification flow works in Integration Suite</LI></UL><DIV class=""><H4 id="toc-hId-705591590">Key Takeaways</H4></DIV><UL><LI><STRONG>Automatic Authentication</STRONG>: Job Scheduler automatically sends JWT tokens - no additional configuration needed in the job</LI><LI><STRONG>Strong Security</STRONG>: The<SPAN>&nbsp;</SPAN><CODE>audience</CODE><SPAN>&nbsp;</SPAN>claim ensures only your specific service instance can access the API</LI><LI><STRONG>Zero Trust</STRONG>: Even if someone knows your API URL, they can't call it without a valid JWT token from your Job Scheduler</LI></UL><DIV class=""><H4 id="toc-hId-509078085">Next Steps</H4></DIV><P>Consider these enhancements:</P><UL><LI><STRONG>Add more schedules</STRONG>: Create recurring schedules (hourly, daily, weekly)</LI><LI><STRONG>Monitor executions</STRONG>: Use the Job Scheduler dashboard to track success rates</LI><LI><STRONG>Handle errors</STRONG>: Implement error handling in your integration flow</LI><LI><STRONG>Alert on failures</STRONG>: Use SAP Alert Notification service for failed job runs</LI><LI><STRONG>Add logging</STRONG>: Enhance your integration flow with detailed logging for troubleshooting</LI><LI><STRONG>Custom claims</STRONG>: Add additional JWT claim validation (e.g.,<SPAN>&nbsp;</SPAN><CODE>scope</CODE>,<SPAN>&nbsp;</SPAN><CODE>client_id</CODE>)</LI></UL><DIV class=""><H3 id="toc-hId-605967587">Troubleshooting</H3></DIV><DIV class=""><H4 id="toc-hId-284234766">Problem: "Invalid token" error</H4></DIV><P><STRONG>Symptoms</STRONG>: Job shows REQUEST_ERROR (401) with message about invalid token</P><P><STRONG>Possible Causes &amp; Solutions</STRONG>:</P><OL><LI><P><STRONG>JWKS URL is incorrect</STRONG></P><UL><LI>Check the<SPAN>&nbsp;</SPAN><CODE>readJWKS</CODE><SPAN>&nbsp;</SPAN>Service Callout policy</LI><LI>Verify the URL ends with<SPAN>&nbsp;</SPAN><CODE>/token_keys</CODE></LI><LI>Ensure it matches your XSUAA domain from the service key</LI></UL></LI><LI><P><STRONG>Issuer mismatch</STRONG></P><UL><LI>Check the<SPAN>&nbsp;</SPAN><CODE>&lt;Issuer&gt;</CODE><SPAN>&nbsp;</SPAN>in your<SPAN>&nbsp;</SPAN><CODE>verifyJWT</CODE><SPAN>&nbsp;</SPAN>policy</LI><LI>Must match:<SPAN>&nbsp;</SPAN><CODE>{uaa.url}/oauth/token</CODE></LI><LI>Case-sensitive!</LI></UL></LI><LI><P><STRONG>Audience mismatch</STRONG></P><UL><LI>Check the<SPAN>&nbsp;</SPAN><CODE>&lt;Audience&gt;</CODE><SPAN>&nbsp;</SPAN>in your<SPAN>&nbsp;</SPAN><CODE>verifyJWT</CODE><SPAN>&nbsp;</SPAN>policy</LI><LI>Must match the<SPAN>&nbsp;</SPAN><CODE>clientid</CODE><SPAN>&nbsp;</SPAN>from your Job Scheduler service key</LI><LI>Example:<SPAN>&nbsp;</SPAN><CODE>sb-377fab0e-30b1-49e2-8632-01968ee8d436!b97749|sap-jobscheduler!b4</CODE></LI></UL></LI></OL><DIV class=""><H4 id="toc-hId-87721261">Problem: FailedToResolveVariable error</H4></DIV><P><STRONG>Symptoms</STRONG>: Job shows REQUEST_ERROR (401) with message "Failed to Resolve Variable"</P><DIV class=""><PRE><CODE>{"fault":"{faultstring":"Failed to Resolve Variable : policy(verifyJWT) variable(JWTKeys.content)',"detail": {"errorcode":"steps.jwt.FailedToResolveVariable"}}}</CODE></PRE></DIV><P><STRONG>Possible Causes</STRONG>:</P><P>If you decide to include caching for the JWKS, this error may occur if the cache contains old and invalid data.</P><P><STRONG>Possible Solutions</STRONG></P><P>In verifyJWT put the directly Public Key instead of JWKS ref or remove the caching policies to simplify the flow.</P><P>Instead of</P><DIV class=""><PRE>&lt;<SPAN class="">PublicKey</SPAN>&gt; &lt;<SPAN class="">Value</SPAN> <SPAN class="">ref</SPAN>=<SPAN class=""><SPAN class="">"</SPAN>PUBLIC_KEY_PEM<SPAN class="">"</SPAN></SPAN>/&gt;<BR />&lt;/<SPAN class="">PublicKey</SPAN>&gt;</PRE></DIV><P>it can be changed the value of<SPAN>&nbsp;</SPAN><CODE>keys.[0].value</CODE><SPAN>&nbsp;</SPAN>of<SPAN>&nbsp;</SPAN><CODE>{uaa.url}/token_keys</CODE></P><DIV class=""><PRE>&lt;<SPAN class="">PublicKey</SPAN>&gt; &lt;<SPAN class="">Value</SPAN>&gt; -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwaPuBnCZqghcYY+x8RA qUSC/NwE2aflfyRvDT+9P7gCjQiXz+RxqQ7Mh4RL41jANIMr9m3TeUFOjuitY9En K3i4qTBrWNvsTdx/NdL9OOx55O4DMVOeANEtxXhrfDDMb7iRDFsfNmgPn06iIc2C example - do not copy 5wYN2cMO4Ne1GFZmtduz2WEEwnWU4/6+ie8ONIGO52DJPXIqHk2d4SRAjLaTDzSx a/iBVSmlSLbWmhSFcUHkMkX3BkEdG6A2tmRFwyEv1e3jQ+1+Q+wekr538I3nwATp xQIDAQAB -----END PUBLIC KEY----- &lt;/<SPAN class="">Value</SPAN>&gt; &lt;/<SPAN class="">PublicKey</SPAN>&gt;</PRE></DIV><P>This is not recommended for production but can help to identify the problem.</P><DIV class=""><H4 id="toc-hId--108792244">Problem: "Invalid Claim: claim(aud)" error</H4></DIV><P><STRONG>Symptoms</STRONG>: Different Job Scheduler instance gets 401 with audience claim error</P><P><STRONG>Solution</STRONG>: This is expected! The audience validation ensures only your specific Job Scheduler instance can call the API. If you need multiple instances to access it, you'd need to:</P><UL><LI>Add multiple<SPAN>&nbsp;</SPAN><CODE>&lt;Audience&gt;</CODE><SPAN>&nbsp;</SPAN>elements in the policy</LI></UL><DIV class=""><H4 id="toc-hId--305305749">Problem: Job shows COMPLETED but integration didn't run</H4></DIV><P><STRONG>Possible Causes &amp; Solutions</STRONG>:</P><OL><LI><STRONG>Check API routing</STRONG>: Ensure the API proxy is properly routing to your integration flow</LI><LI><STRONG>Check integration flow status</STRONG>: Verify it's deployed and running in Integration Suite</LI><LI><STRONG>Review integration logs</STRONG>: Check the integration flow monitoring for errors</LI></OL><DIV class=""><H3 id="toc-hId--208416247">Debug API</H3></DIV><P>Inside the Integration Suite you can check the API calls in the<SPAN>&nbsp;</SPAN><STRONG>Test</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>Debug</STRONG><SPAN>&nbsp;</SPAN>section:</P><OL><LI>Navigate to your API in Integration Suite</LI><LI>Go to<SPAN>&nbsp;</SPAN><STRONG>Test</STRONG><SPAN>&nbsp;</SPAN>tab</LI><LI>Enable<SPAN>&nbsp;</SPAN><STRONG>Debug Session</STRONG></LI><LI>Trigger a call from Job Scheduler</LI><LI>Review the debug trace to see:<UL><LI>Which policies executed</LI><LI>JWT token validation results</LI><LI>Request/response headers and body</LI></UL></LI></OL><P>This is extremely helpful for understanding what's happening at each step of the policy flow.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="debug-session.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/361900i31839573C1AAA676/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="debug-session.png" alt="debug-session.png" /></span></P><DIV class=""><H3 id="toc-hId--404929752">Additional Resources</H3></DIV><UL><UL><LI><A href="https://help.sap.com/docs/job-scheduling" target="_blank" rel="noopener noreferrer">SAP Job Scheduling Service Documentation</A></LI><LI><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/api-management" target="_blank" rel="noopener noreferrer">SAP Integration Suite API Management</A></LI><LI><A href="https://help.sap.com/viewer/66d066d903c2473f81ec33acfe2ccdb4/Cloud/en-US/277635d687b048448dccfa4402da1bf4.html" target="_blank" rel="noopener noreferrer">JWT Policy Reference</A></LI><LI><A href="https://blogs.sap.com/2019/09/02/blog-series-json-web-tokens-jwt-verification-policies-in-sap-cloud-platform-api-management/" target="_blank" rel="noopener noreferrer">Blog Series: JWT verification using SAP Cloud Platform API Management</A></LI></UL></UL><P>&nbsp;</P><P class="lia-align-center" style="text-align: center;"><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/job-scheduling-service-in-sap-business-technology-platform-overview-of-blog/ba-p/13510707" target="_blank"><EM>For more cool Job Scheduling Service Blog Posts check the Overview page</EM></A></P><HR /><P class="lia-align-center" style="text-align: center;"><STRONG>Happy Scheduling! <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></STRONG></P> 2026-01-16T12:45:07.749000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/lite-plan-deprecation-time-to-upgrade-to-free-sap-job-scheduling-service/ba-p/14314717 🎯 Lite Plan Deprecation: Time to Upgrade to Free! πŸš€ | SAP Job Scheduling service 2026-01-26T12:52:28.885000+01:00 DenisDuev https://community.sap.com/t5/user/viewprofilepage/user-id/180332 <DIV class=""><H1 id="toc-hId-1659580331"><span class="lia-unicode-emoji" title=":direct_hit:">🎯</span> Lite Plan Deprecation: Time to Upgrade to Free! <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></H1></DIV><P>Great news! The SAP Job Scheduling Service is evolving to provide you with better capabilities and a more consistent experience across Trial and Production environments. As part of this evolution, we're saying<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/what-s-new-for-sap-job-scheduling-service" target="_blank" rel="noopener noreferrer">goodbye to the Lite plan</A><SPAN>&nbsp;</SPAN>and inviting everyone to upgrade to the superior<SPAN>&nbsp;</SPAN><STRONG>Free plan</STRONG>! <span class="lia-unicode-emoji" title=":party_popper:">πŸŽ‰</span></P><DIV class="">&nbsp;</DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="hero-deprecate-lite.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/365204i560CEB06E157FD27/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="hero-deprecate-lite.png" alt="hero-deprecate-lite.png" /></span></P><DIV class=""><H2 id="toc-hId-1592149545"><span class="lia-unicode-emoji" title=":calendar:">πŸ“…</span> Important Timeline</H2></DIV><P>Here's what you need to know:</P><P><STRONG>Date</STRONG><STRONG>Event</STRONG><STRONG>Status</STRONG></P><TABLE><TBODY><TR><TD><STRONG>22 January 2026</STRONG></TD><TD>Lite plan officially deprecated on SAP BTP Trial</TD><TD><span class="lia-unicode-emoji" title=":warning:">⚠️</span><SPAN>&nbsp;</SPAN>Announced</TD></TR><TR><TD><STRONG>19 February 2026</STRONG></TD><TD>Last day to create new Lite plan instances</TD><TD><span class="lia-unicode-emoji" title=":locked:">πŸ”’</span> No new instances</TD></TR><TR><TD><STRONG>Going forward</STRONG></TD><TD>Existing Lite instances will be removed</TD><TD><span class="lia-unicode-emoji" title=":recycling_symbol:">♻️</span> Migrate to Free</TD></TR></TBODY></TABLE><BLOCKQUOTE><P><STRONG><span class="lia-unicode-emoji" title=":information:">ℹ️</span> Note:</STRONG><SPAN>&nbsp;</SPAN>SAP BTP Trial accounts typically live for 90 days. Your existing Lite instances will be removed as part of the natural trial lifecycle.</P></BLOCKQUOTE><P>If you want to stay up-to-date with the latest announcements, check out the<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/what-s-new-for-sap-job-scheduling-service" target="_blank" rel="noopener noreferrer">SAP Job Scheduling Service What's New</A><SPAN>&nbsp;</SPAN>page.</P><DIV class=""><H2 id="toc-hId-1395636040"><span class="lia-unicode-emoji" title=":glowing_star:">🌟</span> Why This Change is Good News</H2></DIV><P>The Lite plan served us well, but it was time for an upgrade! Here's why the Free plan is a much better choice:</P><DIV class=""><H3 id="toc-hId-1328205254">Lite Plan Limitations <span class="lia-unicode-emoji" title=":confused_face:">πŸ˜•</span></H3></DIV><UL><LI><span class="lia-unicode-emoji" title=":locked_with_key:">πŸ”</span> Basic authentication only (outdated security model)</LI><LI><span class="lia-unicode-emoji" title=":counterclockwise_arrows_button:">πŸ”„</span> Works differently than production Standard plan (confusing!)</LI><LI><span class="lia-unicode-emoji" title=":books:">πŸ“š</span> Limited REST API capabilities</LI><LI><span class="lia-unicode-emoji" title=":office_building:">🏒</span> No multitenancy support</LI><LI><span class="lia-unicode-emoji" title=":graduation_cap:">πŸŽ“</span> Steeper learning curve when moving to production</LI></UL><DIV class=""><H3 id="toc-hId-1131691749">Free Plan Advantages <span class="lia-unicode-emoji" title=":confetti_ball:">🎊</span></H3></DIV><UL><LI><span class="lia-unicode-emoji" title=":locked:">πŸ”’</span><SPAN>&nbsp;</SPAN><STRONG>OAuth 2.0 authentication</STRONG><SPAN>&nbsp;</SPAN>- Modern, secure, production-ready</LI><LI><span class="lia-unicode-emoji" title=":direct_hit:">🎯</span><SPAN>&nbsp;</SPAN><STRONG>Works like Standard plan</STRONG><SPAN>&nbsp;</SPAN>- Smooth transition to production</LI><LI><span class="lia-unicode-emoji" title=":rocket:">πŸš€</span><SPAN>&nbsp;</SPAN><STRONG>Full REST API support</STRONG><SPAN>&nbsp;</SPAN>- All features unlocked</LI><LI><span class="lia-unicode-emoji" title=":office_building:">🏒</span><SPAN>&nbsp;</SPAN><STRONG>Multitenancy ready</STRONG><SPAN>&nbsp;</SPAN>- Build tenant-aware solutions</LI><LI><span class="lia-unicode-emoji" title=":sparkles:">✨</span><SPAN>&nbsp;</SPAN><STRONG>Better integration</STRONG><SPAN>&nbsp;</SPAN>- Works seamlessly with other BTP services</LI><LI><span class="lia-unicode-emoji" title=":bar_chart:">πŸ“Š</span><SPAN>&nbsp;</SPAN><STRONG>More capabilities</STRONG><SPAN>&nbsp;</SPAN>- Alert Notification Service, Cloud Foundry tasks, and more!</LI></UL><DIV class=""><H2 id="toc-hId-806095525"><span class="lia-unicode-emoji" title=":bar_chart:">πŸ“Š</span> Plan Comparison: Lite vs. Free vs. Standard</H2></DIV><P>Here's a detailed comparison to help you understand the differences:</P><P>FeatureLite (Deprecated)Free <span class="lia-unicode-emoji" title=":star:">⭐</span>Standard</P><TABLE><TBODY><TR><TD><STRONG>Availability</STRONG></TD><TD>Trial only πŸ§ͺ</TD><TD>Trial only πŸ§ͺ (for now)</TD><TD>Trial &amp; Production <span class="lia-unicode-emoji" title=":globe_showing_europe_africa:">🌍</span></TD></TR><TR><TD><STRONG>Authentication</STRONG></TD><TD>Basic Auth <span class="lia-unicode-emoji" title=":unlocked:">πŸ”“</span></TD><TD>OAuth 2.0 <span class="lia-unicode-emoji" title=":locked:">πŸ”’</span></TD><TD>OAuth 2.0 <span class="lia-unicode-emoji" title=":locked:">πŸ”’</span></TD></TR><TR><TD><STRONG>Security Model</STRONG></TD><TD>Username/Password</TD><TD>JWT tokens</TD><TD>JWT tokens</TD></TR><TR><TD><STRONG>Number of Schedules</STRONG></TD><TD>Limited 15<SPAN>&nbsp;</SPAN><span class="lia-unicode-emoji" title=":warning:">⚠️</span></TD><TD>Limited 15<SPAN>&nbsp;</SPAN><span class="lia-unicode-emoji" title=":warning:">⚠️</span></TD><TD>Unlimited <span class="lia-unicode-emoji" title=":infinity:">β™Ύ</span>️</TD></TR><TR><TD><STRONG>Minimal Interval</STRONG></TD><TD>1 hour <span class="lia-unicode-emoji" title=":alarm_clock:">⏰</span></TD><TD>1 hour <span class="lia-unicode-emoji" title=":alarm_clock:">⏰</span></TD><TD>5 minutes <span class="lia-unicode-emoji" title=":high_voltage:">⚑</span></TD></TR><TR><TD><STRONG>Multitenancy</STRONG></TD><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD><STRONG>Alert Notification Service</STRONG></TD><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD><STRONG>Cloud ALM Monitoring</STRONG></TD><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD><STRONG>Alignment with Standard</STRONG></TD><TD>Different behavior</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD>-</TD></TR><TR><TD><STRONG>Support</STRONG></TD><TD>Community <span class="lia-unicode-emoji" title=":busts_in_silhouette:">πŸ‘₯</span></TD><TD>Community <span class="lia-unicode-emoji" title=":busts_in_silhouette:">πŸ‘₯</span></TD><TD>SLA-backed <span class="lia-unicode-emoji" title=":shield:">πŸ›‘</span>️</TD></TR><TR><TD><STRONG>Production Ready</STRONG></TD><TD>Learning</TD><TD>Learning/Prototyping</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> Yes</TD></TR></TBODY></TABLE><BLOCKQUOTE><P><STRONG><span class="lia-unicode-emoji" title=":light_bulb:">πŸ’‘</span> Key Takeaway:</STRONG><SPAN>&nbsp;</SPAN>Free plan gives you almost the same capabilities as Standard plan, just with thoughtful limitations perfect for learning and prototyping. When you're ready for production, the transition is seamless!</P></BLOCKQUOTE><DIV class=""><H2 id="toc-hId-609582020"><span class="lia-unicode-emoji" title=":wrapped_gift:">🎁</span> What You Get with the Free Plan</H2></DIV><P>Let's celebrate what the Free plan brings to the table:</P><DIV class=""><H3 id="toc-hId-542151234"><span class="lia-unicode-emoji" title=":alarm_clock:">⏰</span> Hourly Scheduling</H3></DIV><P>Schedule jobs every hour - perfect for periodic reports, cleanup tasks, and regular data processing.</P><DIV class=""><H3 id="toc-hId-345637729"><span class="lia-unicode-emoji" title=":bar_chart:">πŸ“Š</span> 15 Schedules</H3></DIV><P>More than enough for learning, testing, and small applications. Build real-world solutions without hitting limits!</P><DIV class=""><H3 id="toc-hId-149124224"><span class="lia-unicode-emoji" title=":bell:">πŸ””</span> Unlimited Alert Notifications</H3></DIV><P>Integrate with SAP Alert Notification Service to get notified when jobs succeed or fail.</P><DIV class=""><H3 id="toc-hId--122620650"><span class="lia-unicode-emoji" title=":locked:">πŸ”’</span> Production-Like Security</H3></DIV><P>Learn OAuth 2.0 authentication in Trial, so you're ready for production. No re-learning required!</P><DIV class=""><H3 id="toc-hId--319134155"><span class="lia-unicode-emoji" title=":office_building:">🏒</span> Multitenancy Support</H3></DIV><P>Build and test tenant-aware applications right in your Trial account.</P><DIV class=""><H3 id="toc-hId--515647660"><span class="lia-unicode-emoji" title=":rocket:">πŸš€</span> Full Feature Set</H3></DIV><P>Access to Cloud Foundry tasks, async jobs, REST API - everything you need to build sophisticated scheduling solutions!</P><DIV class=""><H2 id="toc-hId--418758158"><span class="lia-unicode-emoji" title=":direct_hit:">🎯</span> Who Should Use the Free Plan?</H2></DIV><P>The Free plan is perfect for:</P><UL><LI><span class="lia-unicode-emoji" title=":graduation_cap:">πŸŽ“</span><SPAN>&nbsp;</SPAN><STRONG>Students &amp; Learners</STRONG><SPAN>&nbsp;</SPAN>- Explore Job Scheduling without costs</LI><LI>πŸ§ͺ<SPAN>&nbsp;</SPAN><STRONG>Developers</STRONG><SPAN>&nbsp;</SPAN>- Prototype and test scheduling logic</LI><LI><span class="lia-unicode-emoji" title=":artist_palette:">🎨</span><SPAN>&nbsp;</SPAN><STRONG>Proof of Concepts</STRONG><SPAN>&nbsp;</SPAN>- Build demos and validate ideas</LI><LI><span class="lia-unicode-emoji" title=":books:">πŸ“š</span><SPAN>&nbsp;</SPAN><STRONG>Tutorial Followers</STRONG><SPAN>&nbsp;</SPAN>- Work through our blog posts and documentation</LI><LI><span class="lia-unicode-emoji" title=":rocket:">πŸš€</span><SPAN>&nbsp;</SPAN><STRONG>Indie Developers</STRONG><SPAN>&nbsp;</SPAN>- Power personal projects and experiments</LI><LI><span class="lia-unicode-emoji" title=":office_building:">🏒</span><SPAN>&nbsp;</SPAN><STRONG>Enterprises</STRONG><SPAN>&nbsp;</SPAN>- Evaluate features before production deployment</LI></UL><DIV class=""><H2 id="toc-hId--615271663"><span class="lia-unicode-emoji" title=":rocket:">πŸš€</span> Getting Started with Free Plan</H2></DIV><P>Ready to make the switch? It's easy!</P><DIV class=""><H3 id="toc-hId--1105188175"><span class="lia-unicode-emoji" title=":keycap_1:">1️⃣</span> Create a Free Plan Instance</H3></DIV><P>Using the<SPAN>&nbsp;</SPAN><STRONG>SAP BTP Cockpit:</STRONG></P><OL><LI>Navigate to your<SPAN>&nbsp;</SPAN><A href="https://cockpit.hanatrial.ondemand.com/" target="_blank" rel="nofollow noopener noreferrer">Trial subaccount</A></LI><LI>Go to<SPAN>&nbsp;</SPAN><STRONG>Service Marketplace</STRONG></LI><LI>Find<SPAN>&nbsp;</SPAN><STRONG>SAP Job Scheduling Service</STRONG></LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Create</STRONG></LI><LI>Select service plan:<SPAN>&nbsp;</SPAN><STRONG>free</STRONG></LI><LI>Follow the wizard to complete creation</LI></OL><P>Using the<SPAN>&nbsp;</SPAN><STRONG>Cloud Foundry CLI:</STRONG></P><DIV class=""><PRE>cf create-service jobscheduler free my-scheduler-free</PRE></DIV><DIV class=""><H3 id="toc-hId--1301701680"><span class="lia-unicode-emoji" title=":keycap_2:">2️⃣</span> Bind to Your Application</H3></DIV><P>In your<SPAN>&nbsp;</SPAN><CODE>manifest.yml</CODE>:</P><DIV class=""><PRE><SPAN class="">applications</SPAN>: - <SPAN class="">name</SPAN>: <SPAN class="">my-app</SPAN> <SPAN class="">services</SPAN>: - <SPAN class="">my-scheduler-free</SPAN></PRE></DIV><P>Or create a service key for REST API access:</P><DIV class=""><PRE>cf create-service-key my-scheduler-free my-key cf service-key my-scheduler-free my-key</PRE></DIV><DIV class=""><H3 id="toc-hId--1498215185"><span class="lia-unicode-emoji" title=":keycap_3:">3️⃣</span> Start Scheduling!</H3></DIV><P>Access the dashboard or use the REST API to create your first scheduled job!</P><DIV class=""><H2 id="toc-hId--1401325683"><span class="lia-unicode-emoji" title=":confetti_ball:">🎊</span> Embrace the Upgrade!</H2></DIV><P>This change is all about giving you a better experience. The Free plan:</P><UL><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>Teaches you production patterns</STRONG><SPAN>&nbsp;</SPAN>- No surprises when you go live</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>Unlocks more features</STRONG><SPAN>&nbsp;</SPAN>- Do more with your Trial account</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>Simplifies your journey</STRONG><SPAN>&nbsp;</SPAN>- One security model to learn</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>Future-proofs your code</STRONG><SPAN>&nbsp;</SPAN>- OAuth 2.0 is the standard</LI></UL><P>We're excited for you to experience the improved capabilities of the Free plan! <span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></P><HR /><DIV class=""><H2 id="toc-hId--1597839188"><span class="lia-unicode-emoji" title=":memo:">πŸ“</span> Appendix: Migration Guide (Optional)</H2></DIV><P>If you currently have applications using the Lite plan and want to migrate to the Free plan, here's what you need to know:</P><DIV class=""><H3 id="toc-hId--1919572009">Key Differences to Handle</H3></DIV><DIV class=""><H4 id="toc-hId-1885478775"><span class="lia-unicode-emoji" title=":locked_with_key:">πŸ”</span> Authentication Change: Basic Auth β†’ OAuth 2.0</H4></DIV><P><STRONG>Lite Plan (Basic Auth):</STRONG></P><DIV class=""><PRE><SPAN class="">// Simple HTTP basic authentication</SPAN> <SPAN class="">const</SPAN> <SPAN class="">credentials</SPAN> <SPAN class="">=</SPAN> <SPAN class="">Buffer</SPAN><SPAN class="">.</SPAN><SPAN class="">from</SPAN><SPAN class="">(</SPAN><SPAN class="">`<SPAN class=""><SPAN class="">${</SPAN>username<SPAN class="">}</SPAN></SPAN>:<SPAN class=""><SPAN class="">${</SPAN>password<SPAN class="">}</SPAN></SPAN>`</SPAN><SPAN class="">)</SPAN><SPAN class="">.</SPAN><SPAN class="">toString</SPAN><SPAN class="">(</SPAN><SPAN class="">'base64'</SPAN><SPAN class="">)</SPAN><SPAN class="">;</SPAN> <SPAN class="">const</SPAN> <SPAN class="">response</SPAN> <SPAN class="">=</SPAN> <SPAN class="">await</SPAN> <SPAN class="">fetch</SPAN><SPAN class="">(</SPAN><SPAN class="">jobUrl</SPAN><SPAN class="">,</SPAN> <SPAN class="">{</SPAN> <SPAN class="">headers</SPAN>: <SPAN class="">{</SPAN> <SPAN class="">'Authorization'</SPAN>: <SPAN class="">`Basic <SPAN class=""><SPAN class="">${</SPAN>credentials<SPAN class="">}</SPAN></SPAN>`</SPAN> <SPAN class="">}</SPAN> <SPAN class="">}</SPAN><SPAN class="">)</SPAN><SPAN class="">;</SPAN></PRE></DIV><P><STRONG>Free Plan (OAuth 2.0):</STRONG></P><DIV class=""><PRE><SPAN class="">// OAuth 2.0 with JWT tokens</SPAN> <SPAN class="">const</SPAN> <SPAN class="">xsenv</SPAN> <SPAN class="">=</SPAN> <SPAN class="">require</SPAN><SPAN class="">(</SPAN><SPAN class="">'@sap/xsenv'</SPAN><SPAN class="">)</SPAN><SPAN class="">;</SPAN> <SPAN class="">const</SPAN> <SPAN class="">passport</SPAN> <SPAN class="">=</SPAN> <SPAN class="">require</SPAN><SPAN class="">(</SPAN><SPAN class="">'passport'</SPAN><SPAN class="">)</SPAN><SPAN class="">;</SPAN> <SPAN class="">const</SPAN> <SPAN class="">{</SPAN> JWTStrategy <SPAN class="">}</SPAN> <SPAN class="">=</SPAN> <SPAN class="">require</SPAN><SPAN class="">(</SPAN><SPAN class="">'@sap/xssec'</SPAN><SPAN class="">)</SPAN><SPAN class="">;</SPAN> <SPAN class="">// Configure authentication</SPAN> <SPAN class="">passport</SPAN><SPAN class="">.</SPAN><SPAN class="">use</SPAN><SPAN class="">(</SPAN><SPAN class="">new</SPAN> <SPAN class="">JWTStrategy</SPAN><SPAN class="">(</SPAN><SPAN class="">xsenv</SPAN><SPAN class="">.</SPAN><SPAN class="">getServices</SPAN><SPAN class="">(</SPAN><SPAN class="">{</SPAN> <SPAN class="">uaa</SPAN>: <SPAN class="">{</SPAN> <SPAN class="">tag</SPAN>: <SPAN class="">'xsuaa'</SPAN> <SPAN class="">}</SPAN> <SPAN class="">}</SPAN><SPAN class="">)</SPAN><SPAN class="">.</SPAN><SPAN class="">uaa</SPAN><SPAN class="">)</SPAN><SPAN class="">)</SPAN><SPAN class="">;</SPAN> <SPAN class="">app</SPAN><SPAN class="">.</SPAN><SPAN class="">use</SPAN><SPAN class="">(</SPAN><SPAN class="">passport</SPAN><SPAN class="">.</SPAN><SPAN class="">initialize</SPAN><SPAN class="">(</SPAN><SPAN class="">)</SPAN><SPAN class="">)</SPAN><SPAN class="">;</SPAN> <SPAN class="">app</SPAN><SPAN class="">.</SPAN><SPAN class="">use</SPAN><SPAN class="">(</SPAN><SPAN class="">passport</SPAN><SPAN class="">.</SPAN><SPAN class="">authenticate</SPAN><SPAN class="">(</SPAN><SPAN class="">'JWT'</SPAN><SPAN class="">,</SPAN> <SPAN class="">{</SPAN> <SPAN class="">session</SPAN>: <SPAN class="">false</SPAN> <SPAN class="">}</SPAN><SPAN class="">)</SPAN><SPAN class="">)</SPAN><SPAN class="">;</SPAN></PRE></DIV><DIV class=""><H4 id="toc-hId-1688965270"><span class="lia-unicode-emoji" title=":package:">πŸ“¦</span> Service Binding Changes</H4></DIV><P><STRONG>Lite Plan:</STRONG></P><UL><LI>No XSUAA service binding required</LI><LI>Simple username/password from service key</LI></UL><P><STRONG>Free Plan:</STRONG></P><UL><LI>Requires XSUAA service instance and binding</LI><LI>Uses JWT tokens for authentication</LI><LI>Service-to-service communication with OAuth 2.0</LI></UL><DIV class=""><H4 id="toc-hId-1492451765"><span class="lia-unicode-emoji" title=":wrench:">πŸ”§</span> Migration Steps</H4></DIV><OL><LI><P><STRONG>Create Free plan instance</STRONG></P><DIV class=""><PRE>cf create-service jobscheduler free my-scheduler-free</PRE></DIV></LI><LI><P><STRONG>Create or update XSUAA service instance</STRONG></P><P>Create<SPAN>&nbsp;</SPAN><CODE>xs-security.json</CODE>:</P><DIV class=""><PRE>{ <SPAN class="">"xsappname"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>my-app<SPAN class="">"</SPAN></SPAN>, <SPAN class="">"scopes"</SPAN>: [ { <SPAN class="">"name"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>$XSAPPNAME.Jobs<SPAN class="">"</SPAN></SPAN>, <SPAN class="">"description"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>SAP Job Scheduling service Scope<SPAN class="">"</SPAN></SPAN>, <SPAN class="">"grant-as-authority-to-apps"</SPAN>: [ <SPAN class=""><SPAN class="">"</SPAN>$XSSERVICENAME(my-scheduler-free)<SPAN class="">"</SPAN></SPAN> ] } ] }</PRE></DIV><BLOCKQUOTE><P><span class="lia-unicode-emoji" title=":open_book:">πŸ“–</span> Learn more:<SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/secure-access" target="_blank" rel="noopener noreferrer">Secure Access to Job Scheduling Service</A></P></BLOCKQUOTE><P>Create XSUAA instance:</P><DIV class=""><PRE>cf create-service xsuaa application my-xsuaa -c xs-security.json</PRE></DIV></LI><LI><P><STRONG>Update your application</STRONG></P><P>Add dependencies to<SPAN>&nbsp;</SPAN><CODE>package.json</CODE>:</P><DIV class=""><PRE>{ <SPAN class="">"dependencies"</SPAN>: { <SPAN class="">"@sap/xsenv"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>^5.3.0<SPAN class="">"</SPAN></SPAN>, <SPAN class="">"@sap/xssec"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>^4.2.5<SPAN class="">"</SPAN></SPAN>, <SPAN class="">"passport"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>^0.7.0<SPAN class="">"</SPAN></SPAN>, <SPAN class="">"express"</SPAN>: <SPAN class=""><SPAN class="">"</SPAN>^4.21.2<SPAN class="">"</SPAN></SPAN> } }</PRE></DIV></LI><LI><P><STRONG>Update manifest.yml</STRONG></P><DIV class=""><PRE><SPAN class="">applications</SPAN>: - <SPAN class="">name</SPAN>: <SPAN class="">my-app</SPAN> <SPAN class="">services</SPAN>: - <SPAN class="">my-scheduler-free</SPAN> - <SPAN class="">my-xsuaa</SPAN></PRE></DIV></LI><LI><P><STRONG>Redeploy your application</STRONG></P><DIV class=""><PRE>cf push</PRE></DIV></LI></OL><DIV class=""><H3 id="toc-hId-1589341267"><span class="lia-unicode-emoji" title=":light_bulb:">πŸ’‘</span> Need Help?</H3></DIV><P>You can just drop a comment to start a discussion or look through the following resources:</P><UL><LI><span class="lia-unicode-emoji" title=":open_book:">πŸ“–</span><SPAN>&nbsp;</SPAN><A href="https://help.sap.com/docs/JOB_SCHEDULER" target="_blank" rel="noopener noreferrer">Job Scheduling Service Documentation</A></LI><LI><span class="lia-unicode-emoji" title=":globe_with_meridians:">🌐</span><SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-q-a/bd-p/technology-questions" target="_blank">SAP Community</A></LI><LI><span class="lia-unicode-emoji" title=":books:">πŸ“š</span><SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/job-scheduler-in-sap-business-technology-platform-overview-of-blog-posts/ba-p/13510707" target="_blank">All Job Scheduler Blog Posts</A></LI></UL><HR /><P class="lia-align-center" style="text-align: center;"><STRONG>Happy Scheduling with your new Free plan! <span class="lia-unicode-emoji" title=":party_popper:">πŸŽ‰</span><span class="lia-unicode-emoji" title=":rocket:">πŸš€</span></STRONG></P><P class="lia-align-center" style="text-align: center;"><EM>The SAP Job Scheduling Service Team</EM></P> 2026-01-26T12:52:28.885000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/mastering-kyma-multi-tenancy-mapping-namespaces-to-different-btp/ba-p/14316995 Mastering Kyma Multi-Tenancy: Mapping namespaces to different BTP Subaccounts 2026-01-29T07:09:07.312000+01:00 ChristianWeiss https://community.sap.com/t5/user/viewprofilepage/user-id/136917 <H2 id="toc-hId-1788724800"><SPAN>Introduction</SPAN></H2><P><SPAN>In the world of SAP BTP, the </SPAN><STRONG>Kyma runtime</STRONG><SPAN><STRONG> is often seen as an expensive resource</STRONG>, as by default, a Kyma cluster is tied to the subaccount where it was created. This means every BTP Service Instance you create in your Kyma Cluster using the pre-install <A href="https://github.com/SAP/sap-btp-service-operator" target="_self" rel="nofollow noopener noreferrer">BTP Service Operator</A> is provisioned in that single "home" subaccount.</SPAN></P><P><SPAN>However, to leverage Kyma with <STRONG>keeping costs low you need to share one cluster across multiple applications / provider</STRONG> <STRONG>subaccounts.</STRONG> To do this properly, you must be able to isolate entitlements and manage application-specific services in dedicated so-called provider subaccounts.</SPAN></P><P><SPAN>In this post, I will show you how to achieve a </SPAN><STRONG>1:1 mapping between a Kyma Namespace and a BTP Subaccount</STRONG><SPAN>.</SPAN></P><H2 id="toc-hId-1592211295"><STRONG>The Core Concept: Overriding the default BTP Service Operator configuration</STRONG></H2><P><SPAN>The magic happens via the </SPAN><STRONG>SAP BTP Service Operator</STRONG><SPAN>. By default, it uses a cluster-wide configuration. However, if you create a secret named </SPAN><SPAN>sap-btp-service-operator</SPAN><SPAN> with the label </SPAN><SPAN>services.cloud.sap.com/config: "true"</SPAN><SPAN> inside a specific namespace, the operator will prioritize those credentials for any resource created in that namespace.</SPAN></P><H2 id="toc-hId-1395697790"><STRONG>Option 1: The manual approach</STRONG></H2><P><SPAN>If you want to quickly test this for a single project, follow these steps:</SPAN></P><H3 id="toc-hId-1328267004"><STRONG>1. Prepare the Provider Subaccount</STRONG></H3><OL><LI><SPAN>Go to your </SPAN><STRONG>Provider BTP Subaccount</STRONG><SPAN>.</SPAN></LI><LI><SPAN>Create a Service Instance for </SPAN><STRONG>Service Manager</STRONG><SPAN> using the plan </SPAN><SPAN>service-operator-access</SPAN><SPAN>.</SPAN></LI><LI><SPAN>Create a </SPAN><STRONG>Service Binding</STRONG><SPAN> and note the following: </SPAN><SPAN>clientid</SPAN><SPAN>, </SPAN><SPAN>clientsecret</SPAN><SPAN>, </SPAN><SPAN>sm_url</SPAN><SPAN>, and the </SPAN><SPAN>url</SPAN><SPAN> (which we will use as </SPAN><SPAN>tokenurl</SPAN><SPAN>).</SPAN></LI></OL><H3 id="toc-hId-1131753499"><STRONG>2. Create the Secret in Kyma</STRONG></H3><P><SPAN>Apply the following YAML template adjusted to your configuration to your specific application namespace (e.g., </SPAN><SPAN>incident</SPAN><SPAN>). This tells Kyma to "look" at the provider subaccount instead of the default one which is configured under your kyma-system namespace.&nbsp;</SPAN></P><pre class="lia-code-sample language-yaml"><code>apiVersion: v1 kind: Secret metadata: name: sap-btp-service-operator namespace: incident labels: services.cloud.sap.com/config: "true" # Mandatory label type: Opaque stringData: clientid: "&lt;cliendid&gt;" clientsecret: "&lt;clientsecret&gt;" sm_url: "https://service-manager.cfapps.us10.hana.ondemand.com" tokenurl: "https://your-subaccount.authentication.us10.hana.ondemand.com" tokenurlsuffix: "/oauth/token"</code></pre><H2 id="toc-hId-806157275"><STRONG>Option 2: The automated approach using Terraform</STRONG></H2><P><SPAN>Doing this manually is exhausting and error-prone. Using the </SPAN><STRONG>SAP BTP Terraform Provider</STRONG><SPAN>, you can automate the entire "handshake" between the subaccount and the Kyma cluster.</SPAN></P><P><SPAN>Create a folder where you place the following 2 Terraform files.</SPAN></P><H3 id="toc-hId-738726489"><SPAN>1. File provider.tf </SPAN></H3><pre class="lia-code-sample language-yaml"><code>terraform { required_providers { btp = { source = "SAP/btp" version = "1.18.1" # Use the latest stable version } kubernetes = { source = "hashicorp/kubernetes" version = "~&gt; 2.0" } } } # Configure the BTP Provider provider "btp" { globalaccount = "xxxxtrial-ga" # "your-global-account-subdomain" # Credentials are best passed via Environment Variables # (BTP_USERNAME and BTP_PASSWORD) } # Configure the Kubernetes Provider provider "kubernetes" { # This targets your current active Kyma context config_path = "~/.kube/config" }</code></pre><H3 id="toc-hId-542212984"><SPAN>2. File main.tf</SPAN></H3><pre class="lia-code-sample language-yaml"><code>variable "provider_subaccount_id" { type = string description = "The GUID of the target BTP Subaccount" } variable "target_kyma_namespace" { type = string description = "The Namespace created and mapped to the BTP Provider Subaccount" } # 1. Ensure the subaccount is entitled first resource "btp_subaccount_entitlement" "sm_entitlement" { subaccount_id = var.provider_subaccount_id service_name = "service-manager" plan_name = "service-operator-access" } # 2. Lookup the Service Plan ID after entitlement is created data "btp_subaccount_service_plan" "sm_plan" { depends_on = [btp_subaccount_entitlement.sm_entitlement] subaccount_id = var.provider_subaccount_id offering_name = "service-manager" name = "service-operator-access" } # 3. Create the Service Manager instance using the plan ID resource "btp_subaccount_service_instance" "sm_operator_access" { depends_on = [data.btp_subaccount_service_plan.sm_plan] subaccount_id = var.provider_subaccount_id serviceplan_id = data.btp_subaccount_service_plan.sm_plan.id name = "sm-operator-for-kyma" } # 4. Create the Service Binding resource "btp_subaccount_service_binding" "sm_binding" { subaccount_id = var.provider_subaccount_id service_instance_id = btp_subaccount_service_instance.sm_operator_access.id name = "kyma-operator-binding" } # 5. Create the Kubernetes Namespace with Istio enabled resource "kubernetes_namespace" "app_namespace" { metadata { name = var.target_kyma_namespace labels = { "istio-injection" = "enabled" } } } # 6. Create the Secret inside that new Namespace resource "kubernetes_secret" "sap_btp_service_operator" { metadata { name = "sap-btp-service-operator" namespace = kubernetes_namespace.app_namespace.metadata[0].name labels = { "services.cloud.sap.com/config" = "true" } } data = { clientid = jsondecode(btp_subaccount_service_binding.sm_binding.credentials).clientid clientsecret = jsondecode(btp_subaccount_service_binding.sm_binding.credentials).clientsecret sm_url = jsondecode(btp_subaccount_service_binding.sm_binding.credentials).sm_url tokenurl = jsondecode(btp_subaccount_service_binding.sm_binding.credentials).url tokenurlsuffix = "/oauth/token" } type = "Opaque" }</code></pre><P><SPAN>Set your BTP cli credentials as environment variables before running Terraform (prerequisite Terraform, btp cli and kubectl cli are installed on the maschine where you execute it).&nbsp;</SPAN></P><PRE><SPAN>For Bash:<BR /></SPAN><BR /><SPAN>export BTP_USERNAME="your-email@example.com"&nbsp;<BR /></SPAN><BR /><SPAN>export BTP_PASSWORD="your-password"</SPAN></PRE><PRE><SPAN>For Powershell:<BR /></SPAN><BR /><SPAN>$Env:BTP_USERNAME = "your-email@example.com"<BR /><BR />$Env:BTP_PASSWORD = "your-password"</SPAN></PRE><P><SPAN>Run the necessary commands like terraform init, plan, apply or destroy. You can pass the input variables as parameters. Example: </SPAN></P><PRE><SPAN>terraform apply -var="target_kyma_namespace=tf1" -var="provider_subaccount_id=553bcbbb-e809-450f-82db-60de3ef76b1f"</SPAN></PRE><H2 id="toc-hId-216616760"><STRONG>Summary</STRONG></H2><P><SPAN>By using this 1:1 mapping technique, you can:</SPAN></P><UL><LI><STRONG>Reduce Costs:</STRONG><SPAN> Share one Kyma cluster across many applications and business units.</SPAN></LI><LI><STRONG>Isolate Resources:</STRONG><SPAN> Ensures that&nbsp;</SPAN><SPAN>applications are running in a separate namespaces using its services and quotas from its provider subaccount.</SPAN></LI><LI><STRONG>Scale Securely:</STRONG><SPAN> Use Terraform to ensure that credentials are never handled manually by developers and integrate it into your workflows like GitHub Actions.</SPAN></LI></UL><P><SPAN>This makes Kyma not just a powerful developer tool, but as well a cost-effective enterprise platform.</SPAN></P> 2026-01-29T07:09:07.312000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/runtime-threat-detection-for-sap-btp-kyma-with-azure-arc-microsoft-defender/ba-p/14319899 Runtime Threat Detection for SAP BTP Kyma with Azure Arc + Microsoft Defender for Containers 2026-02-02T15:52:32.766000+01:00 haithamshahin https://community.sap.com/t5/user/viewprofilepage/user-id/2275053 <H1 id="securing-an-external-kubernetes-cluster-with-microsoft-defender-for-containers-via-azure-arc-" id="toc-hId-1659730497">Securing an external Kubernetes cluster with Microsoft Defender for Containers (via Azure Arc)</H1><P>When I say "secure Kubernetes", I'm not just thinking about admission policies and CIS checklists. I'm thinking about what happens when <STRONG>something is already running</STRONG> and turns malicious β€” a web shell lands in a pod, a container starts burning CPU for crypto mining, or someone drops network scanning tools into an otherwise boring workload.</P><P>If you're running <STRONG>SAP BTP Kyma runtime</STRONG>, this matters. Kyma has strong <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/kyma-security-concepts#kubernetes-control-plane" target="_blank" rel="noopener noreferrer">platform hardening</A> (Gardener-managed control plane, DISA STIG alignment), and API server audit logs exist β€” but those logs go to <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/auditing-and-logging-information-in-kyma" target="_blank" rel="noopener noreferrer">SAP's Platform Logging Service</A>, not directly to you. That's fine for platform-level auditing, but it's not the same as <STRONG>seeing threats inside your workloads at runtime</STRONG>.</P><P>That's the gap I'm filling: <STRONG>runtime threat detection</STRONG> β€” the ability to detect and alert on malicious activity (crypto mining, web shells, credential theft) while workloads are running.</P><HR /><H2 id="real-world-threats" id="toc-hId-1592299711">Real-world threats</H2><P>These aren't hypotheticals β€” crypto mining and container compromise campaigns are actively targeting Kubernetes clusters:</P><P><STRONG>DERO Cryptojacking (2023–2024)</STRONG>: Attackers scanned for misconfigured Kubernetes API servers, then deployed DaemonSets named "proxy-api" to blend in with legitimate cluster components. The mining process itself was named "pause" β€” masquerading as the standard Kubernetes pause container. CrowdStrike found malicious images with over 10,000 pulls on Docker Hub. <STRONG>How runtime detection helps</STRONG>: Defender's eBPF monitoring catches unusual process spawning from "pause" containers and flags sustained high CPU from processes that shouldn't be compute-intensive. (Source: <A href="https://www.crowdstrike.com/en-us/blog/crowdstrike-discovers-first-ever-dero-cryptojacking-campaign-targeting-kubernetes/" target="_blank" rel="noopener nofollow noreferrer">CrowdStrike β€” DERO Cryptojacking Discovery</A>)</P><P><STRONG>Kinsing Campaign (2023–ongoing)</STRONG>: This campaign exploits vulnerabilities in PostgreSQL, WebLogic, Liferay, and WordPress to gain initial access to containers, then pivots to deploy crypto miners across the cluster. The campaign has affected 75+ cloud-native applications. <STRONG>How runtime detection helps</STRONG>: Defender detects process genealogy anomalies β€” for example, a WebLogic process spawning shell commands that enumerate Kubernetes resources or deploy new containers.</P><P>The pattern: attackers get in through a misconfiguration or vulnerability, then run workloads <STRONG>inside</STRONG> the cluster. Admission policies and CIS benchmarks don't catch threats that start after deployment β€” that's the gap runtime detection fills.</P><HR /><H2 id="the-solution-azure-arc-defender-for-containers" id="toc-hId-1395786206">The solution: Azure Arc + Defender for Containers</H2><P>For non-AKS clusters, the approach is: <STRONG>Azure Arc</STRONG> (makes the cluster an Azure resource) + <STRONG>Defender for Containers</STRONG> (deploys the runtime sensor as an Arc extension).</P><P><STRONG>What gets installed</STRONG>:</P><UL><LI><STRONG>Arc agents</STRONG> (<CODE>azure-arc</CODE> namespace): maintain outbound connection to Azure</LI><LI><STRONG>Defender sensor</STRONG> (DaemonSet on each node): collects runtime telemetry via eBPF β€” process creation, network activity, system calls</LI></UL><P><STRONG>What the sensor detects</STRONG>: crypto mining patterns, web shell activity, network scanning tools, binary drift. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/alerts-containers#workload-runtime-detection" target="_blank" rel="noopener nofollow noreferrer">Workload runtime detection</A>)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="kyma-defender-architecture.png" style="width: 942px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368106iA5FA9AA45DFD92C3/image-size/large?v=v2&amp;px=999" role="button" title="kyma-defender-architecture.png" alt="kyma-defender-architecture.png" /></span></P><P>Arc also provides an <STRONG>extension platform</STRONG> β€” Defender isn't the only add-on you can deploy this way. And Microsoft provides a <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">verification checklist</A> so you can prove it's working.</P><P><STRONG>Networking note</STRONG>: Both Arc and Defender require outbound connectivity. If egress is blocked, onboarding fails silently. Check the <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Arc network requirements</A> and ensure <CODE>*.cloud.defender.microsoft.com:443</CODE> is allowed.</P><HR /><H2 id="how" id="toc-hId-1199272701">How</H2><P>I’ll show a portal-first path (fastest to understand), then a programmatic path (fastest to automate).</P><H3 id="step-0-pre-flight-checklist" id="toc-hId-1131841915">Step 0 β€” Pre-flight checklist</H3><P>Here’s what I personally confirm before I touch the portal:</P><P>1) <STRONG>Network egress (outbound)</STRONG></P><UL><LI>Arc agents require outbound access to a set of URLs (Azure Resource Manager, Entra ID token endpoints, container registries for pulling agent images, and more depending on features). (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes network requirements</A>)</LI><LI>Defender for Containers on Arc requires outbound access to <CODE>*.cloud.defender.microsoft.com:443</CODE>. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</LI></UL><P>2) <STRONG>Tooling</STRONG></P><UL><LI>Azure CLI + the <CODE>connectedk8s</CODE> extension (for Arc onboarding). (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A>)</LI><LI>If I want to script extension deployment, I also install the <CODE>k8s-extension</CODE> extension. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/extensions" target="_blank" rel="noopener nofollow noreferrer">Deploy and manage Arc-enabled Kubernetes extensions</A>)</LI></UL><P>3) <STRONG>Cluster access</STRONG></P><UL><LI><CODE>kubectl</CODE> works and points at the cluster I’m onboarding.</LI><LI>If I’m missing kubeconfig on my workstation, the Kyma Dashboard has a <STRONG>Download kubeconfig</STRONG> link for the cluster.</LI><LI>I sanity-check that my kubeconfig/current context is the Kyma cluster before running anything destructive:</LI></UL><PRE><CODE>kubectl <SPAN class="">config</SPAN> current-<SPAN class="">context</SPAN> kubectl cluster-info</CODE></PRE><UL><LI>I have capacity for Arc agents (the Arc quickstart calls out resource requirements and that agents are deployed on connect). (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A>)</LI></UL><H3 id="step-1-connect-the-cluster-to-azure-arc" id="toc-hId-935328410">Step 1 β€” Connect the cluster to Azure Arc</H3><P>I typically do this from a workstation that already has <CODE>kubectl</CODE> access to the cluster.</P><H4 id="1-1-register-providers-if-needed-" id="toc-hId-867897624">1.1 Register providers (if needed)</H4><P>The Arc quickstart includes registering resource providers like <CODE>Microsoft.Kubernetes</CODE>, <CODE>Microsoft.KubernetesConfiguration</CODE>, and <CODE>Microsoft.ExtendedLocation</CODE>. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A>)</P><H4 id="1-2-run-the-connect-command" id="toc-hId-671384119">1.2 Run the connect command</H4><P>From the Arc quickstart, the core command is:</P><PRE><CODE>az connectedk8s connect --<SPAN class="">name</SPAN> &lt;cluster-<SPAN class="">name</SPAN>&gt; --resource-<SPAN class="">group</SPAN> &lt;resource-<SPAN class="">group</SPAN>&gt;</CODE></PRE><P>In practice, I prefer to be explicit (especially on shared subscriptions) and set <CODE>--location</CODE> and <CODE>--tags</CODE>:</P><PRE><CODE>az connectedk8s connect \ --name <SPAN class="">&lt;cluster-name&gt;</SPAN> \ --resource-group <SPAN class="">&lt;resource-group&gt;</SPAN> \ --location <SPAN class="">&lt;azure-region&gt;</SPAN> \ --<SPAN class="">tags</SPAN> env=<SPAN class="">&lt;env&gt;</SPAN> owner=<SPAN class="">&lt;team&gt;</SPAN> <SPAN class="">system</SPAN>=<SPAN class="">&lt;system&gt;</SPAN> </CODE></PRE><P>What I’m explicitly setting there:</P><UL><LI><CODE>--location</CODE>: the Azure region where the <STRONG>Azure Arc-enabled Kubernetes resource</STRONG> is created. If you omit it, it’s created in the same region as the resource group.</LI><LI><CODE>--tags</CODE>: Azure Resource Manager tags on the Arc resource (space-separated <CODE>key[=value]</CODE>).</LI></UL><P>If this command hangs or fails in weird ways, I go back to egress first β€” the Arc network requirements doc is the authoritative β€œwhat URLs/ports must my cluster reach?” list. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes network requirements</A>)</P><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A> and <A href="https://learn.microsoft.com/en-us/cli/azure/connectedk8s?view=azure-cli-latest#az-connectedk8s-connect" target="_blank" rel="noopener nofollow noreferrer">Azure CLI reference β€” az connectedk8s connect</A>)</P><H4 id="1-3-verify-arc-agents-in-the-cluster" id="toc-hId-474870614">1.3 Verify Arc agents in the cluster</H4><P>The quickstart calls out that Arc deploys agents into the <CODE>azure-arc</CODE> namespace. I validate that they’re <CODE>Running</CODE>:</P><PRE><CODE>kubectl <SPAN class="">get</SPAN> deployments,pods -n azure-<SPAN class="">arc</SPAN> </CODE></PRE><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A>)</P><P>Here’s what that looks like in practice on my Kyma cluster:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="arc-pods-kyma.png" style="width: 904px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368107i5371DF84949A9569/image-size/large?v=v2&amp;px=999" role="button" title="arc-pods-kyma.png" alt="arc-pods-kyma.png" /></span></P><P>And here’s the connected cluster resource in Azure (showing things like connectivity status, location, and tags):</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="arc-kyma-ui.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368108i00A2C62A41C26166/image-size/large?v=v2&amp;px=999" role="button" title="arc-kyma-ui.png" alt="arc-kyma-ui.png" /></span></P><P>At this point, if Arc isn’t healthy, I stop and fix that first. Everything else depends on it.</P><H3 id="step-2-enable-the-containers-plan-in-microsoft-defender-for-cloud" id="toc-hId-149274390">Step 2 β€” Enable the Containers plan in Microsoft Defender for Cloud</H3><P>Now I go to Defender for Cloud and enable the <STRONG>Containers</STRONG> plan for the subscription where my Arc-enabled cluster lives.</P><P>The portal walkthrough is:</P><UL><LI>Microsoft Defender for Cloud β†’ <STRONG>Environment settings</STRONG> β†’ pick subscription β†’ toggle <STRONG>Containers</STRONG> plan On</LI><LI>Select <STRONG>Settings</STRONG> next to the Containers plan β†’ choose <STRONG>Enable specific components</STRONG></LI></UL><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</P><P>At this point you’ll be asked which Containers plan components to enable.</P><P>You <EM>can</EM> enable everything, but for this post I’m intentionally focusing on the <STRONG>Defender sensor</STRONG> (runtime detections). The important callout: <STRONG>from a pricing perspective there’s no cost benefit to enabling one vs. many β€” the cost is the same</STRONG> β€” so this is purely about keeping the walkthrough scoped to runtime detection.</P><P>Here’s what that looks like in the portal (first the Containers plan settings, then the component selection where I keep only the sensor in scope):</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="enable-defender-containers-settings.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368109iBE82CDA5D44C2406/image-size/large?v=v2&amp;px=999" role="button" title="enable-defender-containers-settings.png" alt="enable-defender-containers-settings.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="defender-settings-details.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368110i15410E5DD773E877/image-size/large?v=v2&amp;px=999" role="button" title="defender-settings-details.png" alt="defender-settings-details.png" /></span></P><H3 id="step-3-deploy-defender-components-to-the-arc-enabled-cluster" id="toc-hId--122470484">Step 3 β€” Deploy Defender components to the Arc-enabled cluster</H3><P>I use one of two flows.</P><H4 id="option-a-recommended-deploy-via-defender-for-cloud-recommendations" id="toc-hId--612386996">Option A (recommended): Deploy via Defender for Cloud Recommendations</H4><P>This is the β€œguided remediation” path:</P><UL><LI>Defender for Cloud β†’ <STRONG>Recommendations</STRONG></LI><LI>Find β€œAzure Arc-enabled Kubernetes clusters should have Defender extension installed”</LI><LI>Select the clusters β†’ <STRONG>Fix</STRONG></LI></UL><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</P><H4 id="option-b-deploy-manually-from-the-arc-cluster-resource" id="toc-hId--808900501">Option B: Deploy manually from the Arc cluster resource</H4><P>If I want explicit control (or I’m debugging), I do:</P><UL><LI>Arc-enabled Kubernetes resource β†’ <STRONG>Extensions</STRONG> β†’ <STRONG>+ Add</STRONG></LI><LI>Install <STRONG>Microsoft Defender for Containers</STRONG></LI><LI>Choose/configure the <STRONG>Log Analytics workspace</STRONG> during installation (this is where the extension sends collected logs/telemetry used by Defender for Cloud and Azure Monitor Logs)<UL><LI>I can select an existing workspace, create a new one, or use the default: <CODE>DefaultWorkspace-[subscription-id]-[region]</CODE></LI></UL></LI></UL><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</P><H3 id="step-4-optional-programmatic-deployment-repeatable-automation-" id="toc-hId--712010999">Step 4 (optional) β€” Programmatic deployment (repeatable automation)</H3><P>If I’m onboarding clusters at scale, I don’t want a click path. The programmatic doc gives the Azure CLI commands for creating the Defender extension.</P><P>Defender sensor extension:</P><P>Note: Some examples include an <CODE>auditLogPath</CODE> setting for clusters where you control the API server audit log file location. In Kyma, audit logs are handled via SAP’s Platform Logging Service and you generally don’t have direct access to that file path, so I’m omitting it here.</P><PRE><CODE>az k8s-extension create \ -<SPAN class="">-name microsoft.azuredefender.kubernetes \</SPAN> -<SPAN class="">-cluster-type connectedClusters \</SPAN> -<SPAN class="">-cluster-name &lt;cluster-name&gt; \</SPAN> -<SPAN class="">-resource-group &lt;resource-group&gt; \</SPAN> -<SPAN class="">-extension-type microsoft.azuredefender.kubernetes \</SPAN> -<SPAN class="">-configuration-settings \</SPAN> logAnalyticsWorkspaceResourceID="/subscriptions/&lt;subscription-id&gt;/resourceGroups/&lt;rg&gt;/providers/Microsoft.OperationalInsights/workspaces/&lt;workspace-name&gt;"</CODE></PRE><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-programmatically" target="_blank" rel="noopener nofollow noreferrer">Deploy Defender for Containers on Arc-enabled Kubernetes (programmatic)</A>)</P><P>If you need the generic β€œhow do extensions work / how do I list/update/delete them” reference, the Arc extensions doc is the canonical place. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/extensions" target="_blank" rel="noopener nofollow noreferrer">Deploy and manage Arc-enabled Kubernetes extensions</A>)</P><H3 id="step-5-verify-it-s-actually-working" id="toc-hId--908524504">Step 5 β€” Verify it’s actually working</H3><P>This is where I slow down and prove success.</P><P>Microsoft’s verification checklist is:</P><UL><LI>Arc connection is healthy</LI><LI>Defender extension shows as installed</LI><LI>Sensor pods are running</LI><LI>Alerts appearing</LI></UL><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-1-verify-arc-connectivity" id="toc-hId--1398441016">5.1 Verify Arc connectivity</H4><PRE><CODE>az connectedk8s show \ -<SPAN class="">-name &lt;cluster-name&gt; \</SPAN> -<SPAN class="">-resource-group &lt;resource-group&gt; \</SPAN> -<SPAN class="">-query connectivityStatus</SPAN> </CODE></PRE><P>The expected output is <CODE>Connected</CODE>. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-2-verify-defender-extension-provisioning" id="toc-hId--1594954521">5.2 Verify Defender extension provisioning</H4><PRE><CODE>az k8s-extension show \ -<SPAN class="">-name microsoft.azuredefender.kubernetes \</SPAN> -<SPAN class="">-cluster-type connectedClusters \</SPAN> -<SPAN class="">-cluster-name &lt;cluster-name&gt; \</SPAN> -<SPAN class="">-resource-group &lt;resource-group&gt; \</SPAN> -<SPAN class="">-query provisioningState</SPAN> </CODE></PRE><P>The expected output is <CODE>Succeeded</CODE>. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-3-verify-sensor-pods" id="toc-hId--1791468026">5.3 Verify sensor pods</H4><PRE><CODE>kubectl <SPAN class="">get</SPAN> pods -n kube-<SPAN class="">system</SPAN> -l app=microsoft-defender <SPAN class=""># If you don’t see anything in kube-system, also check the mdc namespace:</SPAN> kubectl <SPAN class="">get</SPAN> ds -n mdc kubectl <SPAN class="">get</SPAN> pods -n mdc</CODE></PRE><P>This is the simplest β€œis the sensor deployed?” check. If the DaemonSet exists and the pods are <CODE>Running</CODE>, you’re in good shape.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="defender-daemonsets.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368111iC3A48CB4F95070E2/image-size/large?v=v2&amp;px=999" role="button" title="defender-daemonsets.png" alt="defender-daemonsets.png" /></span></P><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-4-verify-in-the-portal" id="toc-hId--1987981531">5.4 Verify in the portal</H4><P>This is the β€œdid Azure actually receive the signals?” check.</P><P>After you’ve deployed the Defender extension and the sensor is running, go to <STRONG>Microsoft Defender for Cloud</STRONG> and look at <STRONG>Security alerts</STRONG> (or the Alerts view in the Defender for Cloud experience). If you just ran the simulator (next step), this is where you’ll see the resulting alerts.</P><P>It can take a bit of time (think minutes, not seconds) for the cluster and alerts to show up after onboarding. (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A>)</P><H4 id="5-5-optional-prove-runtime-detection-by-simulating-alerts" id="toc-hId-2110472260">5.5 (Optional) Prove runtime detection by simulating alerts</H4><P>If I want hard proof that the sensor-backed detections are flowing end-to-end, I use Microsoft’s Kubernetes alerts simulation tool.</P><P>It has two prerequisites that matter in practice:</P><UL><LI>Defender for Containers is enabled and the Defender sensor is deployed.</LI><LI>I have admin permissions on the cluster.</LI></UL><P>Then I download and run the simulator:</P><PRE><CODE>curl -O http<SPAN class="">s:</SPAN>//raw.githubusercontent.<SPAN class="">com</SPAN>/microsoft/Defender-<SPAN class="">for</SPAN>-Cloud-Attack-Simulation/refs/heads/main/simulation.<SPAN class="">py</SPAN> <SPAN class="">python</SPAN> simulation.<SPAN class="">py</SPAN> </CODE></PRE><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="run-simulation-alerts.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368112iC3515E0A16A305FC/image-size/large?v=v2&amp;px=999" role="button" title="run-simulation-alerts.png" alt="run-simulation-alerts.png" /></span></P><P>After it runs, I go back to Defender for Cloud and look at the alerts that were generated:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="defender-alerts-simulation.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368113i931D880C4A9ABCFE/image-size/large?v=v2&amp;px=999" role="button" title="defender-alerts-simulation.png" alt="defender-alerts-simulation.png" /></span></P><P>(Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/alerts-containers#kubernetes-alerts-simulation-tool" target="_blank" rel="noopener nofollow noreferrer">Kubernetes alerts β€” Kubernetes alerts simulation tool</A>)</P><H4 id="5-6-inspect-the-alert-details-example-binary-drift-" id="toc-hId-2082142446">5.6 Inspect the alert details (example: binary drift)</H4><P>To make this feel real (and to sanity-check what Defender is actually flagging), I open one of the generated alerts and look at the <STRONG>Alert details</STRONG> pane. For example, the β€œA drift binary detected executing in the container” alert includes fields like the <STRONG>suspicious process path</STRONG>, <STRONG>command line</STRONG>, <STRONG>parent process</STRONG>, and the <STRONG>affected Arc-enabled Kubernetes resource</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="details-drift-binary.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368114i0C069D1D3E3DB66D/image-size/large?v=v2&amp;px=999" role="button" title="details-drift-binary.png" alt="details-drift-binary.png" /></span></P><H3 id="step-6-troubleshooting-the-short-list-" id="toc-hId--2115935348">Step 6 β€” Troubleshooting (the short list)</H3><H4 id="6-1-if-an-extension-is-stuck-check-egress-first" id="toc-hId-1689115436">6.1 If an extension is stuck, check egress first</H4><UL><LI>Arc-required outbound URLs: (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes network requirements</A>)</LI><LI>Defender-required outbound endpoint (<CODE>*.cloud.defender.microsoft.com:443</CODE>) (Docs: <A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A>)</LI></UL><H4 id="6-2-if-things-drift-over-time" id="toc-hId-1492601931">6.2 If things drift over time</H4><P>The Arc extensions doc notes that if Arc agents don’t have network connectivity for an extended period, an extension can transition to <CODE>Failed</CODE>, and you may need to recreate the extension. (Docs: <A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/extensions" target="_blank" rel="noopener nofollow noreferrer">Deploy and manage Arc-enabled Kubernetes extensions</A>)</P><HR /><H2 id="closing-thoughts" id="toc-hId-1882894440">Closing thoughts</H2><P>If you’re running Kubernetes outside AKS, it’s easy to end up with fragmented security tooling. The Arc + Defender for Containers pattern is one of the cleaner ways I’ve found to bring:</P><UL><LI>centralized visibility,</LI><LI>actionable runtime alerts,</LI><LI>and runtime security signals</LI></UL><P>into a hybrid Kubernetes estateβ€”without replatforming.</P><P>In future posts, I’ll explore what else we can do with <STRONG>Kyma + Azure Arc + Azure</STRONG> beyond Defender for Containers (observability, more security patterns, etc.).</P><HR /><H2 id="references-microsoft-learn-" id="toc-hId-1686380935">References (Microsoft Learn)</H2><UL><LI><A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/overview" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes overview</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/network-requirements" target="_blank" rel="noopener nofollow noreferrer">Azure Arc-enabled Kubernetes network requirements</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/quickstart-connect-cluster" target="_blank" rel="noopener nofollow noreferrer">Quickstart: Connect an existing Kubernetes cluster to Azure Arc</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/extensions" target="_blank" rel="noopener nofollow noreferrer">Deploy and manage Arc-enabled Kubernetes extensions</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-portal" target="_blank" rel="noopener nofollow noreferrer">Enable Defender for Containers on Arc-enabled Kubernetes (portal)</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-enable-programmatically" target="_blank" rel="noopener nofollow noreferrer">Deploy Defender for Containers on Arc-enabled Kubernetes (programmatic)</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-arc-verify" target="_blank" rel="noopener nofollow noreferrer">Verify Defender for Containers on Arc-enabled Kubernetes</A></LI><LI><A href="https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-architecture" target="_blank" rel="noopener nofollow noreferrer">Defender for Containers architecture</A></LI></UL> 2026-02-02T15:52:32.766000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/kyma-evolution-transforming-sap-kyma-into-a-tailor-made-saas-platform-for/ba-p/14317418 Kyma Evolution: Transforming SAP Kyma into a tailor-made SaaS Platform for sbs extensions 2026-02-03T07:53:06.319000+01:00 ChristianWeiss https://community.sap.com/t5/user/viewprofilepage/user-id/136917 <H2 id="toc-hId-1788749541"><STRONG>Introduction</STRONG></H2><P><SPAN>Hello SAP Community!</SPAN></P><P data-unlink="true"><SPAN>As an Extensibility Expert, I’m constantly looking for the most efficient ways to build and operate enterprise-grade extensions for the SAP Cloud ERP following the <SPAN><A href="https://www.sap.com/resources/what-is-a-clean-core" target="_self" rel="noopener noreferrer">Clean Core principles</A><SPAN>. We all know the Cloud Application Programming Model (CAP) is the go-to framework for Cloud Native side-by-side Extensions on BTP, but where you run them on large scale matters just as much as how you code it.</SPAN></SPAN>&nbsp;</SPAN></P><P data-unlink="true"><SPAN>Today, I’m starting a 3-part series (<A href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-2-runtime-architecture-amp-cost-efficiency-gains/ba-p/14317915" target="_self">Part 2,</A> <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-3-automated-application-lifecycle-management-in-action/ba-p/14317937" target="_self">Part 3 )</A>&nbsp;"Kyma Evolution". We will explore how the powercouple of Kyma in combination with the <SPAN><A href="https://sap.github.io/cap-operator/" target="_self" rel="nofollow noopener noreferrer">CAP Operator</A><SPAN> provides a scalable, high-performance, cost-effective runtime for CAP Multitenancy SaaS applications. In case you don’t know SAP Kyma and its benefits yet, please have a look at the </SPAN></SPAN><SPAN><A href="https://learning.sap.com/courses/developing-applications-in-sap-btp-kyma-runtime/exploring-the-benefits-of-the-sap-btp-kyma-runtime_f093d2b5-a598-43bb-9a25-e224e97b747a" target="_self" rel="noopener noreferrer">Kyma Learning</A><SPAN> which explains it quite well.&nbsp;</SPAN></SPAN>&nbsp;</SPAN></P><H2 id="toc-hId-1592236036"><STRONG>The paradigm shift: From monolithic to a modular environment</STRONG></H2><P data-unlink="true"><SPAN>For a long time, SAP Kyma was seen as a fixed bundle of tools. You got everything, whether you needed it or not. That has changed. With the <SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/kyma-modules" target="_self" rel="noopener noreferrer">Kyma Module Concept</A><SPAN>, the platform is now modular and extensible.&nbsp;</SPAN></SPAN>&nbsp;</SPAN><SPAN>Even more exciting is the introduction of <SPAN><A href="https://kyma-project.io/external-content/community-modules/docs/user/README.html" target="_self" rel="nofollow noopener noreferrer">Community Modules</A><SPAN>. This means Kyma is no longer limited to what SAP provides out-of-the-box. The community can now contribute extensions. One of the most powerful examples so far is the CAP Operator.&nbsp;</SPAN></SPAN>&nbsp;</SPAN><SPAN>By adding the CAP Operator as a module, you transform a generic Kyma cluster into a specialized CAP SaaS Runtime.</SPAN></P><H2 id="toc-hId-1395722531"><STRONG>The "Smart Broker": Why the CAP Operator is a game-changer</STRONG></H2><P><SPAN>When we compare Kyma to SAP BTP Cloud Foundry, the advantages of using a dedicated Operator become clear. While Cloud Foundry is a great general-purpose platform, the CAP Operator on Kyma acts as a "smart broker" specifically for CAP Applications.</SPAN></P><P><SPAN>Key Benefits for Partners and Customers:</SPAN></P><UL><LI><STRONG>100% Automated Lifecycle Management<SPAN>: </SPAN></STRONG>The Operator understands CAP. It handles application deployment, tenant management, DB model updates, and service bindings automatically and new capabilities like <A href="https://help.sap.com/docs/hana-cloud/sap-hana-cloud-multitenancy/introducing-sap-hana-cloud-multitenancy" target="_self" rel="noopener noreferrer">SAP HANA Cloud Native tenants </A>(<A href="https://www.sap.com/assetdetail/2025/01/fae009ce-f07e-0010-bca6-c68f7e60039b.html" target="_self" rel="noopener noreferrer">Videocast</A>) including tenant backup and restore management can be added once available.</LI><LI><STRONG>Cost-Efficiency via Higher Container Density<SPAN>: </SPAN></STRONG>In contrast to Cloud Foundry, Kyma allows for fine-grained resource limits. This means you can run more services on the same infrastructure, lowering your BTP bill when you are running multiple CAP Applications.</LI><LI><STRONG>Cost-Efficiency via Resource Sharing:</STRONG> Expensive Services like SAP HANA Cloud and Cloud Logging can be shared in CF and Kyma. However we will see in <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-2-runtime-architecture-amp-cost-efficiency-gains/ba-p/14317915" target="_self">Part 2</A> that in the Kyma environment this will be more elegant and simplified using the CAP Operator.</LI><LI><STRONG>Enterprise Resilience &amp; Day-2 Ops:</STRONG> It provides built-in "Reconciliation Loops." If a tenant's database connection fails, the Operator detects and fixes it without human intervention.</LI><LI><STRONG>Advanced Networking &amp; Security (Zero Trust Architecture):</STRONG> One of the most significant advantages over Cloud Foundry is how Kyma handles connectivity. In Cloud Foundry, preventing a service from being publicly accessible often requires manual effort. In Kyma, thanks to the CAP Operator's integration with Istio, your internal&nbsp; services stay cluster-internal by default. You have full control over the attack surface.</LI><LI><STRONG><STRONG>Integrated Domain Management:</STRONG></STRONG><SPAN> Managing Custom Domains becomes a native experience using the CAP Operator. Instead of juggling external services for certificates, you can orchestrate your SaaS-brand URLs directly within the Kyma environment, providing a seamless, secure and automated experience.</SPAN></LI></UL><H2 id="toc-hId-1199209026"><STRONG>The ecosystem enablers: Extensibility using CAP Plugins + Kyma Modules</STRONG></H2><P><SPAN>SAP is providing enablers for the ecosystem on different levels:</SPAN></P><OL><LI><SPAN>At the Infrastructure Level (Kyma): We use Modules (like the CAP Operator) to make the runtime "CAP-aware."</SPAN></LI><LI><SPAN>At the Application Level (CAP): We use <A href="https://cap.cloud.sap/docs/plugins/" target="_blank" rel="noopener nofollow noreferrer">CAP Plugins</A>&nbsp;to add business features like multitenancy or audit logging with a single command.</SPAN></LI><LI>At CAP CLI Level: We can add plugins like <A href="https://github.com/cap-js/cap-operator-plugin" target="_self" rel="nofollow noopener noreferrer">CAP Operator Plugin</A> to the&nbsp;cds cli which provides capabilities to generate CAP Operator resources essential for deploying multi-tenant CAP Applications from your project setup.</LI></OL><P><SPAN>This synergy creates the ultimate development and operations experience. You use plugins to build fast and the Operator to run smart and it enables you to contribute and to add your specific capabilities at any level.</SPAN></P><H2 id="toc-hId-1002695521"><STRONG>Turning Kyma into a CAP Runtime</STRONG></H2><P><SPAN>The beauty of this evolution is simplicity. You can now add the CAP Operator Community Module directly from your Kyma Cockpit using the Add Modules or Modify Modules Button on the Cluster Details Screen.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_0-1769755560640.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367263i51979E8029DF7661/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_0-1769755560640.png" alt="ChristianWeiss_0-1769755560640.png" /></span></P><P><SPAN>The Modules overview shows you the SAP Provided and Managed Modules under the Module Pane and the installed Community Modules in a separate Pane.</SPAN></P><P><SPAN>As a next step use the Add button on the Community Module Pane.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_1-1769755560641.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367261i5C2D6A8A40C33CED/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_1-1769755560641.png" alt="ChristianWeiss_1-1769755560641.png" /></span></P><P><SPAN>On the next screen you need to choose the Add Source YAML’s button to get the list of community modules.&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_2-1769755560643.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367262i9A4373899D1581FA/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_2-1769755560643.png" alt="ChristianWeiss_2-1769755560643.png" /></span></P><P><SPAN>Just keep the defaults and press the Add button.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_3-1769755560644.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367264i3E837B923A2BDF69/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_3-1769755560644.png" alt="ChristianWeiss_3-1769755560644.png" /></span></P><P><SPAN>This will load the list of currently available Community Modules from which you need to check the cap-operator Tile and press Add.&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_4-1769755560644.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367265iB6084074BDFA8A2F/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_4-1769755560644.png" alt="ChristianWeiss_4-1769755560644.png" /></span></P><P><SPAN>This will start the automatic installation of the CAP Operator Components into the namespace called cap-operator-system.&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_5-1769755560646.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367266i317643E1C2BBD9A2/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_5-1769755560646.png" alt="ChristianWeiss_5-1769755560646.png" /></span></P><P><SPAN>The installation and module status will be displayed in the overview and will turn into green after installation is successfully finished.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_6-1769755560646.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367267iDB28E33E752F9095/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_6-1769755560646.png" alt="ChristianWeiss_6-1769755560646.png" /></span></P><P data-unlink="true"><SPAN>By doing this, you aren't just deploying code; you are creating an intelligent system that manages your S/4HANA Multitenancy extensions built with CAP for you as it adds <A href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources" target="_self" rel="nofollow noopener noreferrer">Custom Resources (CRs)</A> like CAPApplication, CAPApplicationVersion, CAP Tenant and other to your cluster. This will enable:&nbsp;</SPAN></P><UL><LI><SPAN>Quick and easy deployment of CAP application backends, router, and related networking components.</SPAN></LI><LI><SPAN>Integration with SAP Software-as-a-Service Provisioning service to handle asynchronous tenant subscription requests, executing provisioning / deprovisioning tasks as Kubernetes jobs.</SPAN></LI><LI><SPAN>Automated upgrades of known tenants as soon as new application versions are available.</SPAN></LI><LI><SPAN>Support for deployment of service-specific content / configuration as a Kubernetes job with every application version (for example, HTML5 application content to SAP HTML5 Application Repository Service).</SPAN></LI><LI>Management of TLS certificates and DNS entries related to the deployed application, with support of customer-specific domains.</LI></UL><P><SPAN>and further capabilities.</SPAN></P><H2 id="toc-hId-806182016"><STRONG>What’s Next?</STRONG></H2><P><SPAN>In <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-2-runtime-architecture-amp-cost-efficiency-gains/ba-p/14317915" target="_self">Part 2</A>, we will dive deeper. We’ll look in more details of the runtime and at a cost benefits to prove why this modular approach is a win for your bottom line.&nbsp;</SPAN><SPAN>What are your thoughts on the modular Kyma concept? Have you tried the CAP Operator yet? Have you ideas for additional community modules for the ecosystem?</SPAN></P> 2026-02-03T07:53:06.319000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/when-innovation-meets-real-business-impact-vnsg-sap-btp-hackathon-2026/ba-p/14321541 When Innovation Meets Real Business Impact - VNSG SAP BTP Hackathon 2026 2026-02-04T13:53:21.455000+01:00 winklero https://community.sap.com/t5/user/viewprofilepage/user-id/426853 <H2 id="toc-hId-1789495363"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VNSG SAP BTP Hackathon.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368932iE299B9A444846322/image-size/large?v=v2&amp;px=999" role="button" title="VNSG SAP BTP Hackathon.png" alt="VNSG SAP BTP Hackathon.png" /></span></H2><P>&nbsp;</P><H2 id="toc-hId-1592981858">&nbsp;<SPAN>A community powered by creativity</SPAN></H2><P class="">The VNSG SAP BTP Hackathon has once again shown what happens when passionate people, real business challenges, and <A href="https://www.sap.com/products/technology-platform.html" target="_blank" rel="noopener noreferrer">SAP Business Technology Platform</A> come together. Teams of customers, partners, and experts turned ideas into tangible solutions that demonstrate how SAP BTP can drive measurable value in day-to-day operations.<SPAN class="">​</SPAN></P><P class="">Over the course of the Hackathon, every team brought its own perspective, business context and technical skills – from integration and automation to SAP Business AI and extensions on SAP BTP.</P><P class="">The result: a set of working prototypes that not only impress technically, but are rooted in real customer needs and adoption potential.</P><H2 id="celebrating-the-2026-finalists" id="toc-hId-1396468353">Celebrating the 2026 finalists</H2><P class="">After intense jury deliberation, three teams earned a spot in the grand final at <A href="https://r1.dotdigital-pages.com/p/7UY6-G3U/sync-vnsg-sap-jaarevent" target="_self" rel="nofollow noopener noreferrer">SYNC 2026</A> for their strong presentations, clear business impact, and high potential for real-world rollout.<SPAN class="">​</SPAN></P><UL class=""><LI><P class=""><FONT color="#0000FF"><STRONG>Promocean</STRONG></FONT> (supported by <A href="https://www.soapeople.com/" target="_self" rel="nofollow noopener noreferrer">SOA People</A>) – β€œOperational Excellence through SAP Business AI”: A showcase of how SAP BTP and Business AI can streamline operations and enhance decision-making in a very pragmatic way.<SPAN class="">​</SPAN></P></LI><LI><P class=""><FONT color="#0000FF"><STRONG>Ecotone</STRONG></FONT> (supported by <A href="https://expertum.net/" target="_self" rel="nofollow noopener noreferrer">Expertum</A>) – β€œInterface Maintenance”: A smart solution addressing the often underestimated pain of interface management, using SAP BTP to bring transparency, stability and control.<SPAN class="">​</SPAN></P></LI><LI><P class=""><FONT color="#0000FF"><STRONG>NTT Data</STRONG></FONT> – β€œProTrack”: A forward-looking use case that leverages SAP BTP to better track, steer, or optimize processes<SPAN class="">​</SPAN></P></LI></UL><P class="">These finalists did not just deliver β€œcool demos”, they delivered stories where business and technology reinforce each other, with SAP BTP at the core as the innovation platform.</P><H2 id="a-strong-field-beyond-the-finalists" id="toc-hId-1199954848">A strong field beyond the finalists</H2><P class="">Of course, a hackathon is about much more than just three winners. <A href="https://www.aarini.com/" target="_self" rel="nofollow noopener noreferrer">Aarini Consulting</A>, <A href="https://www.ns.nl/" target="_self" rel="nofollow noopener noreferrer">Nederlandse Spoorwegen</A>, and <A href="https://www.simac.com/en/itnl" target="_self" rel="nofollow noopener noreferrer">Simac IT &amp; BSC</A> also delivered impressive solutions that made the jury’s job anything but easy.<SPAN class="">​</SPAN></P><P class="">Each of these teams tackled real business scenarios and used SAP BTP services to create innovation that can move quickly from prototype to production. The organizers explicitly encourage all teams to work with their coaches on post-hackathon follow-up to drive implementation and adoption, because the real success of a hackathon is measured when the ideas go live.</P><H2 id="sync-2026-where-the-stage-is-yours" id="toc-hId-1003441343">SYNC 2026: where the stage is yours</H2><P class="">As recognition of this milestone, the three finalist teams are invited to present at <A href="https://r1.dotdigital-pages.com/p/7UY6-G3U/sync-vnsg-sap-jaarevent" target="_self" rel="nofollow noopener noreferrer">SYNC 2026, the VNSG Annual Conference</A> on March 12. During the opening session, each finalist will pitch their solution live on stage to the SYNC audience. The audience will then vote to determine the VNSG SAP BTP Hackathon Champion – a great opportunity to showcase innovation, customer impact and the power of SAP BTP in front of the wider SAP community.</P><H2 id="keep-the-momentum-going" id="toc-hId-806927838">Keep the momentum going</H2><P class="">For everyone involved – finalists, other teams, coaches and the broader community – this hackathon is a starting point, not an ending. The next steps are about refining solutions, planning production rollouts, and scaling adoption so that the innovation created during the hackathon translates into lasting business impact.<SPAN class="">​</SPAN></P><P class="">If you are part of the VNSG or wider SAP community and feel inspired by these stories, take this as a call to action: bring your own business challenges, experiment on SAP BTP and co-innovate with partners and customers.</P><P class="">The SYNC 2026 VNSG SAP BTP Hackathon has proven once more that with the right mix of creativity, collaboration and platform capabilities, you can turn ideas into value – fast...</P><P class=""><a href="https://community.sap.com/t5/c-khhcw49343/SAP+Business+Technology+Platform/pd-p/73555000100700000172" class="lia-product-mention" data-product="1215-1">SAP Business Technology Platform</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+Build/pd-p/73555000100700001491" class="lia-product-mention" data-product="1181-1">SAP Build</a>&nbsp;<a href="https://community.sap.com/t5/c-khhcw49343/SAP+Integration+Suite/pd-p/73554900100800003241" class="lia-product-mention" data-product="23-1">SAP Integration Suite</a></P><P class=""><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/341036">@hansvp</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/143759">@qmrjvd</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/893645">@sricsi98</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1445414">@BvE</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/607164">@mdschoenmakers</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/562">@tamasszirtes</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/278191">@f_van_leeuwen</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/62861">@Petra1</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/172702">@BartvdKamp</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/3315">@tedcastelijns</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1515172">@Arjan_deMol</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1831">@dvvelzen</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/781602">@JdTeuling</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/120077">@AnnikaHeus</a>&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/5710">@LaurensSteffers</a>&nbsp;</P><P class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VNSG SAP BTP Hackathon.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368933i8868A4BFB9916559/image-size/large?v=v2&amp;px=999" role="button" title="VNSG SAP BTP Hackathon.png" alt="VNSG SAP BTP Hackathon.png" /></span></P> 2026-02-04T13:53:21.455000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/part-2-runtime-architecture-amp-cost-efficiency-gains/ba-p/14317915 Part 2: Runtime Architecture & Cost efficiency gains 2026-02-04T16:53:28.002000+01:00 ChristianWeiss https://community.sap.com/t5/user/viewprofilepage/user-id/136917 <H2 id="toc-hId-1788754343"><STRONG>Introduction</STRONG></H2><P><SPAN>In <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/kyma-evolution-transforming-sap-kyma-into-a-tailor-made-saas-platform-for/ba-p/14317418" target="_self">Part 1</A>, we introduced the </SPAN><STRONG>CAP Operator</STRONG><SPAN><STRONG> as the brain to make out of your Kyma Cluster a runtime for CAP Multitenancy SaaS applications.</STRONG> Today, we dive into technical architecture. We will see why Kyma isn't just "another place to run containers," but can be turned into a highly optimized environment that saves costs by being smarter about how it uses resources, especially when compared to a traditional Cloud Foundry setup, important if you need to run CAP Multitenancy Applications on a large scale.</SPAN></P><H2 id="toc-hId-1592240838"><STRONG>1. The Core Architecture paradigm: Declarative Tenant Management</STRONG></H2><P><SPAN>While Cloud Foundry relies on imperative commands (like </SPAN><SPAN>cf push or cf deploy</SPAN><SPAN>), the CAP Operator uses </SPAN><A href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources" target="_blank" rel="noopener nofollow noreferrer">Custom Resources (CRs)</A><SPAN> the Kubernetes extensibility API for customization. The most important one for SaaS Multitenancy CAP Solutions is the </SPAN><STRONG>CAPTenant.</STRONG></P><P><SPAN>In Cloud Foundry, the </SPAN>Service Manager<SPAN> handles the creation of HDI containers, and it does the same in Kyma. However, the CAP Operator adds a layer of </SPAN><STRONG>"Operational Intelligence"</STRONG><SPAN>:</SPAN></P><UL><LI><STRONG>Autonomous Monitoring:</STRONG><SPAN> The Operator doesn't just trigger the Service Manager; it monitors the entire lifecycle of the tenant's database schema. If a </SPAN><SPAN>cds deploy</SPAN><SPAN> (migration) fails, the Operator detects the "Unhealthy" state and can automatically retry or alert, integrated directly into the Kubernetes event stream.</SPAN></LI><LI><STRONG>State Reconciliation:</STRONG><SPAN> It ensures that the state of your tenants always matches your configuration. If a tenant record is stuck, the Operator's reconciliation loop acts as an automated "Day-2" administrator.</SPAN></LI><LI><STRONG>Automatic creation of the Provider tenant</STRONG><SPAN>: The CAP Operator will automatically take care that the provider tenant for your SaaS Application is created and updated like for the Subscriber tenants, whereas in Cloud Foundry you will need to to care.&nbsp;</SPAN></LI></UL><H2 id="toc-hId-1395727333">2. The "Zero-Idle" secret: On-Demand MTXS Pods</H2><P><SPAN>In a typical CAP multitenancy setup, the</SPAN><STRONG> CAP MTXS component is the heavy lifter.</STRONG><SPAN> It handles onboarding, unsubscription and database upgrades.</SPAN></P><P><STRONG>The Cloud Foundry Challenge:</STRONG><SPAN> In CF, the MTXS logic often runs as one container</SPAN><SPAN>&nbsp;or a permanent process within your application instance. This means you are constantly paying for the RAM and CPU of this "waiting" process, even if no one is subscribing to your app for days.</SPAN></P><P><STRONG>The Kyma + CAP Operator Advantage:</STRONG><SPAN> The Operator implements what we call a </SPAN><STRONG>"Zero-Idle" policy</STRONG><SPAN> for provisioning tasks:</SPAN></P><UL><LI><STRONG>Trigger-based Lifecycle:</STRONG><SPAN> When a subscription event occurs, the CAP Operator spins up a </SPAN><STRONG>short-lived Job Pod</STRONG><SPAN> specifically for the MTXS task of that tenant. For more details on how the CAP Operator manages the tenant lifecycle please have a look at the </SPAN><A href="https://sap.github.io/cap-operator/docs/usage/tenant-provisioning/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>Tenant Provisioning Documentation</SPAN></A><SPAN>.</SPAN></LI><LI><STRONG>Scale-to-Zero:</STRONG><SPAN>&nbsp;With the CAP Operator you can <STRONG>run upgrades of your database tenants in parallel</STRONG>. Once the tenant is successfully managed and the database tenant is ready, the MTXS Pod is terminated.</SPAN></LI><LI><STRONG>Cost Benefit:</STRONG><SPAN> You pay </SPAN>zero<SPAN> for the MTXS infrastructure during idle times. In large-scale landscapes with many extensions, this optimization can <STRONG>reduce your runtime memory footprint by </STRONG></SPAN><STRONG>20–30%</STRONG><SPAN>.</SPAN></LI></UL><H2 id="toc-hId-1199213828"><STRONG>3. Scaling without linear cost growth</STRONG></H2><P><SPAN>A common concern is that Kubernetes might be more expensive than Cloud Foundry. The reality is the opposite when scaling SaaS:</SPAN></P><OL><LI><STRONG>Bin-Packing:</STRONG><SPAN> Kubernetes allows for "Overcommitting." Since your applications and tenants aren't all active at the same millisecond, you can pack more application instances onto a single K8S Node than the rigid memory cells of CF allow.</SPAN></LI><LI><STRONG>Resource Pooling:</STRONG><SPAN> By using the CAP Operator to orchestrate the Service Manager, you can efficiently fill up large, cost-effective HANA Cloud instances. You avoid the "base cost" of having many small, underutilized HANA instances.</SPAN></LI><LI><STRONG>Efficiency Gains:</STRONG><SPAN> As you grow from 10 to 100 tenants, your infrastructure costs grow at a much flatter angle because the "management overhead" (like MTXS) only consumes resources when it's actually working.</SPAN></LI></OL><H2 id="toc-hId-1002700323"><STRONG>4. Centralized Observability: Selective Logging</STRONG></H2><P><SPAN>Logging is often an overlooked cost driver. While both BTP environments use the </SPAN><STRONG>SAP Cloud Logging Service which can be shared among multiple deployments</STRONG><SPAN>, the way how it's done and how they handle logging data (storage as the major cost driver) is fundamentally different.</SPAN></P><UL><LI><STRONG>Cloud Foundry:</STRONG><SPAN> Every app instance pushes all logs blindly to the service. You have little control over the volume.</SPAN></LI><LI><STRONG>Kyma (The Daemon Approach):</STRONG><SPAN> Kyma uses the </SPAN><STRONG>Telemetry Module</STRONG><SPAN> (Fluent Bit) running as a daemon on every node.&nbsp;</SPAN></LI><UL><LI><STRONG>Pre-Filtering:</STRONG><SPAN> You can define a </SPAN><SPAN>LogPipeline</SPAN><SPAN> to filter logs </SPAN><I><SPAN>before</SPAN></I><SPAN> they leave the cluster. For example, you can exclude send logs from specific production namespaces or filter the logs by specific attributes.</SPAN></LI><LI><STRONG>Centralized Sharing:</STRONG><SPAN> You don't need to bind every app. You define one central pipeline that securely routes logs from the entire cluster to a single Cloud Logging instance, providing a unified view with significantly lower ingest costs.</SPAN></LI></UL></UL><P><SPAN>On how to use the SAP Cloud Logging with SAP Kyma, please have a look into the </SPAN><A href="http://community.sap.com/t5/technology-blog-posts-by-sap/kyma-integration-with-sap-cloud-logging-part-1-introduction-and-shipping/ba-p/13648649" target="_blank"><SPAN>Kyma Integration with SAP Cloud Logging Blog</SPAN></A><SPAN>.</SPAN></P><H2 id="toc-hId-806186818"><STRONG>Summary: The Architect's choice</STRONG></H2><P><SPAN>Choosing Kyma and the CAP Operator isn't just about a "new technology." It's a strategic decision to move <STRONG>from </STRONG></SPAN><STRONG>reserved resources to on-demand resources and how to utilize them more efficiently. </STRONG></P><UL><LI><STRONG>CF:</STRONG><SPAN> Predictable, but you often pay for "idling" capacity.</SPAN></LI><LI><STRONG>Kyma + CAP Operator:</STRONG><SPAN> Dynamic, ensuring you only pay for what is actively serving your business or your tenants.</SPAN></LI></UL><H2 id="toc-hId-609673313"><STRONG>What’s Next?</STRONG></H2><P><SPAN>Now that we have seen how the Power couple ”BTP Kyma&amp;CAP Operator” enables you to lower your infrastructure cost in case of running CAP applications on large scale, we will see in <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-3-automated-application-lifecycle-management-in-action/ba-p/14317937" target="_self">Part 3</A> how the CAP Operator helps you to run your Application Lifecycle Management 100% automated which is a further important pillar to reduce your overall TCO.</SPAN></P> 2026-02-04T16:53:28.002000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/part-3-automated-application-lifecycle-management-in-action/ba-p/14317937 Part 3: Automated Application Lifecycle Management in Action 2026-02-04T16:53:39.614000+01:00 ChristianWeiss https://community.sap.com/t5/user/viewprofilepage/user-id/136917 <H2 id="toc-hId-1788754407"><STRONG>Introduction</STRONG></H2><P><SPAN>Enough theory. In <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/kyma-evolution-transforming-sap-kyma-into-a-tailor-made-saas-platform-for/ba-p/14317418" target="_self">Part 1</A> and <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-2-runtime-architecture-amp-cost-efficiency-gains/ba-p/14317915" target="_self">2</A>, we discussed how and why the </SPAN>CAP Operator<SPAN> turns SAP Kyma into a </SPAN><SPAN>runtime for CAP Multitenancy SaaS applications. </SPAN><SPAN><STRONG>Forget complex deployment scripts and manual tenant lifecycle tracking</STRONG>. We will take the official&nbsp;</SPAN><A href="https://github.com/SAP-samples/btp-cap-multitenant-saas" target="_blank" rel="noopener nofollow noreferrer">S<SPAN>AP-samples/btp-cap-multitenant-saas</SPAN></A><SPAN> and show you how to deploy, manage, and monitor your SaaS application with zero friction. This is Platform Engineering for DevOps at its best.</SPAN></P><H2 id="toc-hId-1592240902"><STRONG>1. The Application Blueprint</STRONG></H2><P><SPAN>Instead of managing dozens of individual Kubernetes objects, you define in a declarative way your CAP Application using </SPAN><SPAN>&nbsp;</SPAN><A href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources" target="_blank" rel="noopener nofollow noreferrer">Custom Resources (CRs)</A><SPAN> like CAPApplication, CAPApplicationVersion which will create the necessary Kubernetes native artifacts to manage your application lifecycle.&nbsp;</SPAN><SPAN>In the </SPAN><A href="https://github.com/SAP-samples/btp-cap-multitenant-saas" target="_blank" rel="noopener nofollow noreferrer"><SPAN>Sample Repository</SPAN></A><SPAN> the necessary steps to deploy the </SPAN><SPAN>Sustainable SaaS (SusaaS) example using the CAP Operator is described under </SPAN><A href="https://github.com/SAP-samples/btp-cap-multitenant-saas/tree/main/deploy/cap-operator" target="_blank" rel="noopener nofollow noreferrer"><SPAN>deploy/capoperator</SPAN></A><SPAN>. The example will use a Helm Chart which creates the required BTP service instances and bindings using the</SPAN><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/sap-btp-operator-module" target="_blank" rel="noopener noreferrer"><SPAN> SAP BTP Operator</SPAN></A><SPAN> Kyma Module which is installed by default in your Kyma Cluster. Using the </SPAN><I><SPAN>helm dry-run</SPAN></I><SPAN> option you will be able to see all artifacts which will be managed via the Helm Chart. The output of:</SPAN></P><PRE><SPAN><I>helm upgrade -i -n susaas susaas chart -f chart/values-private.yaml --dry-run=client</I></SPAN></PRE><P><SPAN>includes for instance the </SPAN><STRONG>CAPApplication Custom Resource</STRONG><SPAN>:</SPAN></P><pre class="lia-code-sample language-yaml"><code>apiVersion: sme.sap.com/v1alpha1 kind: CAPApplication metadata: name: cap-saasmt spec: domainRefs: - kind: Domain name: dom-saasmt btpAppName: "saasmt" globalAccountId: "8ec9195a-6924-45d2-94da-a5c798578808" provider: subDomain: "saasmtcws" tenantId: "7fced6ad-dada-4ffe-a5ec-6f75bfd9d67c" btp: services: - class: "xsuaa" name: "xsuaa-api" secret: "saasmt-xsuaa-api-bind-btp" … - class: "service-manager" name: "sm-admin" secret: "saasmt-sm-admin-bind-btp"</code></pre><P><SPAN>and the </SPAN><STRONG>CAPApplicationVersion Custom Resource</STRONG><SPAN> which specifies all your Application workloads like Approuter, Backend, Service Broker which are running permanently with its specific configurations. In addition it includes the Content Deployment Jobs like to deploy HTML5 Content to the HTML5 Content Repository Service and the Operations to create, update and to delete Application Tenants. These Jobs are scaled to Zero once successfully done.</SPAN></P><pre class="lia-code-sample language-yaml"><code>apiVersion: sme.sap.com/v1alpha1 kind: CAPApplicationVersion spec: capApplicationInstance: "cap-saasmt" version: "1" registrySecrets: - regcred workloads: - name: srv consumedBTPServices: - "xsuaa" - "saas-registry" - "destintation" - "com-hdi-container" - "sm-container" - "sm-admin" deploymentDefinition: type: CAP image: "espchris/capop-susaas-srv:0.0.1" env: - name: DEBUG value: "mtx" ... volumeMounts: ... volumes: ... securityContext: ... resources: ... - name: router ... - name: api ... - name: broker - name: hdi-deployer ... - name: html5-apps-deployer ... - name: mtxs ... contentJobs: - hdi-deployer - html5-apps-deployer tenantOperations: provisioning: - workloadName: mtxs - workloadName: automator upgrade: - workloadName: mtxs deprovisioning: - workloadName: mtxs - workloadName: automator</code></pre><H2 id="toc-hId-1395727397"><STRONG>2. Deploy and watch the automation</STRONG></H2><P><SPAN>Once you deploy the application using </SPAN><I><SPAN>helm upgrade -i -n susaas susaas chart -f chart/values-private.yaml </SPAN></I><SPAN>like described in the </SPAN><A href="https://github.com/SAP-samples/btp-cap-multitenant-saas/blob/main/deploy/cap-operator/README.md" target="_blank" rel="noopener nofollow noreferrer"><SPAN>documentation</SPAN></A> <SPAN>the automation for instance includes:</SPAN></P><UL><LI><STRONG>Service Auto-Provisioning:</STRONG><SPAN> It talks to the BTP Operator Module, creates the required instances, and binds them.</SPAN></LI><LI><STRONG>Manages the Application workload and content deployment</STRONG><SPAN>: Create for instance the Certificate for your Application wildcard domain including the necessary DNS entry for your SaaS Application. Triggers the content deployment jobs like to deploy the Fiori Application HTML5 content the BTP HTML5 repository Service.</SPAN></LI><LI><STRONG>Provider Tenant creation/upgrade:</STRONG><SPAN> It automatically initializes your provider subaccount database tenant by calling the MTX Job automatically, a step that used to be a manual headache.</SPAN></LI></UL><H2 id="toc-hId-1199213892"><STRONG>3. Native Monitoring in the Kyma Dashboard (Busola)</STRONG></H2><P><SPAN>Who says Kubernetes is CLI-only? One of the biggest advantages of the CAP Operator is its </SPAN><STRONG>native integration into the Kyma Dashboard (Busola)</STRONG><SPAN> which is integrated into the BTP Cockpit.&nbsp;</SPAN><SPAN>In Busola, you don't just see "Pods"; you see the status of your </SPAN><STRONG>Application</STRONG><SPAN>:</SPAN></P><UL><LI><STRONG>Visual Health Check:</STRONG><SPAN> Check the status of your </SPAN><STRONG>CAPApplication, CAPApplicationVersions </STRONG><SPAN>&nbsp;and </SPAN><STRONG>CAPTenants</STRONG><SPAN> at a glance. Green status means the DB is migrated, services are bound, and the app is ready for consumers.</SPAN></LI><LI><STRONG>Tenant Provisioning Deep-Dive:</STRONG><SPAN> Click on a specific subscriber tenant to see its specific configuration and history and</SPAN></LI><LI><STRONG>Real-time Logs:</STRONG><SPAN> If a tenant upgrade fails you will see that directly in the UI.&nbsp;</SPAN></LI></UL><P><SPAN>Here is an example showing the details of the CAPApplicationVersion.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_0-1769702710726.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367030iC6EDF4F2EEDDEF5A/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_0-1769702710726.png" alt="ChristianWeiss_0-1769702710726.png" /></span></P><P><SPAN>CAPTenants</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_1-1769702710727.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367031iD34AF51DB5D38F73/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_1-1769702710727.png" alt="ChristianWeiss_1-1769702710727.png" /></span></P><H2 id="toc-hId-1002700387"><STRONG>4. Subscriber tenant provisioning including specific tenant operations</STRONG></H2><P><SPAN>Once the application is in a Ready State the subscription of further tenants is done in the same way like for Cloud Foundry Applications by creating a new subscriber subaccount and creating a new subscription which will trigger the </SPAN><A href="https://sap.github.io/cap-operator/docs/usage/tenant-provisioning/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>Tenant subscription workflow</SPAN></A><SPAN> creating a new database schema, ISTIO Virtual Service for you Subaccount and will trigger all other defined automations.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_0-1769703021033.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367033i5DC50B7B57A71350/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_0-1769703021033.png" alt="ChristianWeiss_0-1769703021033.png" /></span></P><P><SPAN>The result will be again visible in the Kyma Dashboard where we will see all Jobs including Status which have been executed.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_1-1769703021035.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367034iF4804270EE010D49/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_1-1769703021035.png" alt="ChristianWeiss_1-1769703021035.png" /></span></P><H2 id="toc-hId-806186882"><STRONG>5. Scaling your lifecycle operations</STRONG></H2><P><SPAN>What happens when you have 100+ tenants and a new release?</SPAN></P><UL><LI><STRONG>Parallel Upgrades:</STRONG><SPAN> The Operator doesn't wait in line. It spins up parallel MTXS jobs to upgrade your tenants' database schemas simultaneously, respecting the limits you define.</SPAN></LI><LI><STRONG>Self-Healing:</STRONG><SPAN> If a tenant's schema drifts or a migration fails, the Operator's reconciliation loop kicks in. It's like having a </SPAN><STRONG>24/7 SRE (Site Reliability Engineer)</STRONG><SPAN> built into your cluster.</SPAN></LI></UL><P><SPAN>The results of a Application upgrade using command helm upgrade -i -n saasmt susaas chart -f chart/values-private.yaml can be again seen in the Kyma Dashboard.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChristianWeiss_2-1769703134553.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367035iA02DE59B18B1236F/image-size/large?v=v2&amp;px=999" role="button" title="ChristianWeiss_2-1769703134553.png" alt="ChristianWeiss_2-1769703134553.png" /></span></P><H2 id="toc-hId-609673377"><STRONG>6. The "Golden Path": GitOps with the CAP Operator</STRONG></H2><P>Automated ALM is great, but manually running commands is still a potential source of error. This is where GitOps comes in. Since the CAP Operator uses a purely declarative approach, it provides the perfect foundation for tools like Argo CD.</P><UL><LI><STRONG>Infrastructure as Code (IaC): </STRONG><SPAN>Your entire SaaS landscape from the CAPApplication definition to the individual CAPApplicationVersion configurations is stored in a Git repository.</SPAN></LI><LI><STRONG>Automatic Sync:</STRONG><SPAN> When you push a new image version or a new tenant configuration to Git, Argo CD (or any GitOps tool) detects the change and synchronizes it with your Kyma cluster.</SPAN></LI><LI><STRONG>Audit Trail &amp; Revert:</STRONG><SPAN> Every change to your SaaS environment is tracked in Git. Need to rollback a buggy tenant upgrade? Just revert the commit, and the CAP Operator will automatically restore the previous state.</SPAN></LI></UL><P><SPAN>By combining GitOps with the CAP Operator, you achieve the highest level of maturity in cloud-native operations: Your Git repo becomes the single source of truth for your entire "CAP-as-a-Service" platform.</SPAN></P><H2 id="toc-hId-413159872"><STRONG>Summary: Kyma as the runtime for CAP Multitenancy SaaS applications</STRONG></H2><P><SPAN>SAP provides with Kyma a runtime for running CAP Multitenancy solutions with minimal costs on a large scale and it includes openness to allow the ecosystem to extend it with additional operators. Using the Kyma Module CAP Operator we've turned a complex Kubernetes cluster into a specialized </SPAN><STRONG>"CAP-as-a-Service"</STRONG><SPAN> platform.&nbsp;</SPAN></P><P><SPAN>We have seen how to:</SPAN></P><UL><LI><STRONG>Turn your cluster into a "CAP-as-a-Service"</STRONG><SPAN> platform with a view clicks (<A href="https://community.sap.com/t5/technology-blog-posts-by-sap/kyma-evolution-transforming-sap-kyma-into-a-tailor-made-saas-platform-for/ba-p/14317418" target="_self">Part 1</A>).</SPAN></LI><LI><STRONG>Reduce Infrastructure Cost </STRONG><SPAN>through resource sharing and optimization (<A href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-2-runtime-architecture-amp-cost-efficiency-gains/ba-p/14317915" target="_self">Part 2</A>).</SPAN></LI><LI><STRONG>Automate the Application Lifecycle with the help of the CAP Operator </STRONG><SPAN>&nbsp;(Part 3).</SPAN></LI></UL><P><SPAN>The future of SAP CAP Application development and operations is open, modular and operator-led. Start exploring the capabilities and transform your Kyma cluster into a high-performance and scalable engine! To create the necessary Helm artifacts to deploy your CAP Application using the CAP Operator please make use of the </SPAN><A href="https://github.com/cap-js/cap-operator-plugin" target="_blank" rel="noopener nofollow noreferrer"><SPAN>cap-operator-plugin</SPAN></A><SPAN> which we will explain in more detail in one of the next blogs.</SPAN></P> 2026-02-04T16:53:39.614000+01:00 https://community.sap.com/t5/sap-for-oil-gas-and-energy-blog-posts/reimagining-utility-transformation-clean-core-principles-powered-by-sap-btp/ba-p/14321645 Reimagining Utility Transformation: Clean Core Principles Powered by SAP BTP 2026-02-06T07:51:30.744000+01:00 Atul_Joshi85 https://community.sap.com/t5/user/viewprofilepage/user-id/2274193 <H1 id="toc-hId-1660413609">Introduction</H1><P>Across the utility industry, one message appears in every transformation discussion: <STRONG>β€œKeep the core clean.”</STRONG> The guidance is sound, especially for organizations preparing for S/4HANA. But inside SAP IS‑Uβ€”where regulatory complexity, legacy billing logic, and decades of Z‑programs coexistβ€”this principle often feels contradictory.</P><P>Utilities must modernize rapidly while protecting the stability of their revenue engine. This creates a familiar tension: <STRONG>innovation requires speed, but the core requires caution.</STRONG></P><P>This post explores why that tension exists, how SAP BTP resolves it, and how utilities can operationalize a Clean Core strategy without compromising business continuity.</P><H1 id="toc-hId-1463900104">Main Body</H1><H2 id="toc-hId-1396469318">1. The Customization Cage: How Utilities Got Here</H2><P>For many years, utilities solved business needs by customizing the ERP core:</P><UL><LI>Custom ABAP for tariffs</LI><LI>Modified standard tables for regulatory fields</LI><LI>Embedded workflows inside IS‑U</LI><LI>Enhancements tightly coupled to billing and device management</LI></UL><P>These decisions were practical at the timeβ€”but over decades, they created a <STRONG>Rigid Core</STRONG> that is difficult to upgrade, expensive to test, and slow to evolve.</P><P><STRONG>Resulting challenges:</STRONG></P><UL><LI>High upgrade risk</LI><LI>Long regression cycles</LI><LI>Slow innovation</LI><LI>Technical debt that compounds every year</LI></UL><P>Your first diagram captures this reality perfectly.</P><P><STRONG>Diagram 1 β€” The Customization Cage </STRONG></P><P><STRONG>&nbsp;</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Atul_Joshi85_0-1770216536920.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368957i685E3BEBFF734633/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Atul_Joshi85_0-1770216536920.png" alt="Atul_Joshi85_0-1770216536920.png" /></span></P><P>&nbsp;</P><P><STRONG>&nbsp;</STRONG></P><P>&nbsp;</P><H2 id="toc-hId-1199955813">2. Clean Core + SAP BTP: The Agility Layer Utilities Needed</H2><P>A Clean Core strategy is not about reducing capabilityβ€”it’s about <STRONG>relocating</STRONG> capability.</P><P>SAP Business Technology Platform (BTP) provides the architectural separation utilities have needed for years:</P><UL><LI><STRONG>S/4HANA Core</STRONG> β†’ Stable, standardized, upgrade-friendly</LI><LI><STRONG>SAP BTP</STRONG> β†’ Custom logic, workflows, APIs, event-driven processes</LI></UL><P>This separation transforms the ERP into a <STRONG>system of record</STRONG>, while BTP becomes the <STRONG>system of innovation</STRONG>.</P><P><STRONG>Key benefits:</STRONG></P><UL><LI>Faster delivery cycles</LI><LI>Reduced regression testing</LI><LI>Lower upgrade effort</LI><LI>Event-driven operations</LI><LI>Extensibility without core modification</LI></UL><H2 id="toc-hId-1003442308">3. A Practical Framework for Utility Clean Core Adoption</H2><P>SAP Community readers expect actionable, practitioner-focused guidance. Here is a structured approach utilities can follow.</P><P><STRONG>Step 1: Start With a Core Assessment</STRONG></P><P>Identify:</P><UL><LI>Business-critical customizations</LI><LI>Redundant or obsolete logic</LI><LI>Enhancements blocking upgrade cycles</LI><LI>High-change areas suitable for BTP</LI></UL><P>This reframes Clean Core as <STRONG>risk reduction</STRONG>, not cleanup.</P><P><STRONG>Step 2: Move High-Variability Logic to BTP First</STRONG></P><P>Ideal candidates include:</P><UL><LI>Rate and tariff changes</LI><LI>Regulatory reporting</LI><LI>Credit &amp; collections workflows</LI><LI>Meter-to-cash orchestration</LI><LI>BPEM automation</LI></UL><P>These areas generate the most upgrade frictionβ€”and deliver the fastest BTP wins.</P><H2 id="toc-hId-806928803">Step 3: Use SAP Event Mesh to Break the Batch Mindset</H2><P>Utilities can begin shifting toward real-time operations by triggering events for:</P><UL><LI>Move-in / move-out</LI><LI>Billing determinants</LI><LI>Meter read exceptions</LI><LI>Payment events</LI><LI>Outage notifications</LI></UL><P>This enables a hybrid model: <STRONG>batch where necessary, real-time where possible.</STRONG></P><H2 id="toc-hId-610415298">Step 4: Establish Governance That Protects the Core</H2><UL><LI>No custom code in S/4 unless SAP mandates it</LI><LI>BTP-first evaluation for all new logic</LI><LI>Standard APIs and events as default patterns</LI><LI>Quarterly architecture reviews to prevent β€œcore creep”</LI></UL><P>Governance is the long-term safeguard of Clean Core.</P><H2 id="toc-hId-413901793">Step 5: Treat BTP as a Business Platform</H2><P>Executives respond when BTP is positioned as:</P><UL><LI>A revenue protection tool</LI><LI>A regulatory accelerator</LI><LI>A customer experience enabler</LI><LI>A technical debt reduction mechanism</LI></UL><H2 id="toc-hId-217388288">Step 6: Build a 24‑Month Roadmap</H2><P>A practical roadmap includes:</P><UL><LI><STRONG>Phase 1:</STRONG> Core assessment + quick wins</LI><LI><STRONG>Phase 2:</STRONG> Event-driven architecture rollout</LI><LI><STRONG>Phase 3:</STRONG> Predictive and AI-driven use cases</LI><LI><STRONG>Phase 4:</STRONG> Full Clean Core enforcement + S/4 readiness</LI></UL><P>This provides clarity, sequencing, and measurable ROI.</P><H2 id="toc-hId-20874783">4. The Modern Utility Innovation Stack</H2><P>Your second diagram illustrates the future-state architecture:</P><UL><LI>A stable S/4HANA core</LI><LI>A flexible BTP layer</LI><LI>A connected utility ecosystem</LI></UL><P><STRONG>Diagram 2 β€” The Utility Innovation Stack </STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Atul_Joshi85_1-1770216537147.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368958iDEA788D84B292DEB/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Atul_Joshi85_1-1770216537147.png" alt="Atul_Joshi85_1-1770216537147.png" /></span></P><P>&nbsp;</P><P><STRONG>&nbsp;</STRONG></P><P>&nbsp;</P><H1 id="toc-hId-465018642">Conclusion</H1><P>A Clean Core is not a limitationβ€”it is a <STRONG>strategic advantage</STRONG>.</P><P>Utilities preparing for S/4HANA should shift the conversation from:</P><P><STRONG>β€œHow do we migrate everything we built?”</STRONG> to <STRONG>β€œHow do we protect the core and modernize the business at the same time?”</STRONG></P><P>SAP BTP provides the answer:</P><UL><LI>Keep the core stable</LI><LI>Move innovation to the agility layer</LI><LI>Adopt event-driven operations</LI><LI>Reduce technical debt</LI><LI>Build a future-ready architecture</LI></UL><P>Utilities that embrace this model will be better positioned to innovate, comply, and scale in the decade ahead.</P> 2026-02-06T07:51:30.744000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/a-sap-btp-kyma-encryption-decryption-microservice-for-all-contexts-e-g-sap/ba-p/14326277 A SAP BTP Kyma Encryption/Decryption Microservice for ALL Contexts (e.g. SAP Datasphere/BDC/ABAP) 2026-02-11T16:12:01.099000+01:00 stefan_geiselhart2 https://community.sap.com/t5/user/viewprofilepage/user-id/200897 <P>G’day!</P><P><STRONG>Warning</STRONG>: This is only for readers who are really interested in this subject&nbsp;<span class="lia-unicode-emoji" title=":smiling_face_with_heart_eyes:">😍</span> The article is quite comprehensive and has got some cross-article links inside, that also need to be considered. Therefore: A lot of reading and a lot of hands-on + thinking if you want to rebuild the thing.​</P><P><U>Below is the structure of this article:</U></P><UL><LI><FONT size="3">1 Status Quo on En-/Decryption in BTP</FONT></LI><LI><FONT size="3">2 Motivation</FONT></LI><LI><FONT size="3">3 Fundamentals&nbsp;</FONT></LI><LI><FONT size="3">4 Architecture​</FONT></LI><LI><FONT size="3">5 HDLFS Configuration</FONT></LI><LI><FONT size="3">6 Insights into Python</FONT></LI><LI><FONT size="3">7 Containerization &amp; Deployment in Kyma</FONT></LI><LI><FONT size="3">8 Achievements</FONT></LI><LI><FONT size="3">9 More Scope</FONT></LI><LI><FONT size="3">10 References</FONT></LI></UL><P>Let's begin:</P><P><STRONG><FONT size="5">1 Status Quo on En-/Decryption in BTP</FONT></STRONG></P><P><FONT size="3">When it comes to&nbsp;En-/Decryption on SAP BTP, there are a couple of pitfalls to be considered.&nbsp;</FONT>The following roughly outlines the situation, platform and application-wise:</P><UL><LI>Individual applications (e.g. SAP Successfactors) got proprietary encryption/decryption mechanisms available. They are typically <STRONG>not reusable</STRONG>.</LI><LI><STRONG>SAP Integration Suite has got PGP En-/Decryptor nodes</STRONG> available. However, it is <STRONG><U>not</U> advisable to run</STRONG> large volume scenarios using this approach. It has been built for data sizes on the levels represented within message handling scenarios (Iβ€˜m not an expert therein, but I guess thats typically not in the area of GBs).</LI><LI>A policy/rule for data to remain encrypted until its landing into BTP: You face challenges to <STRONG>securely onboard large volume files</STRONG> containing sensitive data <STRONG>into BTP</STRONG>, because there is no out-of-the-box solution to keep them encrypted in motion and decrypt them at rest once available in BTP (and vice versa for an outbound flow).</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="The Challenge" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371589i1ED7B676DB32AA4F/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="The Challenge" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">The Challenge</span></span></P><P><STRONG><FONT size="5">2 Motivation</FONT></STRONG></P><P>​Due to the above limitations, we were eager to find an appropriate solution approach that first of all satifies our specific scenario, but can also be augmented to other contexts. This is why the following motivation arose:</P><UL><LI>Especially En-/Decryption for larger files on BTP side seems to be a missing piece in the puzzle.</LI><LI>Our ambition is to encapsulate such kind of mechanism centrally as a reusable service. <STRONG>Multiple kinds of contexts can be served</STRONG>, exposing this service: Applications, data flows &amp; transformations etc. – in our context the consumer will be SAP Datasphere.</LI><LI>There is another consequence of finally being able to load decrypted large data sets into BTP. To be more precise: To onboard this data into SAP Datasphere to further process and transform, the fact that Base64 encoded data must be handled in our context too, why not also expose or <STRONG>incorporate columnar Base64 En-/Decoding</STRONG> into the microservice?</LI><LI>The intended solution is <STRONG>custom-built</STRONG> and must be managed individually. However, the baseline that will be set <STRONG>can be reused and adapted</STRONG> to various customer needs and application contexts.</LI></UL><P><STRONG><FONT size="5">3 Fundamentals</FONT></STRONG>&nbsp;</P><P>​The following represent some fundamentals and success criteria weβ€˜ve established for our solution:</P><UL><LI>Use HANA Data Lake Files (<STRONG>HDLFS</STRONG>) as a file store for inbound/outbound persistency</LI><LI>Implement the service as <STRONG>containerized Python</STRONG> code logic</LI><LI>Service capabilities must be <STRONG>controllable and schedulable within Kyma</STRONG></LI><LI>Service can handle <STRONG>PGP encrypted</STRONG> files, but can also decrypt for outbound delivery</LI><LI>Service can decode <STRONG>Base64</STRONG> columns for inbound source files</LI><LI>Service <STRONG>manages and cleans up</STRONG> directories and file in-/output on HDLFS</LI><LI>Service can handle <STRONG>files with sizes in GB range</STRONG></LI><LI>Deploy service into a <STRONG>Kyma Cluster</STRONG> (Cloud Foundry? -&gt; no, Memory/Sizing limitations)</LI><LI><STRONG>Security</STRONG>: Facilitate simple and secure handling of all required secrets and certificates</LI><LI>Service <STRONG>not exposed via HTTP endpoints</STRONG> (this is kind of a contradiction to a true microservice, however this requirement applies in our context. Under "More Scope" you will find guidelines/directions how to enable HTTP based microservices)</LI></UL><P><STRONG><FONT size="5">4 Architecture</FONT></STRONG>​</P><P>The following architectural components represent what weβ€˜ve picked out for our solution:</P><UL><LI>Usage of HANA Data Lake Files (<STRONG>HDLFS</STRONG>) as a file store for <STRONG>inbound/outbound persistency</STRONG></LI><LI>Use <STRONG>BTP Kyma for service runtime</STRONG> (Kyma deployed in the 2nd smallest T-Shirt size)</LI><LI><STRONG>SAP Datasphere</STRONG> represents the <STRONG>persistency layer</STRONG> (DSP as a consumer is exchangeable but in our case relevant for the business scenario)</LI><LI>The other more general blue box "other BTP Solutions" indicates, that the service implementation on Kyma isn't necessary limited to SAP Datasphere only, but should be rather considered as something agnostic. This of course heavily depends how it is built and finally implemented.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="BTP Solution Architecture Kyma Microservice" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371516i29EF2B1C74333CEB/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="BTP Solution Architecture Kyma Microservice" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">BTP Solution Architecture Kyma Microservice</span></span></P><P><STRONG><FONT size="5">5 HDLFS Configuration</FONT></STRONG></P><P><FONT size="4">I strongly recommend to read the <A href="https://developers.sap.com/tutorials/data-lake-file-containers-hdlfscli.html" target="_self" rel="noopener noreferrer">tutorial by Jason Hinsperger</A> to familiarize yourself with the HDLFS REST API dependencies and the essential steps to spin up the instance. You must follow all the steps described therein.</FONT></P><P><FONT size="4">Its important to note that the <STRONG>generated client key and client certificate</STRONG> is what you are about to use from python level. Moreover <STRONG>you should take note of the REST API endpoint</STRONG>. This is the endpoint you run all your requests against (you find it in HANA Cloud Central -&gt; Instances -&gt; HDLFS Instance -&gt; "Files REST API Endpoint".).</FONT></P><P><FONT size="4">To familiarize yourself in general with the HDLFS REST API documentation, you can use this <A href="https://help.sap.com/doc/9d084a41830f46d6904fd4c23cd4bbfa/2025_3_QRC/en-US/index.html#tag/WebHDFS" target="_self" rel="noopener noreferrer">link</A>.</FONT></P><P><STRONG><FONT size="5"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HDLFS REST API Endpoint" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371618i735BEFA7C02FCA36/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="HDLFS REST API Endpoint" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">HDLFS REST API Endpoint</span></span></FONT></STRONG></P><P><FONT size="4">One essential detail I don't want to hide, is the IP whitelisting of the Kyma environment. In order to do that, navigate to the start page of your cluster dashboard. There is a section called "Cluster Overview --&gt; Metadata". Copy the (typically three) IP listed there: "NAT Gateway IP Addresses".</FONT></P><P><FONT size="4">Go to your HANA Cloud Central and navigate to your HDLFS instance. Click "Manage Configuration" and go to the section "Connections": If you have enabled the setting to only allow specific IP addresses, likewise maintain the ones of the Kyma Cluster that you previously copied:</FONT></P><P><FONT size="4"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="HDLFS Configuration Connections" style="width: 706px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371638i636055B083947539/image-dimensions/706x435?v=v2" width="706" height="435" role="button" title="image.png" alt="HDLFS Configuration Connections" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">HDLFS Configuration Connections</span></span></FONT></P><P><STRONG><FONT size="5">6 Insights into Python</FONT></STRONG></P><P><FONT size="3">The python coding part is split into several modules, which are all described in a detailed way further below:</FONT></P><OL><LI><FONT size="3">Inbound processing</FONT></LI><LI><FONT size="3">Outbound processing</FONT></LI><LI><FONT size="3">Common functions</FONT></LI><LI><FONT size="3">Crypto function for encryption/decryption</FONT></LI></OL><P><FONT size="3"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Python Modules Sketch" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371586i15DBFF5CC94401F9/image-size/large?v=v2&amp;px=999" role="button" title="image.png" alt="Python Modules Sketch" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Python Modules Sketch</span></span></FONT></P><P><FONT size="4"><STRONG>Inbound Module (1)</STRONG></FONT></P><P>The inbound part scans a given datalake path for <CODE>.gpg</CODE> files, then decrypts each file locally in parallel using a configurable worker count. After decryption, it samples the CSV (semicolon-delimited), detects which columns contain base64-encoded data, and runs a transformation step to produce a cleaned output file. The transformed result is uploaded to a decrypted output path, and the original encrypted input is moved to an archive folder. It logs success or errors with timing details on file level and exits with a failure code if any file fails.</P><P>This code snippet describes the parallel processing of files:</P><pre class="lia-code-sample language-python"><code> with ThreadPoolExecutor(max_workers=MAX_PARALLEL_JOBS) as exe: futs = {exe.submit(processFile, f): f for f in files} for fut in as_completed(futs): f = futs[fut] try: res = fut.result() ok += 1 print(f"[OK] {res['input']} -&gt; {res['output']} sec={res['sec']:.2f} base64_cols={res['base64_cols']}") except Exception as ex: err.append((f, str(ex))) print(f"[ERR] {f}: {ex}")</code></pre><P>Sampel code of processing an individual file:</P><pre class="lia-code-sample language-python"><code>def processFile(file_name: str): t0 = timer() out_name = normalize_output_name(file_name) with tempfile.TemporaryDirectory() as td: enc_path = os.path.join(td, file_name) dec_path = os.path.join(td, out_name + ".decrypted.csv") out_path = os.path.join(td, out_name) download_to_file(f"{PATH_IN_DATALAKE}/{file_name}", enc_path) decrypt_symmetric(enc_path, dec_path) header, sample = sample_csv(dec_path, delimiter=";") base64_cols = detect_base64_columns(out_name, header, sample) transform_csv(dec_path, out_path, base64_cols, delimiter=";") mkdirs(PATH_OUT_DATALAKE) upload_file_chunked(f"{PATH_OUT_DATALAKE}/{out_name}", out_path) mkdirs(PATH_ARCHIVE) rename(f"{PATH_IN_DATALAKE}/{file_name}", f"{PATH_ARCHIVE}/{file_name}") return {"input": file_name, "output": out_name, "base64_cols": base64_cols, "sec": timer() - t0}</code></pre><P><FONT size="4"><STRONG>Outbound module (2)</STRONG></FONT></P><P><FONT size="3">It scans the HDLFS outbound folder for .csv files and subdirectories containing Parquet parts, then processes them in parallel using a configurable worker count. CSV files are downloaded locally, then encrypted and uploaded back again to an encrypted outbound path. The originals are moved to an archive folder. Parquet file based directories on HDLFS (when enabled) are downloaded, consolidated into a single CSV using PyArrow, encrypted and uploaded similarly. As a last step, they are marked with an _SUCCESS file to prevent reprocessing and moved to the archive.&nbsp;</FONT></P><P><FONT size="4"><STRONG>Crypto Module (3)</STRONG></FONT></P><P>It provides helper functions for symmetric file encryption and decryption using the <CODE>gpg</CODE> command-line tool with an AES-256 cipher. It requires a passphrase supplied via the <CODE>PASSPHRASE</CODE> environment variable (from a Kyma Secret). Both <CODE>encrypt_symmetric</CODE> and <CODE>decrypt_symmetric</CODE> execute GPG in batch mode through <CODE>subprocess</CODE>, capturing stdout/stderr and validating the return code.</P><P>The&nbsp;<CODE>decrypt_symmetric</CODE> function is implemented as follows:</P><P>&nbsp;</P><pre class="lia-code-sample language-python"><code>def decrypt_symmetric(enc_path: str, dec_path: str): _require_passphrase() cmd = [ "gpg", "--batch", "--yes", "--pinentry-mode", "loopback", "--passphrase", PASSPHRASE, "--output", dec_path, "--decrypt", enc_path ] r = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if r.returncode != 0: raise RuntimeError(f"GPG decrypt failed: {r.stderr.decode('utf-8', 'replace')}")</code></pre><P><FONT size="4"><STRONG>Common Functions Module (4)</STRONG></FONT></P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>All major control variables are built using environment variables (defined as secrets in Kyma) for endpoint/container, TLS certificates, verification behavior, timeouts, retries, and chunk size.</P><P>In one function it builds a reusable SSL context. API requests are wrapped with exponential-backoff retries for transient HTTP statuses (e.g., 429/5xx) and network errors. It provides HDLFS related helpers to list files/directories, check existence, create directories, rename paths, download remote content to disk in chunks, and upload files.</P><P>The below part builds the SSL context to connect to HDLFS via its REST API:</P></DIV></DIV></DIV></DIV></DIV></DIV></DIV><pre class="lia-code-sample language-python"><code>def buildSSLContext() -&gt; ssl.SSLContext: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) if os.path.exists(CRT_PATH) and os.path.exists(KEY_PATH): ctx.load_cert_chain(certfile=CRT_PATH, keyfile=KEY_PATH) if TLS_VERIFY: if CA_CERT_PATH: ctx.load_verify_locations(CA_CERT_PATH) else: ctx.load_default_certs() ctx.verify_mode = ssl.CERT_REQUIRED ctx.check_hostname = True else: ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE return ctx</code></pre><P><FONT size="4">This part establishes a connection to the HDLFS REST API endpoint as defined in the environment variable FILES_REST_API:</FONT></P><pre class="lia-code-sample language-abap"><code>def _conn(): if not FILES_REST_API: raise RuntimeError("FILES_REST_API is empty (set env FILES_REST_API).") return http.client.HTTPSConnection(FILES_REST_API, timeout=HTTP_TIMEOUT, context=_SSL_CTX)</code></pre><P><FONT size="4">The below function represents the upload (HDLFS REST API PUT) of a file in streaming mode to an HDLFS directory:</FONT></P><pre class="lia-code-sample language-python"><code>def _put_to_location(location: str): url = urlparse(location) if u.scheme and u.netloc: host = url.netloc path = (url.path or "/") + (("?" + url.query) if url.query else "") conn = http.client.HTTPSConnection(host, timeout=HTTP_TIMEOUT, context=_SSL_CTX) else: path = location conn = _conn() try: conn.putrequest("PUT", path) conn.putheader("x-sap-filecontainer", CONTAINER) conn.putheader("Content-Type", "application/octet-stream") conn.putheader("Content-Length", str(size)) conn.putheader("Connection", "close") conn.endheaders() with open(file_path, "rb") as f: while True: chunk = f.read(CHUNK_SIZE) if not chunk: break conn.send(chunk) r = conn.getresponse() data = r.read() status = r.status r.close() if status in _RETRYABLE_STATUSES: raise RetryableHttpError(f"PUT retryable: {status} {data[:200]!r}") if status not in (200, 201): raise RuntimeError(f"PUT failed {remote_path_no_leading_slash}: {status} {data[:200]!r}") finally: conn.close()</code></pre><P><STRONG><FONT size="5">7 Containerization &amp; Deployment in Kyma</FONT></STRONG></P><P>​I won't describe in detail, how the creation of a docker container is made step by step. I just provide some essentials + hints to guarantee that you succeed and don't stumble upon the same issues I had faced. The following prerequisites must be met in order to create a runnable docker container based on your Dockerfile + python code:</P><UL><LI>​Local installation of docker (Docker Desktop)</LI><LI>Docker registry (e.g. GitHub Docker Registry) – this is from where the Pod pulls the docker image</LI><LI>kubectl cli</LI><LI>IDE such as Visual Studio code</LI></UL><P>​For an overall procedure, including the part in Kyma, you can refer to this <A href="http://​https://community.sap.com/t5/technology-blog-posts-by-members/develop-and-deploy-python-rest-api-with-kubernetes-docker-in-sap-btp-kyma/ba-p/13533279" target="_blank" rel="noopener nofollow noreferrer">blog entry on SCN</A>. I strongly recommend that you try to rebuild the example the author walks through first, BEFORE you tackle your actual project.</P><P>Recommendations out of my personal learnings:</P><UL><LI>Try to not create any Kyma artifacts via the UI, but rather define those within descriptor yaml files of the corresponding kinds (e.g. kind: Deployment or Service or APIRule).</LI><LI><STRONG>​!!!</STRONG> A minor but very important thing to consider when running the docker build command, run it as follows:</LI></UL><pre class="lia-code-sample language-bash"><code>docker build . --tag ghcr.io/&lt;github_user&gt;/&lt;git_repo_name&gt;:latest --platform linux/amd64</code></pre><UL><LI>The deployment.yaml in the blog specified above is based on three Kyma/K8S artifacts that are created: <STRONG>Deployment, Service + APIRule</STRONG>. Which kind of artifacts you actually require strongly depends on your python implementation and how your service/logic runs. In the event of a purely job schedule based execution of your processing logic, <STRONG>you don't need a service or APIRule</STRONG> artifact, of course. Instead, you'd only need a <STRONG>deployment of kind: CronJob</STRONG>. This will spin up all dependent artifacts implicitely. In a CronJob based deployment you will have to specify the following details in the yaml file: scheduling details (time, frequency, time zone), required volumes, container spec including secrets to pull image, container level: mounts &amp; env variables, resource allocation.</LI><LI>A template for a CronJob based deployment can look like this:</LI></UL><pre class="lia-code-sample language-json"><code>apiVersion: batch/v1 kind: CronJob metadata: name: &lt;job_name&gt; namespace: &lt;kyma_namespace&gt; spec: suspend: false schedule: "* * * * *" timeZone: "Europe/Berlin" jobTemplate: spec: backoffLimit: 3 template: spec: restartPolicy: Never imagePullSecrets: - name: ghcr-pull-secret volumes: - name: gnupg-home emptyDir: {} initContainers: - name: init-gnupg image: busybox:1.36 command: ["sh","-c","mkdir -p /tmp/gnupg &amp;&amp; chmod 700 /tmp/gnupg"] volumeMounts: - name: gnupg-home mountPath: /tmp/gnupg resources: requests: cpu: "10m" memory: "32Mi" limits: cpu: "50m" memory: "64Mi" containers: - name: inbound image: &lt;container_registry_path&gt; imagePullPolicy: Always command: [&lt;custom_os_level_command_if_required&gt;] volumeMounts: - name: gnupg-home mountPath: /tmp/gnupg env: - name: KEY_PATH value: "/keys/keyfile.key" - name: PASSPHRASE valueFrom: secretKeyRef: name: kyma-secret key: PASSPHRASE resources: requests: cpu: "100m" memory: "1Gi" limits: cpu: "200m" memory: "2Gi"</code></pre><P><STRONG><FONT size="5">8 Achievements</FONT></STRONG></P><P>​The following functionality and service details were delivered:</P><UL><LI>The Python code was improved multiple times: Handling approx. 30 files in one go with a total of 10 GB in encrypted state could be accelerated to &lt; 30 minutes of processing time</LI><LI>Cron Jobs in the Kyma cluster can be used to schedule individual services, e.g. inbound processing of files that reside in a specific folder on HDLFS</LI><LI>SAP Datasphere writes local tables via Replication Flows back into HDLFS, on which the outbound service performs encryption and marks the files to β€žcollectibleβ€œ</LI></UL><P><STRONG><FONT size="5">9 More Scope</FONT></STRONG></P><P><FONT size="4">...up to come soon. I will cover aspects how to further mature the microservice/python logic and moreover exemplify on HTTP based encryption/decryption service endpoints, exposed on the Kyma Cluster.</FONT></P><P><FONT size="4"><STRONG><FONT size="5">10 References</FONT></STRONG></FONT></P><P><A href="https://community.sap.com/t5/technology-blog-posts-by-members/develop-and-deploy-python-rest-api-with-kubernetes-docker-in-sap-btp-kyma/ba-p/13533279" target="_self">​K8S/Kyma + Python SCN Blog</A></P><P><A href="http://​https://developers.sap.com/tutorials/data-lake-file-containers-hdlfscli.html" target="_self" rel="nofollow noopener noreferrer">​Getting Started with Data Lake Files HDLFSCLI</A></P><P><A href="http://​&nbsp;https://help.sap.com/doc/9d084a41830f46d6904fd4c23cd4bbfa/2025_3_QRC/en-US/index.html#tag/WebHDFS" target="_self" rel="nofollow noopener noreferrer">​HDLFS REST API Guide</A></P><P><FONT size="4"><STRONG><FONT size="5">Thx...</FONT></STRONG></FONT></P><P><FONT size="4">...to my fellow colleagues at SAP who provides meaningful input and discussed about solution options. Furthermore I am especially grateful to our implementation partner who also supported, implemented and showed strong endurance in building up this scenario.</FONT></P><P><FONT size="4">I hope you enjoyed reading this article and could have gained some deeper insights into what we did. If you have comments or suggestions of any kind, don't hesitate to comment and start-off a discussions with me and hopefully other SMEs.</FONT></P> 2026-02-11T16:12:01.099000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/sap-job-scheduling-service-free-tier-now-available-on-btp-live/ba-p/14327952 πŸš€ SAP Job Scheduling Service: Free Tier Now Available on BTP Live 2026-02-13T12:48:39.945000+01:00 DenisDuev https://community.sap.com/t5/user/viewprofilepage/user-id/180332 <DIV class=""><H1 id="toc-hId-1660595266"><span class="lia-unicode-emoji" title=":rocket:">πŸš€</span> Free Tier Now Available on BTP Live: Schedule Jobs at Zero Cost!</H1></DIV><P>Great news for the SAP BTP community! After the successful launch of our Free plan on BTP Trial, we're thrilled to announce that the<SPAN>&nbsp;</SPAN><STRONG>Free tier for SAP Job Scheduling Service is now available on BTP Live (Production)!</STRONG><SPAN>&nbsp;</SPAN><span class="lia-unicode-emoji" title=":party_popper:">πŸŽ‰</span></P><P>Whether you're building personal projects, creating proof-of-concepts, or running small-scale production workloads, you can now leverage the power of automated job scheduling without incurring any costs!</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="hero-btp-live-free.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372297iFF1CC7A3C65123E1/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="hero-btp-live-free.png" alt="hero-btp-live-free.png" /></span></P><DIV class=""><H2 id="toc-hId-1593164480"><span class="lia-unicode-emoji" title=":glowing_star:">🌟</span> What is the Free Tier?</H2></DIV><P>The Free tier is a<SPAN>&nbsp;</SPAN><STRONG>no-cost service plan</STRONG><SPAN>&nbsp;</SPAN>that provides you with production-grade job scheduling capabilities on SAP Business Technology Platform. It's designed to give developers, students, indie builders, and enterprises access to powerful scheduling features without financial barriers.</P><DIV class=""><H3 id="toc-hId-1525733694">Key Highlights</H3></DIV><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>Zero Cost</STRONG><SPAN>&nbsp;</SPAN>- No charges, no hidden fees, no credit card required.<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>Production Ready</STRONG><SPAN>&nbsp;</SPAN>- Available on both BTP Trial AND BTP Live.<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>OAuth 2.0 Security</STRONG><SPAN>&nbsp;</SPAN>- Modern authentication, same as Standard plan.<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>Full Feature Set</STRONG><SPAN>&nbsp;</SPAN>- Access to all core scheduling capabilities.<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>15 Schedules</STRONG><SPAN>&nbsp;</SPAN>- Enough for real-world small to medium applications.<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span><SPAN>&nbsp;</SPAN><STRONG>Hourly Scheduling</STRONG><SPAN>&nbsp;</SPAN>- Perfect for regular tasks and automation.</P><DIV class=""><H2 id="toc-hId-1200137470"><span class="lia-unicode-emoji" title=":direct_hit:">🎯</span> Who is the Free Tier For?</H2></DIV><P>The Free tier is perfect for:</P><DIV class=""><H3 id="toc-hId-1132706684">πŸ§ͺ Proof of Concepts</H3></DIV><UL><LI>Validate scheduling logic before committing to Standard plan</LI><LI>Demonstrate capabilities to stakeholders</LI><LI>Test integration with other BTP services</LI><LI>Build MVPs and demos</LI></UL><DIV class=""><H3 id="toc-hId-936193179"><span class="lia-unicode-emoji" title=":office_building:">🏒</span> Small Production Workloads</H3></DIV><UL><LI>Run lightweight scheduled tasks in production</LI><LI>Automate periodic maintenance jobs</LI><LI>Schedule regular reports and notifications</LI><LI>Power small-scale applications</LI></UL><DIV class=""><H3 id="toc-hId-739679674"><span class="lia-unicode-emoji" title=":briefcase:">πŸ’Ό</span> Enterprise Evaluation</H3></DIV><UL><LI>Test Job Scheduling Service in your landscape</LI><LI>Evaluate before enterprise-wide adoption</LI><LI>Train your team on production patterns</LI><LI>Prototype solutions for larger implementations</LI></UL><BLOCKQUOTE><P>Update to the Standard plan when you need more schedules, sub-hourly intervals, or SLA-backed support for business-critical workloads.</P></BLOCKQUOTE><DIV class=""><H2 id="toc-hId-414083450"><span class="lia-unicode-emoji" title=":vs_button:">πŸ†š</span> How Does Free Compare to Standard?</H2></DIV><P>Here's a detailed comparison to help you choose the right plan:<BR /><BR /></P><TABLE><TBODY><TR><TD><H3 id="toc-hId-346652664"><STRONG>Feature</STRONG></H3></TD><TD><H3 id="toc-hId-150139159"><STRONG><CODE>Free</CODE>&nbsp;Plan <span class="lia-unicode-emoji" title=":free_button:">πŸ†“</span></STRONG></H3></TD><TD><H3 id="toc-hId--121605715"><STRONG><CODE>Standard</CODE>&nbsp;Plan <span class="lia-unicode-emoji" title=":briefcase:">πŸ’Ό</span></STRONG></H3></TD></TR><TR><TD><STRONG>Cost</STRONG></TD><TD>$0/month</TD><TD>Pay-as-you-go pricing</TD></TR><TR><TD><STRONG>Availability</STRONG></TD><TD>Trial &amp; Live</TD><TD>Live</TD></TR><TR><TD><STRONG>Number of Schedules</STRONG></TD><TD>15</TD><TD>Unlimited</TD></TR><TR><TD><STRONG>Minimum Interval</STRONG></TD><TD>1 hour <span class="lia-unicode-emoji" title=":alarm_clock:">⏰</span></TD><TD>5 minutes <span class="lia-unicode-emoji" title=":high_voltage:">⚑</span></TD></TR><TR><TD><STRONG>Authentication</STRONG></TD><TD>OAuth 2.0 <span class="lia-unicode-emoji" title=":locked:">πŸ”’</span></TD><TD>OAuth 2.0 <span class="lia-unicode-emoji" title=":locked:">πŸ”’</span></TD></TR><TR><TD><STRONG>Multitenancy</STRONG></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD><STRONG>REST API</STRONG></TD><TD>Full access <span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD>Full access <span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD><STRONG>Alert Notifications</STRONG></TD><TD>Unlimited <span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD>Unlimited <span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD><STRONG>CF Tasks</STRONG></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD><STRONG>Cloud ALM</STRONG></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span></TD></TR><TR><TD><STRONG>Support</STRONG></TD><TD>No, only Community <span class="lia-unicode-emoji" title=":busts_in_silhouette:">πŸ‘₯</span></TD><TD>SLA-backed <span class="lia-unicode-emoji" title=":shield:">πŸ›‘</span>️</TD></TR><TR><TD><STRONG>Best For</STRONG></TD><TD>Learning, small workloads, PoCs</TD><TD>Production, enterprise, high-frequency jobs</TD></TR></TBODY></TABLE><BLOCKQUOTE><P><span class="lia-unicode-emoji" title=":light_bulb:">πŸ’‘</span><SPAN>&nbsp;</SPAN><STRONG>Tip:</STRONG><SPAN>&nbsp;</SPAN>For production workloads requiring SLA-backed support, consider the<SPAN>&nbsp;</SPAN><CODE>Standard</CODE><SPAN>&nbsp;</SPAN>plan.</P></BLOCKQUOTE><DIV class=""><H3 id="toc-hId--318119220">When to Choose Free</H3></DIV><UL><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You need<SPAN>&nbsp;</SPAN><STRONG>15 or fewer</STRONG><SPAN>&nbsp;</SPAN>scheduled jobs</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> Hourly or less frequent scheduling is sufficient</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You're comfortable with community support</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You want<SPAN>&nbsp;</SPAN><STRONG>zero cost</STRONG><SPAN>&nbsp;</SPAN>scheduling</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You're building PoCs, demos, or learning projects</LI></UL><DIV class=""><H3 id="toc-hId--514632725">When to Update to Standard</H3></DIV><UL><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You need<SPAN>&nbsp;</SPAN><STRONG>more than 15</STRONG><SPAN>&nbsp;</SPAN>schedules</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You require<SPAN>&nbsp;</SPAN><STRONG>sub-hourly</STRONG><SPAN>&nbsp;</SPAN>scheduling (every 5 minutes, etc.)</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You need<SPAN>&nbsp;</SPAN><STRONG>SLA-backed support</STRONG></LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You're running<SPAN>&nbsp;</SPAN><STRONG>business-critical</STRONG><SPAN>&nbsp;</SPAN>production workloads</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">βœ…</span> You require<SPAN>&nbsp;</SPAN><STRONG>faster response times</STRONG><SPAN>&nbsp;</SPAN>from SAP support</LI></UL><BLOCKQUOTE><P><span class="lia-unicode-emoji" title=":light_bulb:">πŸ’‘</span><SPAN>&nbsp;</SPAN><STRONG>Good News:</STRONG><SPAN>&nbsp;</SPAN>Updating from Free to Standard is seamless! Your jobs, schedules, and configurations are preserved. (continue reading for detailed instructions)</P></BLOCKQUOTE><P>That's it for the overview! Scroll down for a quick reference guide and step-by-step instructions to get started with the Free tier on BTP Live.</P><HR /><DIV class=""><H2 id="toc-hId--417743223"><span class="lia-unicode-emoji" title=":rocket:">πŸš€</span> How to create instance of Free Tier on BTP Live</H2></DIV><DIV class=""><H3 id="toc-hId--907659735">Using the BTP Cockpit</H3></DIV><DIV class=""><H4 id="toc-hId--1397576247">Step 1: Access BTP Cockpit</H4></DIV><OL><LI>Log in to your<SPAN>&nbsp;</SPAN><A href="https://cockpit.btp.cloud.sap/" target="_blank" rel="nofollow noopener noreferrer">SAP BTP Cockpit</A></LI><LI>Navigate to your<SPAN>&nbsp;</SPAN><STRONG>Global Account</STRONG><SPAN>&nbsp;</SPAN>β†’<SPAN>&nbsp;</SPAN><STRONG>Subaccount</STRONG></LI><LI>Make sure you're in the<SPAN>&nbsp;</SPAN><STRONG>Live</STRONG><SPAN>&nbsp;</SPAN>(production) environment</LI></OL><DIV class=""><H4 id="toc-hId--1594089752">Step 2: Find Job Scheduling Service</H4></DIV><OL><LI>In your subaccount, go to<SPAN>&nbsp;</SPAN><STRONG>Service Marketplace</STRONG></LI><LI>Search for "<STRONG>Job Scheduling Service</STRONG>"</LI><LI>Click on the service to see available plans</LI></OL><DIV class=""><H4 id="toc-hId--1790603257">Step 3: Create Free Plan Instance</H4></DIV><P><STRONG>Using the BTP Cockpit:</STRONG></P><OL><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Create</STRONG><SPAN>&nbsp;</SPAN>button</LI><LI>Select<SPAN>&nbsp;</SPAN><STRONG>Service</STRONG>: Job Scheduling Service</LI><LI>Select<SPAN>&nbsp;</SPAN><STRONG>Plan</STRONG>:<SPAN>&nbsp;</SPAN><CODE>free</CODE><SPAN>&nbsp;</SPAN><span class="lia-unicode-emoji" title=":star:">⭐</span></LI><LI>Enter an<SPAN>&nbsp;</SPAN><STRONG>Instance Name</STRONG>: e.g.,<SPAN>&nbsp;</SPAN><CODE>my-free-scheduler</CODE></LI><LI>Optionally configure parameters (usually not needed)</LI><LI>Click<SPAN>&nbsp;</SPAN><STRONG>Create</STRONG></LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="create-free-instance.gif" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372298iB63067D6CAA5C927/image-size/large?v=v2&amp;px=999" role="button" title="create-free-instance.gif" alt="create-free-instance.gif" /></span></P><DIV class=""><H3 id="toc-hId--1693713755">Using the Cloud Foundry CLI</H3></DIV><DIV class=""><PRE><SPAN class=""># Log in to your CF space</SPAN> cf login -a <SPAN class="">&lt;</SPAN>api-endpoint<SPAN class="">&gt;</SPAN> <SPAN class=""># Create free tier instance</SPAN> cf create-service jobscheduler free my-free-scheduler <SPAN class=""># Verify creation</SPAN> cf service my-free-scheduler</PRE></DIV><P>Note: you can check what is available in your region with<SPAN>&nbsp;</SPAN><CODE>cf marketplace -e jobscheduler</CODE></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="create-instance-cli.gif" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372296iE786DD5E70146172/image-size/large?v=v2&amp;px=999" role="button" title="create-instance-cli.gif" alt="create-instance-cli.gif" /></span></P><DIV class=""><H2 id="toc-hId--1596824253"><span class="lia-unicode-emoji" title=":counterclockwise_arrows_button:">πŸ”„</span> Updating from Free to Standard</H2></DIV><P>Need more power? Updating is seamless (see below)!<SPAN>&nbsp;</SPAN><STRONG>Everything</STRONG><SPAN>&nbsp;</SPAN>is preserved!</P><DIV class=""><H3 id="toc-hId--1918557074">Using the BTP Cockpit</H3></DIV><OL><LI>Navigate to your Job Scheduling Service instance in the BTP Cockpit</LI><LI>Click on the instance to view details</LI><LI>Click the<SPAN>&nbsp;</SPAN><STRONG>Actions</STRONG><SPAN>&nbsp;</SPAN>dropdown and select<SPAN>&nbsp;</SPAN><STRONG>Update</STRONG></LI><LI>Choose the<SPAN>&nbsp;</SPAN><CODE>standard</CODE><SPAN>&nbsp;</SPAN>plan and press<SPAN>&nbsp;</SPAN><STRONG>Update Instance</STRONG></LI><LI>Wait for the update to complete (usually a few seconds)</LI><LI>Restage your app to pick up changes</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="update-instance.gif" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372299i83C40A6C9D86BB4B/image-size/large?v=v2&amp;px=999" role="button" title="update-instance.gif" alt="update-instance.gif" /></span></P><DIV class=""><H3 id="toc-hId--2115070579">Using the Cloud Foundry CLI</H3></DIV><DIV class=""><PRE><SPAN class=""># Update service plan</SPAN> cf update-service my-free-scheduler -p standard <SPAN class=""># Restage your app to pick up changes</SPAN></PRE><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="update-instance-cli.gif" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372295i4C19E2D47CA1598E/image-size/large?v=v2&amp;px=999" role="button" title="update-instance-cli.gif" alt="update-instance-cli.gif" /></span></DIV></DIV><BLOCKQUOTE><P><span class="lia-unicode-emoji" title=":warning:">⚠️</span><SPAN>&nbsp;</SPAN><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>Updating to Standard will start incurring charges based on usage. When you update your plan, all executions performed on the<SPAN>&nbsp;</SPAN><STRONG>same day</STRONG><SPAN>&nbsp;</SPAN>are charged toward the<SPAN>&nbsp;</SPAN><CODE>standard</CODE><SPAN>&nbsp;</SPAN>plan.</P></BLOCKQUOTE><DIV class=""><H2 id="toc-hId--2018181077"><span class="lia-unicode-emoji" title=":books:">πŸ“š</span> Additional Resources</H2></DIV><DIV class=""><H3 id="toc-hId-1786869707">Documentation</H3></DIV><UL><LI><A href="https://help.sap.com/docs/JOB_SCHEDULER" target="_blank" rel="noopener noreferrer">SAP Job Scheduling Service Help</A></LI><LI><A href="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/service-plans" target="_blank" rel="noopener noreferrer">Free Plan Service Plans</A></LI><LI><A href="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/rest-api" target="_blank" rel="noopener noreferrer">REST API Reference</A></LI><LI><A href="https://help.sap.com/docs/job-scheduling/sap-job-scheduling-service/secure-access" target="_blank" rel="noopener noreferrer">Secure Access Configuration</A></LI></UL><DIV class=""><H3 id="toc-hId-1590356202">Discovery Center</H3></DIV><UL><LI><A href="https://discovery-center.cloud.sap/index.html#/serviceCatalog/job-scheduling-service?region=all&amp;tab=service_plan" target="_blank" rel="nofollow noopener noreferrer">Job Scheduling Service in Discovery Center</A></LI></UL><DIV class=""><H3 id="toc-hId-1393842697">Community</H3></DIV><UL><LI><A href="https://community.sap.com/t5/technology-blogs-by-sap/job-scheduler-in-sap-business-technology-platform-overview-of-blog-posts/ba-p/13510707" target="_blank">All Job Scheduler Blog Posts</A></LI><LI><A href="https://community.sap.com/t5/technology-q-a/bd-p/technology-questions" target="_blank">SAP Community Q&amp;A</A></LI></UL><DIV class=""><H3 id="toc-hId-1197329192">Related Blog Posts</H3></DIV><UL><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/ho-ho-ho-a-christmas-present-from-sap-job-scheduling-service-free-plan-on/ba-p/14292434" target="_blank">Christmas Present: Free Plan on BTP Trial</A></LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/lite-plan-deprecation-time-to-upgrade-to-free-sap-job-scheduling-service/ba-p/14314717" target="_blank">Lite Plan Deprecation Notice</A></LI></UL><DIV class=""><H2 id="toc-hId-1294218694"><span class="lia-unicode-emoji" title=":party_popper:">πŸŽ‰</span> Start Scheduling Today!</H2></DIV><P>The Free tier makes SAP Job Scheduling Service accessible to everyone. Whether you're a student learning the ropes, a developer building a side project, or an enterprise evaluating the service, you can now schedule jobs at<SPAN>&nbsp;</SPAN><STRONG>zero cost</STRONG><SPAN>&nbsp;</SPAN>on BTP Live!</P><DIV class=""><H2 id="toc-hId-1097705189"><span class="lia-unicode-emoji" title=":balance_scale:">βš–οΈ</span> Terms and Conditions</H2></DIV><P>Free tier service plans are subject to additional terms:</P><UL><LI><span class="lia-unicode-emoji" title=":warning:">⚠️</span><SPAN>&nbsp;</SPAN><STRONG>No SLA</STRONG>: Service Level Agreements do not apply to free plans</LI><LI><span class="lia-unicode-emoji" title=":warning:">⚠️</span><SPAN>&nbsp;</SPAN><STRONG>Community Support Only</STRONG>: No official SAP support tickets</LI><LI><span class="lia-unicode-emoji" title=":warning:">⚠️</span><SPAN>&nbsp;</SPAN><STRONG>Subject to Terms</STRONG>: Usage governed by<SPAN>&nbsp;</SPAN><A href="https://www.sap.com/about/trust-center/agreements/cloud/cloud-services.html" target="_blank" rel="noopener noreferrer">Business Technology Platform Supplemental Terms and Conditions</A></LI><LI><span class="lia-unicode-emoji" title=":warning:">⚠️</span><SPAN>&nbsp;</SPAN><STRONG>Fair Use</STRONG>: SAP reserves the right to enforce fair use policies</LI><LI><span class="lia-unicode-emoji" title=":warning:">⚠️</span><SPAN>&nbsp;</SPAN><STRONG>Service Changes</STRONG>: SAP may modify or discontinue free tier with notice</LI></UL><BLOCKQUOTE><P><span class="lia-unicode-emoji" title=":light_bulb:">πŸ’‘</span> For production workloads requiring SLAs and official support, update to the <STRONG>Standard</STRONG> plan.</P></BLOCKQUOTE><HR /><P><STRONG>Happy Scheduling! <span class="lia-unicode-emoji" title=":party_popper:">πŸŽ‰</span></STRONG></P><P><EM>The SAP Job Scheduling Service Team</EM></P><HR /><P><STRONG>Have questions?</STRONG><SPAN>&nbsp;</SPAN>Drop a comment below or visit the<SPAN>&nbsp;</SPAN><A href="https://community.sap.com/" target="_blank">SAP Community</A><SPAN>&nbsp;</SPAN>to start a discussion!</P> 2026-02-13T12:48:39.945000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/from-cloud-foundry-to-kyma-on-sap-btp-5-essential-migration-patterns/ba-p/14328724 From Cloud Foundry to Kyma on SAP BTP: 5 Essential Migration Patterns 2026-02-17T08:40:01.820000+01:00 neilaspin https://community.sap.com/t5/user/viewprofilepage/user-id/167493 <H1 id="toc-hId-1660623044">From Cloud Foundry to Kyma on SAP BTP: 5 Essential Migration Patterns</H1><H2 id="toc-hId-1593192258">Introduction</H2><P>This blog covers five core patterns you'll need when moving from CF to Kyma, with working examples you can test on a BTP Trial Kyma cluster. Each pattern is presented as a direct comparison: here's how you did it in Cloud Foundry, here's how you do it in Kyma. The code examples are complete and testedβ€”you can copy them into your own Kyma environment and see them work. By the end, you'll have a practical understanding of the migration path and reference code you can adapt for your own applications.</P><P><STRONG>What you'll learn:</STRONG></P><OL><LI>Basic deployment with APIRules (Istio-based routing)</LI><LI>Service bindings using Kubernetes-native patterns</LI><LI>Pre-runtime configuration with init containers</LI><LI>Credential Store integration for secrets management</LI><LI>Destination Service integration from Kyma</LI></OL><H2 id="toc-hId-1396678753">Prerequisites</H2><P>Before starting, you'll need:</P><UL><LI>SAP BTP Trial account with Kyma environment enabled</LI><LI><CODE>kubectl</CODE> CLI installed locally</LI><LI>Basic familiarity with Kubernetes concepts</LI></UL><H2 id="toc-hId-1200165248">Setup: Download Your Kubeconfig</H2><P>First, let's get connected to your Kyma cluster:</P><PRE><CODE># Create directory structure mkdir -p ~/kyma-tutorials cd ~/kyma-tutorials # Download kubeconfig from BTP Cockpit # Navigate to: Subaccount β†’ Kyma Environment β†’ Download Kubeconfig # Save to ~/.kube/config-kyma-trial # Set kubeconfig export KUBECONFIG=~/.kube/config-kyma-trial # Verify connection kubectl cluster-info</CODE></PRE><P><STRONG>Critical first step:</STRONG> Enable Istio sidecar injection on your namespace. Kyma requires this for external routing to work:</P><PRE><CODE># Create namespace kubectl create namespace demo-app # Enable Istio injection kubectl label namespace demo-app istio-injection=enabled # Set as default kubectl config set-context --current --namespace=demo-app</CODE></PRE><H2 id="toc-hId-1003651743">Pattern 1: Deployment and Routing with APIRules</H2><P><STRONG>CF Pattern:</STRONG></P><PRE><CODE>cf push myapp</CODE></PRE><P><STRONG>Kyma Pattern:</STRONG> In Kyma, you need three resources: Deployment, Service, and APIRule.</P><PRE><CODE>apiVersion: apps/v1 kind: Deployment metadata: name: hello-kyma namespace: demo-app spec: replicas: 1 selector: matchLabels: app: hello-kyma template: metadata: labels: app: hello-kyma spec: containers: - name: hello image: hashicorp/http-echo:latest args: - "-text=Hello from Kyma!" ports: - containerPort: 5678 --- apiVersion: v1 kind: Service metadata: name: hello-kyma-service namespace: demo-app spec: selector: app: hello-kyma ports: - protocol: TCP port: 80 targetPort: 5678 --- apiVersion: gateway.kyma-project.io/v2alpha1 kind: APIRule metadata: name: hello-kyma-api namespace: demo-app spec: gateway: kyma-system/kyma-gateway hosts: - hello-kyma.&lt;YOUR_CLUSTER_DOMAIN&gt; service: name: hello-kyma-service port: 80 rules: - path: /* methods: ["GET"] noAuth: true</CODE></PRE><P>Deploy it:</P><PRE><CODE>kubectl apply -f deployment.yaml # Wait for pod with Istio sidecar kubectl get pods -n demo-app # You should see 2/2 containers (app + istio-proxy) # Test your app curl https://hello-kyma.&lt;YOUR_CLUSTER_DOMAIN&gt;</CODE></PRE><P><STRONG>Key differences:</STRONG></P><UL><LI>CF Router β†’ Istio + APIRule</LI><LI>CF routes β†’ APIRule hosts</LI><LI>Automatic SSL in both, but APIRule uses <CODE>noAuth: true</CODE> vs App Router patterns</LI></UL><HR /><H2 id="toc-hId-807138238">Pattern 2: Service Bindings - From VCAP_SERVICES to Kubernetes Secrets</H2><P><STRONG>CF Pattern:</STRONG></P><PRE><CODE>cf create-service xsuaa application myxsuaa cf bind-service myapp myxsuaa # Credentials appear in VCAP_SERVICES environment variable</CODE></PRE><P><STRONG>Kyma Pattern:</STRONG> In Kyma, service bindings create Kubernetes Secrets.</P><PRE><CODE>apiVersion: services.cloud.sap.com/v1 kind: ServiceInstance metadata: name: kyma-xsuaa namespace: demo-app spec: serviceOfferingName: xsuaa servicePlanName: application parameters: xsappname: kyma-demo-xsuaa tenant-mode: dedicated scopes: - name: "$XSAPPNAME.Read" description: "Read permission" role-templates: - name: Reader scope-references: - "$XSAPPNAME.Read" --- apiVersion: services.cloud.sap.com/v1 kind: ServiceBinding metadata: name: kyma-xsuaa-binding namespace: demo-app spec: serviceInstanceName: kyma-xsuaa secretName: kyma-xsuaa-secret</CODE></PRE><P>Deploy it:</P><PRE><CODE>kubectl apply -f xsuaa-instance.yaml # Wait for ready (takes 1-2 minutes) kubectl get serviceinstance kyma-xsuaa -n demo-app -w</CODE></PRE><P>Now use the credentials in your app - you have two options:</P><P><STRONG>Option 1: Environment Variables</STRONG></P><PRE><CODE>env: - name: XSUAA_CLIENTID valueFrom: secretKeyRef: name: kyma-xsuaa-secret key: clientid - name: XSUAA_CLIENTSECRET valueFrom: secretKeyRef: name: kyma-xsuaa-secret key: clientsecret</CODE></PRE><P><STRONG>Option 2: Volume Mounts</STRONG></P><PRE><CODE>volumeMounts: - name: xsuaa-volume mountPath: /etc/secrets/xsuaa readOnly: true volumes: - name: xsuaa-volume secret: secretName: kyma-xsuaa-secret</CODE></PRE><P>Then read credentials from files:</P><PRE><CODE>const fs = require('fs'); const clientId = fs.readFileSync('/etc/secrets/xsuaa/clientid', 'utf8'); const clientSecret = fs.readFileSync('/etc/secrets/xsuaa/clientsecret', 'utf8');</CODE></PRE><P><STRONG>Key differences:</STRONG></P><P>Cloud Foundry Kyma</P><TABLE><TBODY><TR><TD><CODE>cf bind-service</CODE></TD><TD><CODE>ServiceBinding</CODE> resource</TD></TR><TR><TD><CODE>VCAP_SERVICES</CODE> JSON</TD><TD>Kubernetes Secret</TD></TR><TR><TD>Auto-injected as env var</TD><TD>Mount as volume OR env vars</TD></TR><TR><TD>App parses JSON</TD><TD>App reads individual keys</TD></TR></TBODY></TABLE><HR /><H2 id="toc-hId-610624733">Pattern 3: Pre-Runtime Configuration - From .profile to Init Containers</H2><P><STRONG>CF Pattern:</STRONG> Create a <CODE>.profile</CODE> script in your app directory:</P><PRE><CODE>#!/bin/bash echo "Decrypting secrets..." # Runs before app starts, in same container</CODE></PRE><P><STRONG>Kyma Pattern:</STRONG> Use Kubernetes Init Containers that run before your main app:</P><PRE><CODE>apiVersion: apps/v1 kind: Deployment metadata: name: init-demo namespace: demo-app spec: template: spec: # Init container runs FIRST initContainers: - name: decrypt-config image: busybox:latest command: - sh - -c - | echo "Init container running..." # Decrypt secrets, download certs, etc. cat /encrypted/config.txt | base64 -d &gt; /decrypted/config.txt echo "Runtime info: $(date)" &gt;&gt; /decrypted/runtime-info.txt echo "Init complete!" volumeMounts: - name: encrypted-volume mountPath: /encrypted - name: decrypted-volume mountPath: /decrypted # Main app runs AFTER init completes containers: - name: app image: myapp:latest volumeMounts: - name: decrypted-volume mountPath: /decrypted readOnly: true volumes: - name: encrypted-volume configMap: name: encrypted-config - name: decrypted-volume emptyDir: {}</CODE></PRE><P><STRONG>Key differences:</STRONG></P><P>CF .profile Kyma Init Containers</P><TABLE><TBODY><TR><TD>Shell script only</TD><TD>Any container image</TD></TR><TR><TD>Same container</TD><TD>Separate container</TD></TR><TR><TD>Sequential only</TD><TD>Multiple init containers (chained)</TD></TR><TR><TD>No resource limits</TD><TD>CPU/memory limits per init</TD></TR></TBODY></TABLE><P><STRONG>Real-world use cases:</STRONG></P><UL><LI>Decrypt Credential Store secrets</LI><LI>Download certificates from external CA</LI><LI>Run database migrations</LI><LI>Generate dynamic configuration</LI><LI>Wait for dependencies to be ready</LI></UL><HR /><H2 id="toc-hId-414111228">Pattern 4: Credential Store Integration</H2><P>In CF, you might fetch credentials in your <CODE>.profile</CODE> script. In Kyma, use an init container to fetch from Credential Store and write to a shared volume.</P><P>First, create the Credential Store service:</P><PRE><CODE>apiVersion: services.cloud.sap.com/v1 kind: ServiceInstance metadata: name: credstore namespace: demo-app spec: serviceOfferingName: credstore servicePlanName: trial --- apiVersion: services.cloud.sap.com/v1 kind: ServiceBinding metadata: name: credstore-binding namespace: demo-app spec: serviceInstanceName: credstore secretName: credstore-secret</CODE></PRE><P>Then fetch credentials in an init container:</P><PRE><CODE>spec: initContainers: - name: fetch-credentials image: curlimages/curl:latest command: - sh - -c - | # Get OAuth token OAUTH_URL="$(cat /credstore/url | sed 's|/api.*||')/oauth/token" TOKEN=$(curl -s -X POST "$OAUTH_URL" \ -d "grant_type=client_credentials" \ -d "client_id=$(cat /credstore/username)" \ -d "client_secret=$(cat /credstore/password)" \ | jq -r '.access_token') # Fetch credential CRED_URL=$(cat /credstore/url) curl -s "$CRED_URL/password?name=database-password" \ -H "Authorization: Bearer $TOKEN" \ | jq -r '.value' &gt; /secrets/db-password volumeMounts: - name: credstore-creds mountPath: /credstore readOnly: true - name: runtime-secrets mountPath: /secrets containers: - name: app image: myapp:latest volumeMounts: - name: runtime-secrets mountPath: /secrets readOnly: true volumes: - name: credstore-creds secret: secretName: credstore-secret - name: runtime-secrets emptyDir: {}</CODE></PRE><P><STRONG>Why this matters:</STRONG></P><UL><LI>Credentials NOT stored in Kubernetes Secrets (more secure)</LI><LI>Credentials fetched at runtime (can rotate without redeploying)</LI><LI>Main app doesn't need Credential Store SDK</LI><LI>Init container separates credential management from app logic</LI></UL><HR /><H2 id="toc-hId-217597723">Pattern 5: Destination Service Integration</H2><P><STRONG>CF Pattern:</STRONG> In CF, you use the App Router with <CODE>@sap/approuter</CODE> package, which handles Destination Service integration automatically.</P><P><STRONG>Kyma Pattern:</STRONG> In Kyma, you need to call the Destination Service API directly from your application.</P><P>First, create the destination in BTP Cockpit:</P><OL><LI>Go to Connectivity β†’ Destinations</LI><LI>Create destination:<UL><LI>Name: <CODE>backend-api</CODE></LI><LI>URL: <CODE><A href="https://api.example.com" target="_blank" rel="noopener nofollow noreferrer">https://api.example.com</A></CODE></LI><LI>Authentication: <CODE>NoAuthentication</CODE></LI><LI>Additional Property: <CODE>forwardAuthToken = true</CODE></LI></UL></LI></OL><P>Then create the Destination service instance:</P><PRE><CODE>apiVersion: services.cloud.sap.com/v1 kind: ServiceInstance metadata: name: destination namespace: demo-app spec: serviceOfferingName: destination servicePlanName: lite --- apiVersion: services.cloud.sap.com/v1 kind: ServiceBinding metadata: name: destination-binding namespace: demo-app spec: serviceInstanceName: destination secretName: destination-secret</CODE></PRE><P>Use it in your Node.js app:</P><PRE><CODE>const express = require('express'); const axios = require('axios'); const fs = require('fs'); const app = express(); // Read Destination Service credentials from mounted secret const destCreds = { uri: fs.readFileSync('/etc/secrets/destination/uri', 'utf8').trim(), clientid: fs.readFileSync('/etc/secrets/destination/clientid', 'utf8').trim(), clientsecret: fs.readFileSync('/etc/secrets/destination/clientsecret', 'utf8').trim(), url: fs.readFileSync('/etc/secrets/destination/url', 'utf8').trim() }; app.get('/call-backend', async (req, res) =&gt; { try { // 1. Get OAuth token for Destination Service const tokenResponse = await axios.post( `${destCreds.url}/oauth/token`, new URLSearchParams({ grant_type: 'client_credentials', client_id: destCreds.clientid, client_secret: destCreds.clientsecret }), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ); const token = tokenResponse.data.access_token; // 2. Get destination configuration const destResponse = await axios.get( `${destCreds.uri}/destination-configuration/v1/destinations/backend-api`, { headers: { Authorization: `Bearer ${token}` } } ); const backendUrl = destResponse.data.destinationConfiguration.URL; // 3. Call backend via destination const backendResponse = await axios.get(`${backendUrl}/posts/1`); res.json({ message: 'Success!', data: backendResponse.data }); } catch (error) { res.status(500).json({ error: error.message }); } }); app.listen(8080);</CODE></PRE><P>Deploy with the secret mounted:</P><PRE><CODE>apiVersion: apps/v1 kind: Deployment metadata: name: destination-demo spec: template: spec: containers: - name: app image: node:18-alpine volumeMounts: - name: destination-creds mountPath: /etc/secrets/destination readOnly: true volumes: - name: destination-creds secret: secretName: destination-secret --- apiVersion: gateway.kyma-project.io/v2alpha1 kind: APIRule metadata: name: destination-demo-api spec: gateway: kyma-system/kyma-gateway hosts: - destination-demo.&lt;YOUR_CLUSTER_DOMAIN&gt; service: name: destination-demo-service port: 80 rules: - path: /* methods: ["GET"] noAuth: true</CODE></PRE><P><STRONG>Key differences:</STRONG></P><P>Cloud Foundry Kyma</P><TABLE><TBODY><TR><TD>App Router handles it</TD><TD>Manual API calls</TD></TR><TR><TD><CODE>@sap/approuter</CODE> package</TD><TD>Custom integration code</TD></TR><TR><TD>Auto-configured routes</TD><TD>Explicit OAuth + API calls</TD></TR></TBODY></TABLE><HR /><H2 id="toc-hId-21084218">Summary: CF vs Kyma Migration Checklist</H2><P>Feature Cloud Foundry Kyma Equivalent</P><TABLE><TBODY><TR><TD><STRONG>Deploy</STRONG></TD><TD><CODE>cf push</CODE></TD><TD><CODE>kubectl apply -f deployment.yaml</CODE></TD></TR><TR><TD><STRONG>Service Binding</STRONG></TD><TD><CODE>cf bind-service</CODE></TD><TD><CODE>ServiceBinding</CODE> resource</TD></TR><TR><TD><STRONG>Credentials</STRONG></TD><TD><CODE>VCAP_SERVICES</CODE> JSON env var</TD><TD>Kubernetes Secret (volume/env)</TD></TR><TR><TD><STRONG>Pre-runtime</STRONG></TD><TD><CODE>.profile</CODE> script</TD><TD>Init Containers</TD></TR><TR><TD><STRONG>Routing</STRONG></TD><TD>CF Router + routes</TD><TD>Istio + APIRule</TD></TR><TR><TD><STRONG>Authentication</STRONG></TD><TD>App Router</TD><TD>APIRule <CODE>accessStrategies</CODE></TD></TR><TR><TD><STRONG>Namespace isolation</STRONG></TD><TD>CF Spaces (shared network)</TD><TD>K8s Namespaces (network policies)</TD></TR><TR><TD><STRONG>Scaling</STRONG></TD><TD><CODE>cf scale</CODE></TD><TD><CODE>kubectl scale</CODE> or HPA</TD></TR></TBODY></TABLE><H2 id="toc-hId-171825070">Key Takeaways</H2><OL><LI><P><STRONG>Istio is mandatory</STRONG>: Always enable <CODE>istio-injection=enabled</CODE> on namespaces before deploying apps that need external access.</P></LI><LI><P><STRONG>Secrets are files, not JSON</STRONG>: In Kyma, service credentials are individual files in a mounted volume, not a single JSON object.</P></LI><LI><P><STRONG>Init containers are powerful</STRONG>: They're not just a <CODE>.profile</CODE> replacementβ€”they can use any container image, have independent resource limits, and can be chained.</P></LI><LI><P><STRONG>Manual integration required</STRONG>: Unlike CF's App Router, Kyma requires you to integrate with BTP services (like Destination Service) directly via API calls.</P></LI><LI><P><STRONG>Kubernetes-native</STRONG>: Kyma uses standard Kubernetes patterns. If you know Kubernetes, you know Kyma. If you don't, learning Kyma teaches you portable Kubernetes skills.</P></LI></OL><H2 id="toc-hId--24688435">Conclusion</H2><P>The patterns in this blog give you a foundation to migrate existing CF apps to Kyma. Start with simple apps, master these five patterns, then tackle more complex workloads.</P><P>&nbsp;</P> 2026-02-17T08:40:01.820000+01:00