https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/members/sap-champions/Martin-Pankraz.xml SAP Community - Martin Pankraz 2024-05-10T00:00:04.021146+00:00 python-feedgen Martin Pankraz in SAP Community https://community.sap.com/t5/technology-blogs-by-members/hey-abap-cloud-please-let-me-save-my-data-export-to-azure-storage-please/ba-p/13572978 Hey ABAP Cloud please let me save my data export to Azure Storage please🥺🙏- part 4 2023-11-21T13:21:26+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <TABLE style="border-collapse: collapse;width: 100%" border="1"><BR /> <TBODY><BR /> <TR style="height: 14px"><BR /> <TD style="width: 100%;background-color: #ffd57a;height: 14px"><BR /> <BR /> <STRONG><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉🏿</span></STRONG><STRONG>back to&nbsp;</STRONG><A href="https://blogs.sap.com/2023/06/06/kick-start-your-sap-abap-platform-integration-journey-with-microsoft/" target="_blank" rel="noopener noreferrer"><STRONG>blog series</STRONG></A> or jump to <A href="https://github.com/MartinPankraz/steampunk-helper" target="_blank" rel="nofollow noopener noreferrer">GitHub repos</A>🧑🏽‍<span class="lia-unicode-emoji" title=":laptop_computer:">💻</span><BR /> <BR /> &lt;&lt;<A href="https://blogs.sap.com/2023/07/20/sap-btp-abap-environment-integration-journey-with-microsoft-part-3/" target="_blank" rel="noopener noreferrer">part 3</A></TD><BR /> </TR><BR /> </TBODY><BR /> </TABLE><BR /> Hello and welcome back to your ABAP Cloud with Microsoft integration journey. Part 3 of this series got you covered with modern GraphQL API definition on top of your ABAP Cloud RAP APIs to expose a single API endpoint that may consume many different OData, OpenAPI, or REST endpoints at the same time.<BR /> <BR /> <STRONG>Today will be different</STRONG>. Sparked by a <A href="https://twitter.com/PanzerDominik/status/1683252126884003840" target="_blank" rel="nofollow noopener noreferrer">SAP community conversation</A> with <SPAN class="mention-scrubbed">dpanzer</SPAN> and <SPAN class="mention-scrubbed">lars.hvam</SPAN> including a <A href="https://answers.sap.com/questions/14009359/createsend-a-file-to-ftp-server-via-abap-cloud-or.html" target="_blank" rel="noopener noreferrer">community question</A> by <SPAN class="mention-scrubbed">rammel</SPAN> on working with files with ABAP Cloud, I got inspired to propose a solution for the question below:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-twitter.png" height="146" width="493" /></P><BR /> Before we dive into my proposal see here a list of alternative options that I came across as food for thought for your own research.<BR /> <TABLE><BR /> <TBODY><BR /> <TR><BR /> <TD width="301"><A href="https://docs.cloudfoundry.org/devguide/services/using-vol-services.html" target="_blank" rel="nofollow noopener noreferrer">Mount a file system</A> to a Cloud Foundry app</TD><BR /> <TD width="301">Create custom API hosted by your CF app and call via http client from ABAP Cloud</TD><BR /> </TR><BR /> <TR><BR /> <TD width="301"><A href="https://blogs.sap.com/2021/05/12/how-to-connect-from-sap-cloud-integration-to-on-premise-sftp-server/" target="_blank" rel="noopener noreferrer">Connect to SFTP server</A> via SAP Cloud Integration</TD><BR /> <TD width="301">Design iFlow and call via http client from ABAP Cloud</TD><BR /> </TR><BR /> <TR><BR /> <TD width="301">Integrate with <A href="https://help.sap.com/docs/document-management-service/sap-document-management-service/what-is-document-management-service" target="_blank" rel="noopener noreferrer">SAP Document Management Service</A></TD><BR /> <TD width="301">Call <A href="https://api.sap.com/package/SAPDocumentManagementServiceIntegrationOptionCMISAPI/rest" target="_blank" rel="noopener noreferrer">SAP BTP REST APIs</A> from ABAP Cloud directly</TD><BR /> </TR><BR /> <TR><BR /> <TD width="301">Integrate with <A href="https://help.sap.com/docs/object-store/object-store-service-on-sap-btp/what-is-object-store" target="_blank" rel="noopener noreferrer">SAP BTP Object Store</A> exposing hyperscaler storage services using SDKs</TD><BR /> <TD width="301">Create custom API hosted by your CF or Kyma app and call via http client from ABAP Cloud</TD><BR /> </TR><BR /> <TR><BR /> <TD width="301">Serve directly from ABAP Code via XCO</TD><BR /> <TD width="301">Base64-encode your file content, wrap into ABAP code, and serve as XCO class. Lars likes it at least <span class="lia-unicode-emoji" title=":winking_face_with_tongue:">😜</span>. There were sarcastic smiles involved and some more “oh please”, so take it not too seriously.</TD><BR /> </TR><BR /> <TR><BR /> <TD width="301">Raise an <A href="https://influence.sap.com/sap/ino/#/campaigns" target="_blank" rel="noopener noreferrer">influencing request at SAP</A> to release something like the former NetWeaver MIME repos</TD><BR /> <TD width="301">Live the dream</TD><BR /> </TR><BR /> </TBODY><BR /> </TABLE><BR /> A <STRONG>common theme</STRONG> among all the options is the <STRONG>need to interact</STRONG> with them from <STRONG>ABAP Cloud via the built-in http client</STRONG>. On the downside some options require an additional app on CF or Kyma to orchestrate the storage interactions.<BR /> <BR /> <STRONG>Ideally ABAP Cloud integrates directly with the storage account</STRONG> to reduce complexity and maintenance.<BR /> <H1 id="toc-hId-834818605">You guessed rightly my own proposal focusses on direct integration with Azure Blob</H1><BR /> To get started with this sample I ran through the SAP developer tutorial “<A href="https://developers.sap.com/tutorials/abap-environment-console-application.html" target="_blank" rel="noopener noreferrer">Create Your First ABAP Cloud Console Application</A>” and steps 1-6 of “<A href="https://developers.sap.com/tutorials/abap-environment-external-api.html" target="_blank" rel="noopener noreferrer">Call an External API and Parse the Response in SAP BTP ABAP Environment</A>. This way you can easily reproduce from an official reference.<BR /> <BR /> Got your hello world on Eclipse? Great, onwards, and upwards in the stack we go then 🪜. Or down to the engine room – that depends on your perspective.<BR /> <BR /> All the blob storage providers offer various options to authenticate with the service. See the current coverage for Azure <A href="https://learn.microsoft.com/en-us/azure/storage/common/authorize-data-access#understand-authorization-for-data-operations" target="_blank" rel="nofollow noopener noreferrer">here</A>.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-auth-methods.png" /></P><BR /> <P style="text-align: center">Fig.1 Screenshot of supported authentication methods for Azure Storage</P><BR /> The Microsoft Entra ID option offers superior security capabilities compared to access keys – which can be leaked or lost for example – and is therefore recommended by Microsoft.<BR /> <BR /> For developer ease, I left the code using the simpler to configure “<A href="https://learn.microsoft.com/azure/ai-services/translator/document-translation/how-to-guides/create-sas-tokens?tabs=Containers" target="_blank" rel="nofollow noopener noreferrer">Shared-Access-Signature (SAS) tokens</A>” commented on the <A href="https://github.com/MartinPankraz/steampunk-helper/blob/main/steampunk-part4/z_cl_steampunk_to_azure_blob.abap" target="_blank" rel="nofollow noopener noreferrer">shared GitHub repos</A>. SAS tokens can be created from the Azure portal with two clicks.<BR /> <BR /> The <A href="https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key" target="_blank" rel="nofollow noopener noreferrer">shared key approach</A> requires a bit of hashing and marshaling on ABAP. Use the <A href="https://github.com/microsoft/ABAP-SDK-for-Azure" target="_blank" rel="nofollow noopener noreferrer">ABAP SDK for Azure</A> to accelerate that part of your implementation. Check the “<A href="https://github.com/microsoft/ABAP-SDK-for-Azure/blob/master/src/zadf/zadf_service_blob/zcl_adf_service_blob.clas.abap#L656" target="_blank" rel="nofollow noopener noreferrer">get_sas_token</A>” &nbsp;method for reference.<BR /> <BR /> <A href="https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal" target="_blank" rel="nofollow noopener noreferrer">Anonymous read access</A> would only be ok for less sensitive content like static image files or the likes because anyone can access them once they have the URL.<BR /> <H1 id="toc-hId-638305100">For an enterprise-grade solution however, you will need to use a more secure protocol like OAuth2 with Microsoft Entra ID</H1><BR /> Technically you could do the OAuth2 token fetching with plain http-client requests from ABAP Cloud. See <A href="https://jacekw.dev/blog/2022/oauth-client-credentials-from-abap-cloud/" target="_blank" rel="nofollow noopener noreferrer">this blog</A> by <SPAN class="mention-scrubbed">jacek.wozniczak</SPAN> for instance. However, it is recommended to use the steampunk “Communication Management” to abstract away the configuration from your code. Think “external configuration store”. Also, it reduces the complexity of your ABAP code, because Communication Management handles the OAuth2 flow for you.<BR /> <TABLE style="border-collapse: collapse;width: 100%" border="1"><BR /> <TBODY><BR /> <TR><BR /> <TD style="width: 100%;background-color: #ffc68a"><span class="lia-unicode-emoji" title=":loudspeaker:">📢</span>Note: SAP will release the needed capability to maintain OAuth2 scopes in communication arrangements as part of your ABAP Cloud requests with the upcoming <A href="https://help.sap.com/docs/abap-cross-product/roadmap-info/integration-services?locale=en-US#security-for-integration-services" target="_blank" rel="noopener noreferrer">SAP BTP, ABAP environment 2402</A>.</TD><BR /> </TR><BR /> </TBODY><BR /> </TABLE><BR /> So, till then you will need to use the BTP Destination service. Target <STRONG>destinations</STRONG> <STRONG>living on subaccount level</STRONG> by calling them like so (omitting the i_service_instance_name, thank you <SPAN class="mention-scrubbed">thwiegan</SPAN> for calling that out <A href="https://answers.sap.com/questions/13305436/abap-environment-cannot-access-remote-odata-servic.html" target="_blank" rel="noopener noreferrer">here</A><span class="lia-unicode-emoji" title=":disappointed_face:">😞</span><BR /> <PRE class="language-abap"><CODE>destination = cl_http_destination_provider=&gt;create_by_cloud_destination(<BR /> i_name = |azure-blob|<BR /> i_authn_mode = if_a4c_cp_service=&gt;service_specific<BR /> ).</CODE></PRE><BR /> Or call <STRONG>destinations living on Cloud Foundry</STRONG> spaces like so:<BR /> <PRE class="language-abap"><CODE>destination = cl_http_destination_provider=&gt;create_by_cloud_destination(<BR /> i_name = |azure-blob|<BR /> i_service_instance_name = |SAP_BTP_DESTINATION|<BR /> i_authn_mode = if_a4c_cp_service=&gt;service_specific<BR /> ).</CODE></PRE><BR /> For above Cloud Foundry variation you need to deploy the “standard” communication scenario &nbsp;<A href="https://help.sap.com/docs/btp/sap-business-technology-platform/integration-and-connectivity-communication-management#destination" target="_blank" rel="noopener noreferrer">SAP_COM_0276</A>. My generated arrangement id in this case was “SAP_BTP_DESTINATION”.<BR /> <BR /> Be aware, SAP marked the approach with BTP destinations as <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/http-communication-via-destination-service-deprecated" target="_blank" rel="noopener noreferrer">deprecated</A> for BTP ABAP. And we can now see why. It will be much nicer doing it from the single initial communication arrangement only, rather than having the overhead with additional services and arrangements. Looking forward to that in February <span class="lia-unicode-emoji" title=":smiling_face_with_sunglasses:">😎</span><BR /> <BR /> Not everything is “bad” about using BTP destinations with ABAP Cloud though. They have management APIs, which the communication arrangements don’t have yet. Also, re-use of APIs across your BTP estate beyond the boundary of your ABAP Environment tenant would be useful.<BR /> <H3 id="toc-hId-699957033">A fully automated solution deployment with the BTP and Azure terraform providers is only possible with the destination service approach as of today.</H3><BR /> See <A href="https://github.com/SAP-samples/teched2023-XP160" target="_blank" rel="nofollow noopener noreferrer">this TechEd 2023 session</A> and watch this new <A href="https://github.com/SAP-samples/btp-terraform-samples/tree/use-cases-ms/in-development/uc_abap_env_ms_obj_store" target="_blank" rel="nofollow noopener noreferrer">sample repos</A> (still in development) for reference.<BR /> <H1 id="toc-hId-245278090">The application flow is quite simple once the authentication part is figured out</H1><BR /> Access your communication management config from your ABAP web Ui:<BR /> <P style="padding-left: 40px"><A href="https://your-steampunk-domain.abap-web.eu20.hana.ondemand.com/ui#Shell-home" target="test_blank" rel="nofollow noopener noreferrer">https://your-steampunk-domain.abap-web.eu20.hana.ondemand.com/ui#Shell-home</A></P><BR /> Steampunk supports the <A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/supported-protocols-and-authentication-methods" target="_blank" rel="noopener noreferrer">typical set of authentication flows</A> for outbound communication users using http that you are used to from BTP. I chose the OAuth2 Client Credentials grant because that is most widely referenced in the BTP world and reasonably secure.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-overview.png" /></P><BR /> <P style="text-align: center">Fig.2 ABAP Cloud API flow including OAuth2 token request from Microsoft Entra ID</P><BR /> Since I am integrating with an Azure Storage account, I will need to authenticate via Microsoft Entra ID (formerly known as Azure Active Directory).<BR /> <BR /> Yes, Microsoft likes renaming stuff from time to time, too <span class="lia-unicode-emoji" title=":winking_face:">😉</span>.<BR /> <BR /> Using the <A href="https://learn.microsoft.com/rest/api/storageservices/operations-on-blobs" target="_blank" rel="nofollow noopener noreferrer">Azure Storage REST API</A> I can create, update, delete, and list files as I please.<BR /> <H1 id="toc-hId-48764585">The Entra ID setup takes a couple of clicks</H1><BR /> Create a new App registration from Microsoft Entra ID service on your Azure portal and generate a new secret. Beware of the expiry date!<BR /> <BR /> Below preferred option will start working once SAP adds the scope parameter for OAuth2 Client Credentials grant as described before.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-auth-setup1.png" /></P><BR /> <P style="text-align: center">Fig.3 Screenshot of attribute and secret mapping for ABAP Cloud Outbound user</P><BR /> For now, let’s have a look at a destination on subaccount level instead. Be aware the scope parameter needs to be “<A href="https://storage.azure.com/.default" target="_blank" rel="nofollow noopener noreferrer">https://storage.azure.com/.default</A>” (see fig.4 below, additional properties section called “scope” on the bottom right). That is also the setting that we are missing for the preferred approach mentioned above.<BR /> <BR /> The standard login URLs for OAuth token endpoints on Microsoft Entra ID are the following:<BR /> <P style="padding-left: 40px"><A href="https://login.microsoftonline.com/your-tenantId/oauth2/v2.0/token" target="test_blank" rel="nofollow noopener noreferrer">https://login.microsoftonline.com/your-tenantId/oauth2/v2.0/token</A></P><BR /> <P style="padding-left: 40px"><A href="https://login.microsoftonline.com/your-tenantId/oauth2/v2.0/authorize" target="test_blank" rel="nofollow noopener noreferrer">https://login.microsoftonline.com/your-tenantId/oauth2/v2.0/authorize</A></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-auth-setup2.png" /></P><BR /> <P style="text-align: center">Fig.4 Screenshot of attribute mapping from Entra ID to SAP BTP Destination</P><BR /> So far so good. Let’s roll the integration test from our ABAP console application on Eclipse (ADT).<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-result.png" /></P><BR /> <P style="text-align: center">Fig.5 Screenshot of file interaction from ABAP Cloud and data container view on Azure</P><BR /> Excellent, there is our booking request: Safe and sound stored as Azure Blob, posted from ABAP, and read again seamlessly.<BR /> <BR /> See the <A href="https://raw.githubusercontent.com/MartinPankraz/steampunk-helper/main/Steampunk-Helper-Lib.postman_collection.json" target="_blank" rel="nofollow noopener noreferrer">shared Postman collection</A> to help with your integration testing.<BR /> <H1 id="toc-hId--147748920">Thoughts on production readiness</H1><BR /> The biggest caveat is the regularly required OAuth2 client credential secret rotation. Unfortunately, credential-free options with Azure Managed Identities are not possible, because BTP is hyperscaler-agnostic and does not expose the underlying Azure components to you.<BR /> <BR /> Some of you might say next: let’s use client certificates with “veeery long validity time frames like 2038” to push out the problem beyond so far out someone else will have to deal with it. Well, certificate lifetimes get reduced more and more (TLS certs for instance have a maximum of 13 months at <A href="https://www.digicert.com/faq/public-trust-and-certificates/how-long-are-tls-ssl-certificate-validity-periods" target="_blank" rel="nofollow noopener noreferrer">DigiCert since 2020</A>) and you have to rotate them eventually, too <span class="lia-unicode-emoji" title=":winking_face:">😉</span>. With shorter certificate lifetimes more secure hashing algorithms come into effect much quicker for instance.<BR /> <BR /> I will dedicate a separate post on client certificates (mTLS) with steampunk to consume Azure services.<BR /> <BR /> What about <A href="https://learn.microsoft.com/graph/api/resources/federatedidentitycredentials-overview" target="_blank" rel="nofollow noopener noreferrer">federated identities</A>? You could configure trust between your SAP Cloud Identity Service (or Steampunk auth service) and Microsoft Entra ID to allow requests from ABAP Cloud to authorize Azure services. However, that would be a more complex configuration with implications for your overall setup causing larger integration test needs. And we embarked on this journey to discover a simple solution not too far away from AL11 and the likes, right? <span class="lia-unicode-emoji" title=":grinning_face_with_sweat:">😅</span><BR /> <BR /> <EM>See a working implementation of federated identities with SAP Cloud Identity service consuming Microsoft Graph published by my colleagure <SPAN class="mention-scrubbed">mraepple</SPAN> in his blog series <A href="https://blogs.sap.com/2022/11/02/principal-propagation-in-a-multi-cloud-solution-between-microsoft-azure-and-sap-business-technology-platform-btp-part-vi-calling-the-microsoft-graph-on-behalf-of-the-sap-authenticated-user/" target="_blank" rel="noopener noreferrer">here</A>.</EM><BR /> <BR /> Ok, then let’s compromise and see how we can automatically rotate secrets. Azure Key Vault exposes events for secrets, keys, and certificates to inform downstream services about due expiry. With that a small low code app can be provided to perform the secret update. See <A href="https://github.com/Azure/AzureAD-AppSecretManager" target="_blank" rel="nofollow noopener noreferrer">below sample</A> that went the extra mile asking the admins via Microsoft Teams if they wanted to perform the change or not:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-sec-rotate.png" /></P><BR /> <P style="text-align: center">Fig.6 Architecture of secret rotation with Azure Key Vault and secret refresh approval</P><BR /> A new secret for the app registration on Entra can be generated with the <A href="https://learn.microsoft.com/en-us/graph/api/application-addpassword?view=graph-rest-1.0&amp;tabs=http" target="_blank" rel="nofollow noopener noreferrer">Microsoft Graph API like so</A>. See <A href="https://techcommunity.microsoft.com/t5/azure-integration-services-blog/automate-secret-rotation-in-key-vault/ba-p/3275149" target="_blank" rel="nofollow noopener noreferrer">this post</A> for details on the Azure Key Vault aspects of the mix.<BR /> <BR /> To apply that flow and propagate the new secret to steampunk, we need to call BTP APIs to save the new secret. See the BTP REST API for Destinations <A href="https://api.sap.com/api/SAP_CP_CF_Connectivity_Destination/path/put_subaccountDestinations" target="_blank" rel="noopener noreferrer">here</A> to learn about the secret update method.<BR /> <BR /> Have a look at my earlier <A href="https://blogs.sap.com/2022/12/02/automatic-sap-btp-trust-store-certificate-renewal-with-azure-key-vault-or-how-to-stop-thinking-about-expiry-dates-once-and-for-all/" target="_blank" rel="noopener noreferrer">blog post</A> for specifics on how to do the same with certificates.<BR /> <BR /> <A href="https://github.com/Azure/AzureAD-AppSecretManager#costs" target="_blank" rel="nofollow noopener noreferrer">Estimated cost</A> for such a secret rotation solution for 1000 rotations per month is around 2$ per month. With simpler configurations and less rotations, it can be covered by free tiers even.<BR /> <BR /> Once you have applied the means of automation as discussed above you may incorporate this into your DevOps process and live happily ever after with no manual secret handling <span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span>.<BR /> <H1 id="toc-hId--344262425">Final Words</H1><BR /> That’s a wrap <span class="lia-unicode-emoji" title=":burrito:">🌯</span>you saw today how – in the absence of an application server file system and NetWeaver MIME repository (good old days) – you can <STRONG>use Azure Storage Account as your external data store from BTP ABAP Environment</STRONG> (steampunk) using ABAP Cloud. In addition to that, you<STRONG> gained insights into the proper setup for authentication</STRONG> and what flavors are supported by steampunk now. You got a glimpse into <STRONG>automated deployment of the solution with the BTP and Azure terraform provider</STRONG>.<BR /> <BR /> To top it up you learnt what else is needed to <STRONG>operationalize the approach</STRONG> at scale <STRONG>with regular secret/certificate rotation</STRONG>.<BR /> <BR /> Check <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/developing-external-service-consumption-outbound-communication" target="_blank" rel="noopener noreferrer">SAP’s docs for external APIs</A> with steampunk for further official materials.<BR /> <BR /> What do you think <SPAN class="mention-scrubbed">dpanzer</SPAN>&nbsp;and <SPAN class="mention-scrubbed">lars.hvam</SPAN>? Not too bad, is it? <span class="lia-unicode-emoji" title=":winking_face:">😉</span><BR /> <BR /> Find all the resources to replicate this setup on <A href="https://github.com/MartinPankraz/steampunk-helper" target="_blank" rel="nofollow noopener noreferrer">this GitHub repos</A>. Stay tuned for the remaining parts of the steampunk series with Microsoft Integration Scenarios from my <A href="https://blogs.sap.com/2023/06/06/kick-start-your-sap-abap-platform-integration-journey-with-microsoft/" target="_blank" rel="noopener noreferrer">overview post</A>.<BR /> <BR /> Cheers<BR /> <BR /> Martin 2023-11-21T13:21:26+01:00 https://community.sap.com/t5/technology-blogs-by-sap/terraform-for-sap-btp-above-and-beyond/bc-p/13574991#M166160 Re: Terraform for SAP BTP - above and beyond 2023-11-28T14:14:48+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 Caboom <SPAN class="mention-scrubbed">lechner</SPAN>! What a post. How about linking our joint TechEd session where we deployed a CAP app to check "shipping state" via an Azure function using the new btp terraform provider?<BR /> <BR /> <A href="https://github.com/SAP-samples/teched2023-XP160" rel="nofollow ugc noopener noreferrer">teched2023-XP160</A><BR /> <BR /> Happy tofu-ing.<BR /> <BR /> Cheers 2023-11-28T14:14:48+01:00 https://community.sap.com/t5/enterprise-resource-planning-q-a/re-call-trigger-an-iflow-from-abap-cloud/qaq-p/12782784/comment-id/4165034#M4165034 Re: Call/trigger an iflow from ABAP cloud 2023-12-18T08:20:05+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Hey <SPAN class="mention-scrubbed">rammel</SPAN>, in ABAP Cloud you will need to use the class "cl_web_http_client_manager". Regarding security: well, you are calling a public Internet-facing cloud service <span class="lia-unicode-emoji" title=":winking_face:">😉</span> So, you are dependent on it being secured by SAP and not be spoofed for instance. A best practice would be securing your iFlow trigger at least with a certificate or OAuth2 with SAP's XSUAA to secure the iFlow itself. You can go further than that with OIDC with Azure or SAP API Management fronting that iFlow.</P><P>You may consider running the iFlow in your own environment using SAP Edge Integration Cell.This way the trigger and runtime would not be Internetfacing anymore.</P><P>Generally speaking though, the application security should be tackled on app level not networking. Private networking is no guarantee to be more secure.</P> 2023-12-18T08:20:05+01:00 https://community.sap.com/t5/technology-blogs-by-members/azure-apim-to-s4hana-connectivity-via-ci-principal-propagation/bc-p/13588911#M165757 Re: Azure APIM TO S4HANA CONNECTIVITY VIA CI (Principal Propagation) 2024-01-31T11:22:52.042000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Thanks for sharing&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/766134">@Arundathi</a>! Insightful blog. Are you aware of <A href="https://github.com/Azure/api-management-policy-snippets/blob/master/examples/Request%20OAuth2%20access%20token%20from%20SAP%20using%20AAD%20JWT%20token.xml" target="_blank" rel="noopener nofollow noreferrer">OAuth2SAMLBearer based</A> authentication with Azure APIM towards SAP ECC/S4 for Principal Propagation? Could you shed some light on the reasoning why you chose the BTP route with short-lived certs?</P><P>Maybe a comment on how to vet the custom credential mapping table with compliance? Special maintenance process with small number of Admins?</P><P>KR Martin</P> 2024-01-31T11:22:52.042000+01:00 https://community.sap.com/t5/technology-q-a/re-sap-ecc-to-azure-data-factory/qaq-p/13589006/comment-id/4815155#M4815155 Re: SAP ECC to Azure Data Factory 2024-01-31T11:36:29.359000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1383702">@Sanjay_Daniel</a>,</P><P>This is being discussed here:&nbsp;<A href="https://learn.microsoft.com/en-us/azure/sap/workloads/integration-get-started#azure-data-services" target="_blank" rel="nofollow noopener noreferrer">https://learn.microsoft.com/en-us/azure/sap/workloads/integration-get-started#azure-data-services</A>&nbsp;I would recommend the SAP CDC connector in general.</P><P>KR Martin</P> 2024-01-31T11:36:29.359000+01:00 https://community.sap.com/t5/application-development-discussions/abap-to-microsoft-ews/m-p/13589072#M2026320 Re: ABAP to Microsoft EWS 2024-01-31T11:51:01.349000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Always good to hear back you were able to solve and how&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/213331">@jakob_steen-petersen</a>&nbsp;<span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span> did you consider using or at least getting inspired from the <A href="https://github.com/microsoft/ABAP-SDK-for-Azure" target="_blank" rel="noopener nofollow noreferrer">ABAP SDK for Azure</A> to integrate with Microsoft Graph API? If not, why?</P><P>Also want to make you aware we keep our docs for the support auth setup for Exchange Online and SAP <A href="https://learn.microsoft.com/en-us/azure/sap/workloads/exchange-online-integration-sap-email-outbound" target="_blank" rel="noopener nofollow noreferrer">here</A>.</P><P>KR Martin</P> 2024-01-31T11:51:01.349000+01:00 https://community.sap.com/t5/technology-q-a/re-how-to-connect-with-quot-microsoft-power-apps-quot-or-quot-micros/qaq-p/13621919/comment-id/4820065#M4820065 Re: How to connect with "Microsoft Power Apps" or "Micros... 2024-02-28T09:00:03.891000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/890321">@koide_yuya</a>,</P><P>PowerApps interactions triggered by Buttons etc will point at PowerAutomate flows. From there you are free to trigger iFlows on Integration Suite as you like using the plain http connector for instance (push-based scenario). On PowerAutomate you may also retrieve the info from your app or do additional pulls from Dataverse that you want to pass along to your iflow.</P><P>SAP Open Connectors would be needed for pull-based scenarios from your iFlow.</P><P>Let the community know what you decided in the end.</P><P>Cheers Martin</P> 2024-02-28T09:00:03.891000+01:00 https://community.sap.com/t5/technology-q-a/re-how-to-connect-with-quot-microsoft-power-apps-quot-or-quot-micros/qaq-p/13626803/comment-id/4820589#M4820589 Re: How to connect with "Microsoft Power Apps" or "Micros... 2024-03-04T11:41:56.119000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 Yes, for the "push" you directly point at Integration Suite. Up to you if you need to front it with SAP APIM. For pull-based you may use the Dataverse Web API. That is plain OData and can be called with SAP's standard oData connector. No need for OpenConnectors. Alternatively, use Azure Data Factory to move the data from Dataverse to SAP 2024-03-04T11:41:56.119000+01:00 https://community.sap.com/t5/technology-blogs-by-members/open-your-sap-odata-apis-for-some-swagger-or-how-to-make-friends-with-the/bc-p/13627326#M166292 Re: Open your SAP OData APIs for some swagger – or how to make friends with the other kids from the 2024-03-04T17:10:29.904000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Hey&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/157180">@papsoc</a>,</P><P><SPAN>In case your chosen CA is not “well-known”, you need to also&nbsp;</SPAN><A href="https://learn.microsoft.com/azure/api-management/api-management-howto-ca-certificates" target="_blank" rel="nofollow noopener noreferrer">upload the intermediary and root certificate to APIM</A><SPAN>.</SPAN>&nbsp;Have a look at my other <A href="https://community.sap.com/t5/technology-blogs-by-members/sap-btp-abap-environment-integration-journey-with-microsoft-part-2-using/ba-p/13559608" target="_blank">blog post</A> subsection "Add the pfx file to Azure API Management" for more details. Also verify your APIM tier. <A href="https://learn.microsoft.com/en-us/azure/api-management/api-management-howto-mutual-certificates-for-clients#prerequisites" target="_blank" rel="noopener nofollow noreferrer">Certificate-validation is not support in Consumption tier</A> for instance.</P><P>Let me know if that fixes your 401.</P><P>KR Martin</P> 2024-03-04T17:10:29.904000+01:00 https://community.sap.com/t5/technology-blogs-by-members/open-your-sap-odata-apis-for-some-swagger-or-how-to-make-friends-with-the/bc-p/13629392#M166320 Re: Open your SAP OData APIs for some swagger – or how to make friends with the other kids from the 2024-03-06T09:19:03.466000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Hey&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/157180">@papsoc</a>,</P><P>1. Hard for me to tell from afar. You need to have the whole chain that sits on top of your client leaf certificate in C4C available in Azure APIM as CA certificate and the client cert for C4C on the "Certificates" section.</P><P>2. No won't work. How about you swap from Consumption to Developer tier? With <A href="https://azure.microsoft.com/free" target="_blank" rel="noopener nofollow noreferrer">Azure free credits</A> you will be able to perform your validation at no cost.</P><P>KR Martin</P> 2024-03-06T09:19:03.466000+01:00 https://community.sap.com/t5/human-capital-management-q-a/re-ias-is-mandatory-for-customers-with-microsoft-azure-s/qaq-p/13633394/comment-id/34047#M34047 Re: IAS is mandatory for customers with Microsoft Azure S... 2024-03-11T07:59:39.888000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 We describe our best practices for the scenarios on the Microsoft docs here: <A href="https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration" target="_blank" rel="nofollow noopener noreferrer">https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration</A> 2024-03-11T07:59:39.888000+01:00 https://community.sap.com/t5/human-capital-management-q-a/re-ias-is-mandatory-for-customers-with-microsoft-azure-s/qaq-p/13633396/comment-id/34048#M34048 Re: IAS is mandatory for customers with Microsoft Azure S... 2024-03-11T08:01:10.336000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>We describe our best practices for the scenarios of integrating SAP IAS and Entra ID (formerly Azure AD) on the Microsoft docs here: <A href="https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration" target="_blank" rel="noopener nofollow noreferrer">https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration</A></P> 2024-03-11T08:01:10.336000+01:00 https://community.sap.com/t5/technology-q-a/re-sap-connector-for-net-framework-5-0-and-higher/qaq-p/13644548/comment-id/4822582#M4822582 Re: SAP Connector for .NET Framework 5.0 and higher 2024-03-20T16:09:51.541000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Hi&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/158512">@KentP</a>,</P><P>SAP is tracking the item as influencing <A href="https://influence.sap.com/sap/ino/#/idea/287577/" target="_blank" rel="noopener noreferrer">request</A>. Engineering will make an update to give more clarity on timeline.</P><P>KR Martin</P> 2024-03-20T16:09:51.541000+01:00 https://community.sap.com/t5/technology-blogs-by-members/simplify-sso-with-microsoft-entra-id-azure-ad-sap-identity-authentication/bc-p/13646518#M166573 Re: Simplify SSO with Microsoft Entra ID (Azure AD) & SAP Identity Authentication Service 2024-03-22T08:56:16.855000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Thanks for sharing&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/177565">@PolySonika</a>. I'd like to add the reference to the best-practices guide for Entra ID (formerly Azure AD) with SAP IAS. Find it on Microsoft Learn <A href="https://learn.microsoft.com/en-us/entra/fundamentals/scenario-azure-first-sap-identity-integration" target="_blank" rel="noopener nofollow noreferrer">here</A>.</P> 2024-03-22T08:56:16.855000+01:00 https://community.sap.com/t5/technology-blogs-by-members/sap-application-slow-after-microsoft-defender-was-installed-on-server/bc-p/13650873#M166642 Re: SAP application slow after Microsoft Defender was installed on server 2024-03-27T09:39:05.160000+01:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/190522">@Syamkriz</a>&nbsp;Please have a look at Microsoft's dedicated guidance for Defender for Endpoint on SAP hosts:</P><P><A href="https://learn.microsoft.com/en-us/microsoft-365/security/defender-endpoint/mde-linux-deployment-on-sap" target="_blank" rel="noopener nofollow noreferrer">https://learn.microsoft.com/en-us/microsoft-365/security/defender-endpoint/mde-linux-deployment-on-sap</A></P><P><A href="https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268" target="_blank" rel="noopener nofollow noreferrer">https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268</A>&nbsp;</P> 2024-03-27T09:39:05.160000+01:00 https://community.sap.com/t5/technology-blogs-by-sap/provision-users-from-microsoft-azure-ad-to-sap-cloud-identity-services/bc-p/13655389#M171361 Re: Provision users from Microsoft Azure AD to SAP Cloud Identity Services - Identity Authentication 2024-04-02T09:53:38.724000+02:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Hey&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/823618">@tskwin</a>,</P><P>Have a look at the <A href="https://learn.microsoft.com/en-us/entra/fundamentals/scenario-azure-first-sap-identity-integration" target="_blank" rel="noopener nofollow noreferrer">Microsoft learn page</A> for our recommendations on Entra ID with SAP IAS. Note on the side: Be aware SAP recommends <A href="https://community.sap.com/t5/technology-blogs-by-sap/preparing-for-sap-identity-management-s-end-of-maintenance-in-2027/ba-p/13596101" target="_blank">SAP IDM customers to migrate to Entra ID</A>. Meaning the already deep integration between both ecosystems will increase even more over time.</P><P>KR Martin</P> 2024-04-02T09:53:38.724000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/provision-users-from-microsoft-azure-ad-to-sap-cloud-identity-services/bc-p/13660041#M171473 Re: Provision users from Microsoft Azure AD to SAP Cloud Identity Services - Identity Authentication 2024-04-05T09:27:20.407000+02:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Hey&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/823618">@tskwin</a>,</P><P>not sure what your requirements are. If you need to synch groups you require SAP IPS. The mechanism described on our docs before is about mapping based on attributes like groups but actually re-creating them on the SAP side.</P><P>In general, like with any integration project, less redundancy and a single source of truth is beneficial.</P><P>KR Martin</P> 2024-04-05T09:27:20.407000+02:00 https://community.sap.com/t5/technology-blogs-by-sap/single-sign-on-to-sap-cloud-integration-cpi-runtime-from-an-external/bc-p/13666514#M171635 Re: Single Sign On to SAP Cloud Integration (CPI runtime) from an external Identity Provider 2024-04-11T08:59:38.676000+02:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <P>Thank you for sharing&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/216068">@vinayak_adkoli</a>! I am curious what scenarios require a people-based interactive authentication flow for CPI. Shouldn't this be solved on app layer rather than the iflow? SAP Principal Propagation would then be achieved through token exchange on CPI level.</P> 2024-04-11T08:59:38.676000+02:00 https://community.sap.com/t5/technology-blogs-by-members/it-has-never-been-easier-to-print-from-sap-with-microsoft-universal-print/ba-p/13672206 It has never been easier to print from SAP with Microsoft Universal Print 2024-04-16T17:06:26.850000+02:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <TABLE border="1" width="100%"><TBODY><TR><TD width="100%"><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉🏿</span>back to<STRONG>&nbsp;</STRONG><SPAN><A href="https://learn.microsoft.com/azure/sap/workloads/universal-print-sap-frontend" target="_blank" rel="noopener nofollow noreferrer"><STRONG>Microsoft</STRONG></A></SPAN><SPAN><STRONG> Learn</STRONG></SPAN> or jump to <SPAN><A href="https://github.com/Azure/universal-print-for-sap-starter-pack" target="_blank" rel="noopener nofollow noreferrer">GitHub repos</A></SPAN>🧑🏽‍<span class="lia-unicode-emoji" title=":laptop_computer:">💻</span></TD></TR></TBODY></TABLE><P style=" text-align : justify; ">Dear community,</P><P style=" text-align : justify; ">Printing from SAP is rarely discussed with all the <a href="https://community.sap.com/t5/c-khhcw49343/SAP+S%25252F4HANA/pd-p/73554900100800000266" class="lia-product-mention" data-product="799-1">SAP S/4HANA</a>&nbsp;cloud migration chatter, AI bliss, and sustainability efforts to avoid printing at all (don’t print this blog post<span class="lia-unicode-emoji" title=":smiling_face_with_horns:">😈</span>). For some of you it is similarly mission critical, nevertheless.</P><P style=" text-align : justify; ">For instance, consider a manufacturer that needs to print and attach labels to their products before they leave the factory. In case of disruption delivery is halted! It can be equally bad as an ERP outage.</P><P style=" text-align : justify; ">Printer management and driver software maintenance for the different vendors are among the causes of headaches. Anyone emotionally attached to print servers<span class="lia-unicode-emoji" title=":sparkling_heart:">💖</span>? I hope not…</P><P style=" text-align : justify; ">Those days are gone now – you will see the future with cloud printing and <SPAN><A href="https://learn.microsoft.com/azure/sap/workloads/universal-print-sap-frontend" target="_blank" rel="noopener nofollow noreferrer">Microsoft Universal Print</A></SPAN> today! No more print servers!</P><P style=" text-align : justify; ">Crowd<span class="lia-unicode-emoji" title=":party_popper:">🎉</span>: Yes, and no more laser cartridge changes or replenishing paper stacks!</P><P style=" text-align : justify; "><EM>Don’t be ridiculous! Of course, you will still change cartridges and replenish paper! Till the robots come at least.</EM></P><P style=" text-align : justify; ">However, the drivers, print servers, and complicated setups are gone <span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span>And yes, it works with RISE, GROW, Azure, other hyperscalers, on-premises, and even down in your dark cellar where the poor “Raspberry Pies” are ticking away legacy integrat<span class="lia-unicode-emoji" title=":mobile_phone:">📱</span> if they have Internet uplink.</P><P style=" text-align : justify; ">&nbsp;</P><H1 id="toc-hId-863440810">Enabling your SAP Business Users (Frontend Printing)</H1><P style=" text-align : justify; "><A href="https://help.sap.com/docs/SAP_NETWEAVER_750/290ce8983cbc4848a9d7b6f5e77491b9/4e96bc2a7e9e40fee10000000a421937.html" target="_blank" rel="noopener noreferrer">SAP front-end printing</A>&nbsp;sends an output to a printer available for the user on their front-end device. In other words, a printer accessible by the operating system. The same client computer runs SAP GUI, or a browser (Fiori, BTP apps, WebGUI, you name it). To use Universal Print, you need to have access to such printers.</P><UL><LI>Client OS with support for Universal Print</LI><LI>Add Universal Print printer to your Windows client</LI><LI>Able to print on Universal Print printer from OS</LI></UL><P style=" text-align : justify; ">See the&nbsp;<A href="https://learn.microsoft.com/en-us/universal-print/fundamentals/universal-print-getting-started#step-4-add-a-universal-print-printer-to-a-windows-device.md" target="_blank" rel="noopener nofollow noreferrer">Universal Print documentation</A>&nbsp;for details on these prerequisites.</P><P style=" text-align : justify; ">Find more details on the overall setup for SAP on the dedicated <A href="https://learn.microsoft.com/azure/sap/workloads/universal-print-sap-frontend" target="_blank" rel="noopener nofollow noreferrer">Microsoft Learn</A> page.</P><P style=" text-align : justify; ">&nbsp;</P><H1 id="toc-hId-666927305">Enabling unattended SAP processes (Backend Printing)</H1><P style=" text-align : justify; "><SPAN>SAP offers the standard OData service </SPAN><SPAN>as “Print Queue Item - Read (A2X)” to enable 3rd party integration with SAP Print Queues. You will see the term: Output Management Systems (OMS) being referenced on other SAP sources and docs entries.</SPAN></P><P style=" text-align : justify; "><SPAN>In collaboration with SAP SE the capabilities of the communication scenario <A href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/1e39bb68bbda4c48af4a79d35f5837e0.html?version=latest" target="_blank" rel="noopener noreferrer">SAP_COM_0466</A> “Printing - Pull Integration” were made available to SAP NetWeaver SAP_BASIS releases 757 and upwards. Have a look at the <A href="https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abennews-75.htm" target="_blank" rel="noopener noreferrer">SAP docs</A> to which ERP releases the components apply </SPAN><span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span><SPAN>At the time of publishing this blog that would be S/4HANA 2022 and upwards.</SPAN></P><P style=" text-align : justify; ">See the SAP note “<SPAN><A href="https://me.sap.com/notes/3420465" target="_blank" rel="noopener noreferrer">3420465 – Print queues in on-premise systems</A></SPAN>” to learn more about how to enable on your own SAP system.</P><P style=" text-align : justify; ">Given the above preparations you are ready to integrate the SAP print queues with the <SPAN><A href="https://learn.microsoft.com/graph/api/resources/print?view=graph-rest-1.0" target="_blank" rel="noopener nofollow noreferrer">Microsoft Graph API</A></SPAN> that powers Microsoft Universal Print. To get you started we shipped an open-source project on <SPAN><A href="https://github.com/Azure/universal-print-for-sap-starter-pack" target="_blank" rel="noopener nofollow noreferrer">GitHub</A></SPAN>. For ease of use, and CI/CD best practices, the app is terraform enabled. But of course, you could also deploy manually if needed.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.1 Architecture Overview" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97106i20E3D779A4D823DE/image-size/large?v=v2&amp;px=999" role="button" title="Picture1.png" alt="fig.1 Architecture Overview" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.1 Architecture Overview</span></span></P><P>&nbsp;</P><P>&nbsp;</P><UL><LI><SPAN>Kick-off your SAP backend print process however you prefer with SAP standard means (print function on SAPGUI screens, Spool requests etc.). The simplest means for an integration test would be printing the ALV screen from transaction <STRONG>SP02</STRONG>. Find the print button and choose your new print queue as Output Device.</SPAN></LI></UL><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.2 Screenshot of test print from SAP transaction SP02" style="width: 525px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97108i2FCE7B10597974AF/image-dimensions/525x496?v=v2" width="525" height="496" role="button" title="Picture0.png" alt="fig.2 Screenshot of test print from SAP transaction SP02" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.2 Screenshot of test print from SAP transaction SP02</span></span></SPAN></P><P>&nbsp;</P><P style=" text-align : justify; "><EM><SPAN>Note on the side: The new output device of type “Q: print via print queue” can be maintained from transaction SPAD. Find the setting under “Access Method -&gt; Host Spool Access Method”.</SPAN></EM></P><P style=" text-align : justify; "><SPAN>On <a href="https://community.sap.com/t5/c-khhcw49343/SAP+S%25252F4HANA+Public+Cloud/pd-p/08e2a51b-1ce5-4367-8b33-4ae7e8b702e0" class="lia-product-mention" data-product="1199-1">SAP S/4HANA Public Cloud</a>&nbsp;tenants that ship Fiori apps or don’t offer SAPGUI access anymore use the app “Maintain Print Queues” and trigger “Create Test Page</SPAN></P><P>&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.3 Screenshot of Fiori app &quot;Print Queue&quot; to trigger test page print" style="width: 531px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97110i2F8A0D7A5E7C659A/image-dimensions/531x388?v=v2" width="531" height="388" role="button" title="Picture2.png" alt="fig.3 Screenshot of Fiori app &quot;Print Queue&quot; to trigger test page print" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.3 Screenshot of Fiori app "Print Queue" to trigger test page print</span></span></P><P>&nbsp;</P><UL><LI><SPAN>Our function app on Azure takes care of pulling the SAP print queue items, mapping the queues to your targeted Microsoft Universal Print cloud printer, securely managing the required credentials + identities, and handling robust upload of the print queue items to the cloud.</SPAN></LI><LI>Once your output device reports back to Universal Print, the app notifies the SAP print queue on NetWeaver about a successful print via OData again. This way the integration and status tracking work end-to-end.</LI></UL><P style=" text-align : justify; ">As a result, you will be greeted with a physical hard copy of a test page like this:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.4 Screenshot of printed test page" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/97112iEA188D9B958E29E7/image-size/medium?v=v2&amp;px=400" role="button" title="Picture3.png" alt="fig.4 Screenshot of printed test page" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.4 Screenshot of printed test page</span></span></P><P>&nbsp;</P><P style=" text-align : justify; ">Depending on your needs, the Azure services can be injected into isolated private virtual networks next to the SAP system for instance. Use <SPAN><A href="https://learn.microsoft.com/de-de/azure/azure-arc/overview" target="_blank" rel="noopener nofollow noreferrer">Azure ARC</A></SPAN> to deploy on-premises or to other hyperscalers.</P><P style=" text-align : justify; ">Not too bad, huh? <span class="lia-unicode-emoji" title=":smiling_face_with_sunglasses:">😎</span></P><P style=" text-align : justify; ">Find the latest deployment instructions, SAP specific FAQ, and community discussion on our <SPAN><A href="https://github.com/Azure/universal-print-for-sap-starter-pack" target="_blank" rel="noopener nofollow noreferrer">GitHub repos</A></SPAN>. Your contributions are more than welcome!</P><P style=" text-align : justify; ">For general FAQ on Universal Print see <SPAN><A href="https://learn.microsoft.com/universal-print/fundamentals/universal-print-faqs" target="_blank" rel="noopener nofollow noreferrer">Microsoft Learn</A></SPAN>. In case you are looking to integrate special label printers have a look <SPAN><A href="https://learn.microsoft.com/universal-print/fundamentals/universal-print-label-printing" target="_blank" rel="noopener nofollow noreferrer">here</A></SPAN>.</P><P style=" text-align : justify; ">&nbsp;</P><H1 id="toc-hId-470413800">Thoughts on production readiness</H1><P style=" text-align : justify; ">Most <SPAN><A href="https://learn.microsoft.com/universal-print/fundamentals/universal-print-partner-integrations#universal-print-ready-printers" target="_blank" rel="noopener nofollow noreferrer">print device manufacturers</A></SPAN> already support Microsoft Universal Print. If they don’t yet, check Microsoft’s <SPAN><A href="https://learn.microsoft.com/universal-print/fundamentals/universal-print-connector-overview" target="_blank" rel="noopener nofollow noreferrer">Universal Print connector</A></SPAN> to make them compatible.</P><P style=" text-align : justify; ">Looking for front end printing for SAP on MacOS? Here you <SPAN><A href="https://learn.microsoft.com/universal-print/macos/universal-print-macos" target="_blank" rel="noopener nofollow noreferrer">go</A></SPAN>.</P><P style=" text-align : justify; ">Availability from SAP NetWeaver SAP_BASIS releases 757 and upwards ensures decent coverage for more recent SAP ECC and S/4HANA installations <span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span></P><P style=" text-align : justify; ">Universal Print relies on the <SPAN><A href="https://learn.microsoft.com/graph/api/resources/print?view=graph-rest-1.0" target="_blank" rel="noopener nofollow noreferrer">Microsoft Graph API</A></SPAN> and the components involved in the integration use Azure PaaS services that power various mission critical workloads like O365 and M365 worldwide.</P><P style=" text-align : justify; ">See the latest info on SLA <SPAN><A href="https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services" target="_blank" rel="noopener nofollow noreferrer">here</A></SPAN>.</P><P style=" text-align : justify; ">You are all set for prime time with cloud printing with SAP<span class="lia-unicode-emoji" title=":rocket:">🚀</span></P><P style=" text-align : justify; ">&nbsp;</P><H1 id="toc-hId-273900295">Partner solutions</H1><P style=" text-align : justify; "><SPAN>SAP and Microsoft partners offer packaged solutions or even managed service offerings for SAP printing. See below initial list to get started.</SPAN></P><UL style=" text-align : justify; "><LI><SPAN><A href="https://www.blue-zone.io/en/products/dom-zone/" target="_blank" rel="noopener nofollow noreferrer">DOM-Zone</A> from BLUE-ZONE</SPAN></LI><LI><SPAN><A href="https://lp.all-for-one.com/de/managed-services/rise-one-en/index.html" target="_blank" rel="noopener nofollow noreferrer">RISE ONE</A> from&nbsp;All for One Group</SPAN></LI><LI><SPAN><A href="https://kangoolutions.com/microsoft-azure-universal-print-with-the-sap-cloud-integration/" target="_blank" rel="noopener nofollow noreferrer">Universal Print integration with SAP using SAP Cloud Integration</A> from Kangoolutions</SPAN></LI></UL><P style=" text-align : justify; "><SPAN>By no means is the list complete. Anyone else looking to be listed or referenced, please leave a comment, or contact me directly.</SPAN></P><P style=" text-align : justify; ">&nbsp;</P><H1 id="toc-hId-77386790">Final Words</H1><P style=" text-align : justify; ">That’s a wrap <span class="lia-unicode-emoji" title=":burrito:">🌯</span>you saw today how you can simplify your printing from SAP, reduce the device management overhead, and get rid of the need for print drivers.</P><P style=" text-align : justify; ">Cloud printing for SAP with Microsoft Universal print is applicable to your SAP Business Users (called frontend printing) from their own devices and browsers just as they are used to.</P><P style=" text-align : justify; ">For your SAP backend jobs and SAP’s standard OData API a community-driven open-source integration component is offered on <SPAN><A href="https://github.com/Azure/universal-print-for-sap-starter-pack" target="_blank" rel="noopener nofollow noreferrer">GitHub</A></SPAN>. Check the <SPAN><A href="https://azuremarketplace.microsoft.com/marketplace/apps" target="_blank" rel="noopener nofollow noreferrer">Azure marketplace</A></SPAN>, SAP store, and partner repositories for updates on partner offerings. Above list of partner solutions could get you started.</P><P style=" text-align : justify; "><SPAN>Let us know what you think and feel encouraged to participate in the community effor</SPAN><SPAN>t</SPAN><span class="lia-unicode-emoji" title=":raising_hands:">🙌</span><SPAN>.</SPAN></P><P style=" text-align : justify; "><SPAN>Partners are welcome to reach out to build a marketplace or managed offering.</SPAN></P><P style=" text-align : justify; ">&nbsp;</P><P style=" text-align : justify; ">Last but not least: thank you to&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/775507">@timo_straub1</a>&nbsp;and amazing team for the great collaboration<span class="lia-unicode-emoji" title=":folded_hands:">🙏</span></P><P style=" text-align : justify; ">&nbsp;</P><P style=" text-align : justify; ">Cheers</P><P style=" text-align : justify; ">Devansh and Martin</P> 2024-04-16T17:06:26.850000+02:00 https://community.sap.com/t5/technology-blogs-by-members/govern-sap-apis-living-in-various-api-management-gateways-in-a-single-place/ba-p/13682483 Govern SAP APIs living in various API Management gateways in a single place with Azure API Center 2024-04-26T12:33:48.591000+02:00 Martin-Pankraz https://community.sap.com/t5/user/viewprofilepage/user-id/143781 <TABLE border="1" width="100%"><TBODY><TR><TD width="100%"><P><EM>Find the GitHub repos associated with this post on Azure API Center </EM><SPAN><A href="https://github.com/Azure-Samples/azd-apic-sap/" target="_blank" rel="noopener nofollow noreferrer"><EM>here</EM></A></SPAN><EM>.</EM></P><P><EM><SPAN>Our engineering friends from SAP Integration Suite– in particular <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/194397">@Chaim_Bendelac</a>&nbsp; – published a nice “sister blog” on supporting Azure API Management with the API Management capability of SAP Integration Suite </SPAN></EM><SPAN><A href="https://community.sap.com/t5/technology-blogs-by-sap/supporting-multiple-api-gateways-with-sap-api-management-using-azure-api/ba-p/13680433" target="_blank"><EM>here</EM></A><EM>.</EM></SPAN></P></TD></TR></TBODY></TABLE><P><SPAN>Dear community,</SPAN></P><P><SPAN>Many of you are heavily invested in APIs regarding your SAP ecosystem and the rest of your IT real estate. Given the integration specialization in the SAP space companies decide to use more than one integration tool to cater for SAP and non-SAP integrations. <A href="https://www.gartner.com/en/documents/3968032" target="_blank" rel="noopener nofollow noreferrer">Gartner</A> even says that 75% will use at least two different ones. For many of you that means SAP Integration Suite plus one for non-SAP.</SPAN></P><P><SPAN>Due to the fast-paced growth of APIs within organizations, inventory, governance, security, and management cannot keep up. The resulting fragmentation and inconsistency lead to adoption challenges, project delays, and security risks. Postman’s <A href="https://www.postman.com/state-of-api/executing-on-apis/#frequency-of-api-security-incidents" target="_blank" rel="noopener nofollow noreferrer">State of APIs report 2023</A> shows that API security incidents happen frequently.</SPAN></P><P><SPAN>These challenges are summed up under the term “API Sprawl” by the industry. Beware the API sprawl monster is upon you!</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.1 Illustration of API Sprawl challenge" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/101890i296B6772C9A5260E/image-size/medium?v=v2&amp;px=400" role="button" title="_34e58609-ed75-4d35-b822-969302c0ed9c.jpg" alt="fig.1 Illustration of API Sprawl challenge" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.1 Illustration of API Sprawl challenge</span></span></SPAN></P><P><STRONG>Key to survival is automatic discovery</STRONG><SPAN> of available APIs and a single place to enforce guidelines from, or at least know these unmanaged APIs exist in your estate. Forgotten APIs are low hanging fruit for attackers. To drive home that argument: “Improper Inventory Management” made the <A href="https://owasp.org/API-Security/editions/2023/en/0xa9-improper-inventory-management/" target="_blank" rel="noopener nofollow noreferrer">OWASP top 10 list for API Security</A> in 2023.</SPAN></P><P><SPAN>Besides that on the human side of things: Which developer likes to develop duplicate functionality just because of the lack of shared API inventory to discover existing stuff?</SPAN></P><P><SPAN>The API Sprawl monster</SPAN>🦖<SPAN> much hungry! “Nomnom nomnom more food, yes more food!”.</SPAN></P><P><SPAN>Azure API Center embarked on the journey of taming the monster.</SPAN></P><P>&nbsp;</P><H1 id="toc-hId-864366498">What API solutions can be registered to Azure API Center?</H1><P><SPAN>Azure API Center applies to any API and any API management solution out there. Always remember that API Center is not an API Gateway! It doesn’t expose the endpoints or apply policies to them. That stays with the API Management provider. API Center makes them discoverable and allows decorating APIs with additional info to improve governance.</SPAN></P><P><SPAN>Let that sink in.</SPAN></P><P><SPAN>My colleagues are building integrated experiences for the most interesting API and integration tool providers. However, API-based registration in API Center will always be possible.</SPAN></P><P><SPAN>Get it? APIs to register APIs to register APIs ... yah maybe to complicated for a joke.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.2 Azure API Center solution coverage overview" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/101888i27D6FD5DB73C6530/image-size/large?v=v2&amp;px=999" role="button" title="apic-overview.png" alt="fig.2 Azure API Center solution coverage overview" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.2 Azure API Center solution coverage overview</span></span></SPAN></P><P><SPAN>The focus of this blog post will be on inventorying APIs hosted by the API Management capability of SAP Integration Suite to mitigate SAP API sprawl. However, the approach described is applicable to all the other SAP APIs out there hosted on SAP Gateway, SAP Graph, SAP CAP, SAP RAP, CloudFoundry, Kyma, etc. too.</SPAN></P><P><SPAN>Another prominent SAP service would be SAP Cloud Integration (formerly CPI – Cloud Platform Integration). Many of you expose APIs internally or to business partners through SAP integration flows without fronting them with an API Management solution – you know who you are </SPAN><span class="lia-unicode-emoji" title=":winking_face:">😉</span><SPAN>.</SPAN><SPAN> Those can be registered too. Unfortunately, there is no built-in option to retrieve the definition of such an endpoint. You may generate an API definition for your http trigger using payload samples for instance. I found <A href="https://gist.github.com/0xdevalias/5fecf0db3bd9cc7465e42616061e1ab0" target="_blank" rel="noopener nofollow noreferrer">this repo</A> useful to get an overview on how to generate OpenAPI definitions from JSON payloads.</SPAN></P><P><SPAN>Even if you don’t, putting the available metadata on the Azure API Center inventory still improves discoverability and enterprise-wide governance by magnitudes.</SPAN></P><P>But now on to SAP API Management.</P><P>&nbsp;</P><H1 id="toc-hId-667852993">Automagically registering SAP API Management APIs on Azure API Center</H1><P>Our starting point is the SAP BTP service <STRONG>apimanagement-devportal</STRONG>. Check SAP’s docs on the setup process <SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/api-access-plan-for-api-business-hub-enterprise" target="_blank" rel="noopener noreferrer">here</A>. Make sure you don’t mistakenly choose apimanagement-apiportal.</SPAN></P><P>The API “<SPAN><A href="https://api.sap.com/api/DevPortal_DiscoveryService_CF/resource/APIs" target="_blank" rel="noopener noreferrer">API Business Hub Enterprise - Discovery Service (CF)</A>” enables querying all available APIs hosted on SAP API Management on that subaccount. It holds info about their OpenAPI definitions.</SPAN></P><P><SPAN>Authenticate on the service with any of the <A href="https://help.sap.com/docs/sap-api-management/sap-api-management/api-access-plan-for-api-business-hub-enterprise?version=Cloud#create-a-service-key" target="_blank" rel="noopener noreferrer">supported authentication mechanisms</A>. I chose OAuth2 client credentials grant (instance secret – without payload).</SPAN></P><P><SPAN>See below response from “/apidiscovery/v1/apis” from my SAP BTP sandbox environment. Pay attention to the attributes of “apiDefinitions” and values for “oas-json”.</SPAN></P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-json"><code>{ "@odata.context": "$metadata#apis", "value": [ { "name": "GWSAMPLE_BASIC", "title": "GWSAMPLE_BASIC", "version": "1", "lastUpdated": "2024-01-24", "releaseStatus": "PUBLIC", "protocol": "ODATAV2", "entryPoints": [ { "name": "GWSAMPLE_BASIC", "type": "PROD", "url": "https://msftapim.test.apimanagement.eu10.hana.ondemand.com:443/GWSAMPLE_BASIC" } ], "apiDefinitions": [ { "type": "oas-json", "url": "https://eu10devportal.cfapps.eu10.hana.ondemand.com/odata/1.0/data.svc/APIMgmt.APIResourceDocumentations('2797A5F5-E18A-4FCC-826A-C833845303F5')/content/$value" }, { "type": "edmx", "url": "https://msftapim.test.apimanagement.eu10.hana.ondemand.com:443/GWSAMPLE_BASIC/$metadata" } ] }</code></pre><P>&nbsp;</P><P>&nbsp;</P><P><SPAN>For your convenience we have provided a <A href="https://github.com/Azure-Samples/azd-apic-sap/" target="_blank" rel="noopener nofollow noreferrer">sample repo</A> that runs Infrastructure-as-Code scripting to register the SAP APIs using their OpenAPI definitions as highlighted above. On each SAP API definition we execute registration requests on Azure API Center.</SPAN></P><P><SPAN>You may also use Postman, or SAP Build Process Automation etc. to execute the REST API calls if you prefer. Find our collection <A href="https://github.com/Azure-Samples/azd-apic-sap/blob/main/sap-apim-scan.http" target="_blank" rel="noopener nofollow noreferrer">here</A>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.3 Flow of automated API registration in Azure API Center" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/101894i6B0E80481BFFF330/image-size/large?v=v2&amp;px=999" role="button" title="apic-register-flow.png" alt="fig.3 Flow of automated API registration in Azure API Center" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.3 Flow of automated API registration in Azure API Center</span></span></SPAN></P><H1 id="toc-hId-471339488">Discover all your APIs where you code – see VS Code and GitHub Copilot in action</H1><P><SPAN>We developers like to stay within our flow. So, having the API inventory available at my fingertips in VSCode is a good step into that direction. Also generating http requests to poke around the service and API clients is nice </SPAN><span class="lia-unicode-emoji" title=":smiling_face_with_sunglasses:">😎</span><SPAN><A href="https://github.com/microsoft/kiota" target="_blank" rel="noopener nofollow noreferrer">Kiota</A></SPAN> supports a multitude of languages for SDK generation.</P><P><SPAN>To get that going install the <A href="https://learn.microsoft.com/azure/api-center/use-vscode-extension" target="_blank" rel="noopener nofollow noreferrer">Azure API Center portal VSCode extension</A>.</SPAN></P><P><SPAN><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%2F62X0NALedCc%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D62X0NALedCc&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F62X0NALedCc%2Fhqdefault.jpg&amp;key=b0d40caa4f094c68be7c29880b16f56e&amp;type=text%2Fhtml&amp;schema=youtube" width="400" height="225" scrolling="no" title="Introducing the VS Code extension for Azure API Center" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.4 Screenshot of VSCode extension with example OpenAPI definition" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/101895i0F90ED42F7A3F97B/image-size/large?v=v2&amp;px=999" role="button" title="apic-vsc-ext.png" alt="fig.4 Screenshot of VSCode extension with example OpenAPI definition" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.4 Screenshot of VSCode extension with example OpenAPI definition</span></span></SPAN></P><P><SPAN>Please note that the authorize button (and respective authentication scheme) on the OpenAPI definition explorer is only available if present on the definition file. It looks like this for Basic Auth:</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.5 Screenshot of auth definition in example OpenAPI spec for SAP OData service" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/101896i185F2B5F860C6AF7/image-size/medium?v=v2&amp;px=400" role="button" title="apic-vsc-ext1.png" alt="fig.5 Screenshot of auth definition in example OpenAPI spec for SAP OData service" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.5 Screenshot of auth definition in example OpenAPI spec for SAP OData service</span></span></SPAN></P><P>W<SPAN>hen using the http file and the <A href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client" target="_blank" rel="noopener nofollow noreferrer">REST client extension</A> of your choice, you may simply provide the authentication header with Bearer token etc.</SPAN></P><P><SPAN>Next to the Azure API Center extension view before, you can also use <A href="https://learn.microsoft.com/azure/api-center/use-vscode-extension-copilot" target="_blank" rel="noopener nofollow noreferrer">GitHub Copilot Chat</A> to query available APIs from API Center. See <A href="https://learn.microsoft.com/azure/api-center/use-vscode-extension-copilot#search-for-apis-using-github-copilot-chat" target="_blank" rel="noopener nofollow noreferrer">Microsoft Learn</A> for more samples. You may search for APIs by key words like so:</SPAN></P><P>&nbsp;</P><P>&nbsp;</P><pre class="lia-code-sample language-bash"><code>@apicenter /search business-partner</code></pre><P>&nbsp;</P><P>&nbsp;</P><P><SPAN>Cherry on the cake </SPAN><span class="lia-unicode-emoji" title=":shortcake:">🍰</span>is the <SPAN><A href="https://learn.microsoft.com/azure/api-center/enable-api-center-portal" target="_blank" rel="noopener nofollow noreferrer">API Center portal</A></SPAN> for the classic developer portal experience across your whole registered API inventory wherever that is.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.6 Screenshot of Azure API Center portal API inventory view" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/101898iFEE25F515A582F66/image-size/large?v=v2&amp;px=999" role="button" title="apic-portal.png" alt="fig.6 Screenshot of Azure API Center portal API inventory view" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.6 Screenshot of Azure API Center portal API inventory view</span></span></P><P><SPAN>So far so good on registering APIs and working off the info their definitions provide. But how about governance? I know how desperately everyone wants to plaster cost centers, line-of-business info, and security labels on your interfaces. </SPAN><span class="lia-unicode-emoji" title=":smirking_face:">😏</span></P><P>&nbsp;</P><H1 id="toc-hId-274825983">Enforced API metadata is your second line of defense against API sprawl</H1><P><SPAN>In addition to simply registering APIs you may add custom properties to the object on Azure API Center. So, even if the info is not present on the API itself you can still govern it from Azure. See below sample that I created from the <A href="https://learn.microsoft.com/azure/api-center/add-metadata-properties" target="_blank" rel="noopener nofollow noreferrer">Microsoft Learn tutorial</A>.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="fig.7 Screenshot of Azure API Center metadata maintenance view" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/101899i08A674038B335754/image-size/large?v=v2&amp;px=999" role="button" title="apic-custom-props.png" alt="fig.7 Screenshot of Azure API Center metadata maintenance view" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">fig.7 Screenshot of Azure API Center metadata maintenance view</span></span></P><P><SPAN>Knowing which APIs are public facing is useful, isn’t it?</SPAN></P><P><SPAN>For everyone looking for more sophisticated security with less human error surface, have a look at <A href="https://learn.microsoft.com/azure/defender-for-cloud/defender-for-apis-introduction" target="_blank" rel="noopener nofollow noreferrer">Defender for APIs</A>. I like the alert rule for “un-authenticated APIs” and disabling endpoints that were not used in the past 60 days most – wait what? Those exist out there in the wild west of SAP on the Internet? </SPAN><span class="lia-unicode-emoji" title=":astonished_face:">😲</span>See the open-source automatic remediations repos <SPAN><A href="https://github.com/Azure/Microsoft-Defender-for-Cloud/tree/main/Workflow%20automation/Defender%20for%20API" target="_blank" rel="noopener nofollow noreferrer">here</A></SPAN> to mitigate for Azure API Management.</P><P>Defender for API integration with <SPAN><A href="https://learn.microsoft.com/azure/defender-for-cloud/onboarding-guide-42crunch" target="_blank" rel="noopener nofollow noreferrer">42Crunch</A></SPAN> brings API security testing and hardening to your CI/CD pipeline.</P><P>&nbsp;</P><H1 id="toc-hId-78312478">API Linting gets you to the next level</H1><P><SPAN>OK, now let’s look at API style guide compliance. Is everyone playing by your rules? How do you make sure developers notice violations already during design phase rather than at later stages of deployment, release, or even months after the fact when audited?</SPAN></P><P><SPAN>Good automatic <A href="https://thenewstack.io/improve-the-quality-of-your-apis-with-spectral-linting/" target="_blank" rel="noopener nofollow noreferrer">API linting</A> creates much less hassle for everyone in the long run, less cost to fix API definitions after the fact, improved security posture, and a more rewarding experience for the people involved. See below video on the setup of the linting function for OpenAPI using <A href="https://github.com/stoplightio/spectral/blob/develop/docs/reference/openapi-rules.md" target="_blank" rel="noopener nofollow noreferrer">Spectral linting engine</A>.</SPAN></P><P><SPAN>Anyone aware of a great OData linter and would be curious to explore? Please share!</SPAN></P><P><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%2Fm0XATQaVhxA%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dm0XATQaVhxA&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fm0XATQaVhxA%2Fhqdefault.jpg&amp;key=b0d40caa4f094c68be7c29880b16f56e&amp;type=text%2Fhtml&amp;schema=youtube" width="400" height="225" scrolling="no" title="Mastering API Governance with Azure API Center" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P><SPAN>Get more details on API Linting for Azure API Center from <A href="https://learn.microsoft.com/azure/api-center/enable-api-analysis-linting?tabs=portal" target="_blank" rel="noopener nofollow noreferrer">this Microsoft Learn article</A>.</SPAN></P><P>&nbsp;</P><H1 id="toc-hId--118201027">Thoughts on production readiness</H1><P><SPAN>Azure API Center is in public preview but due for General Availability with the next wave of announcements, so completely ready for prime time. The same is true for the VS Code extensions and APIs used to orchestrate the integration between SAP API Management and Azure.</SPAN></P><P><SPAN>Intentionally registering APIs from SAP to Azure API Center improves API inventory management by magnitudes. However, shadow inventory thrives in places you don’t actively look. To mitigate even more effectively the team is building automated discovery from your GitHub org, Azure DevOps, and other popular sources.</SPAN></P><P><SPAN><A href="https://marketplace.visualstudio.com/items?itemName=SAPSE.sap-ux-fiori-tools-extension-pack" target="_blank" rel="noopener nofollow noreferrer">SAP Fiori tools</A> on VSCode provided by SAP SE enable usage of the approach described in this blog out of the box. The same is true for <A href="https://developers.sap.com/tutorials/btp-app-prepare-dev-environment-cap.html" target="_blank" rel="noopener noreferrer">SAP CAP development</A> in VSCode.</SPAN></P><P>&nbsp;</P><H1 id="toc-hId--314714532">Final words</H1><P><SPAN>That’s a wrap</SPAN><span class="lia-unicode-emoji" title=":burrito:">🌯</span>. You saw today how you can effectively <STRONG>counter API sprawl</STRONG> and its negative side effects that put your APIs and organizations at risk. A primary means to achieve that is <STRONG>creating a central API inventory </STRONG>hosted on all the different API Management solutions out there <STRONG>with Azure API Center</STRONG>.</P><P>This blog showed how to achieve that using the API Management capability of SAP Integration Suite as an example.</P><P>Furthermore, you learned about steps to improve API governance with custom properties and API linting. Eventually, you understood the difference between Azure API Center and an API Gateway.</P><P>Find the GitHub repos associated with this post <SPAN><A href="https://github.com/Azure-Samples/azd-apic-sap/" target="_blank" rel="noopener nofollow noreferrer">here</A></SPAN>. It gets you started in no time.</P><P>Big #Kudos to <SPAN><A href="https://www.linkedin.com/in/pascalvdheiden/" target="_blank" rel="noopener nofollow noreferrer">Pascal van der Heiden</A></SPAN> – my brother in crime on this effort. And of course, last but not least to&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/8446">@UdoPaltzer</a>&nbsp;and <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/216068">@vinayak_adkoli</a>&nbsp;for the great collaboration! <span class="lia-unicode-emoji" title=":raising_hands:">🙌</span></P><P>Anyone curious to tap their toe into the waters where the API sprawl monster 🦖 lives, just reach out to me and Chaim or leave a comment.</P><P>Cheers</P><P>Martin</P> 2024-04-26T12:33:48.591000+02:00