Der SAP Private Link Service ermoeglicht eine direkte, private Netzwerkverbindung zwischen SAP BTP und Cloud-Infrastrukturen wie Microsoft Azure oder Amazon AWS. Im Gegensatz zum Cloud Connector erfolgt die Kommunikation komplett ueber private IP-Adressen, ohne das oeffentliche Internet zu nutzen.
Private Link vs. Cloud Connector
Beide Technologien loesen das gleiche Problem – die sichere Anbindung von On-Premise-Systemen – aber auf unterschiedliche Weise.
Architekturvergleich
| Aspekt | Cloud Connector | Private Link Service |
|---|---|---|
| Verbindungsart | Tunnel ueber Internet | Private Netzwerkverbindung |
| Netzwerk | Oeffentliches Internet mit TLS | Komplett privat (keine Internet-Exposition) |
| Latenz | Hoeher (Internet-Routing) | Niedriger (direktes Peering) |
| Bandbreite | Abhaengig von Internet-Anbindung | Dedizierte Kapazitaet |
| On-Premise-Software | Cloud Connector installieren | Keine Software noetig |
| Cloud-Provider | Alle | Azure, AWS |
| Kosten | Cloud Connector-Lizenz | Private Link Gebuehren |
Wann Private Link verwenden?
Private Link ist ideal fuer:
- Strenge Compliance-Anforderungen: Daten duerfen das private Netzwerk nie verlassen
- Hohe Bandbreitenanforderungen: Grosse Datenmengen transferieren
- Niedrige Latenz: Echtzeitanwendungen, interaktive UIs
- Azure/AWS-basierte Infrastruktur: On-Premise-Workloads in der Cloud
Wann Cloud Connector verwenden?
Cloud Connector bleibt die richtige Wahl fuer:
- Klassische On-Premise-Rechenzentren: Physische Server im eigenen Datacenter
- Multi-Cloud-Szenarien: Verschiedene Cloud-Provider anbinden
- Einfache Setups: Schneller Start ohne Netzwerk-Peering
- Kostenoptimierung: Bei geringem Datenvolumen
Architektur und Netzwerk-Topologie
Azure Private Link
┌─────────────────────────────────────────────────────────────────────────────┐│ SAP BTP (Cloud Foundry) ││ ┌──────────────────┐ ┌─────────────────────────────────────────────┐ ││ │ ABAP Cloud │───>│ SAP Private Link Service │ ││ │ Application │ │ │ ││ └──────────────────┘ │ ┌─────────────────────────────────────┐ │ ││ │ │ Private Endpoint │ │ ││ │ │ (Private IP: 10.0.0.5) │ │ ││ │ └──────────────┬──────────────────────┘ │ ││ └─────────────────│───────────────────────────┘ │└─────────────────────────────────────────────│───────────────────────────────┘ │ Azure Private Link │ (Private Backbone) (Kein Internet!) │ │┌─────────────────────────────────────────────│───────────────────────────────┐│ Azure Virtual Network ││ ┌─────────────────────────────────────────┴────────────────────────────┐ ││ │ Azure Private Link Service │ ││ │ (Frontend IP: 10.1.0.10) │ ││ └───────────────────────────────────┬──────────────────────────────────┘ ││ │ ││ ┌───────────────────────────────────┴──────────────────────────────────┐ ││ │ Azure Load Balancer (Standard) │ ││ │ (Backend: SAP VMs, Gateway Server) │ ││ └───────────────────────────────────┬──────────────────────────────────┘ ││ │ ││ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ ││ │ SAP S/4HANA │ │ SAP Gateway │ │ Andere Azure Services │ ││ │ (VM) │ │ (VM) │ │ (App Service, SQL, ...) │ ││ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │└─────────────────────────────────────────────────────────────────────────────┘AWS PrivateLink
┌─────────────────────────────────────────────────────────────────────────────┐│ SAP BTP (Cloud Foundry) ││ ┌──────────────────┐ ┌─────────────────────────────────────────────┐ ││ │ ABAP Cloud │───>│ SAP Private Link Service │ ││ │ Application │ │ │ ││ └──────────────────┘ │ ┌─────────────────────────────────────┐ │ ││ │ │ VPC Endpoint │ │ ││ │ │ (ENI: 10.0.1.50) │ │ ││ │ └──────────────┬──────────────────────┘ │ ││ └─────────────────│───────────────────────────┘ │└─────────────────────────────────────────────│───────────────────────────────┘ │ AWS PrivateLink │ (AWS Backbone) (Kein Internet!) │ │┌─────────────────────────────────────────────│───────────────────────────────┐│ AWS VPC ││ ┌─────────────────────────────────────────┴────────────────────────────┐ ││ │ VPC Endpoint Service │ ││ │ (com.amazonaws.vpce.eu-central-1.vpce-svc-xxx) │ ││ └───────────────────────────────────┬──────────────────────────────────┘ ││ │ ││ ┌───────────────────────────────────┴──────────────────────────────────┐ ││ │ Network Load Balancer │ ││ │ (Target Group: SAP EC2 Instances) │ ││ └───────────────────────────────────┬──────────────────────────────────┘ ││ │ ││ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ ││ │ SAP S/4HANA │ │ SAP Gateway │ │ Andere AWS Services │ ││ │ (EC2) │ │ (EC2) │ │ (RDS, Lambda, ...) │ ││ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │└─────────────────────────────────────────────────────────────────────────────┘Setup-Anleitung fuer Azure Private Link
Schritt 1: Azure-Ressourcen erstellen
# 1. Resource Group erstellenaz group create \ --name rg-sap-privatelink \ --location westeurope
# 2. Virtual Network erstellenaz network vnet create \ --resource-group rg-sap-privatelink \ --name vnet-sap \ --address-prefix 10.1.0.0/16 \ --subnet-name subnet-sap \ --subnet-prefix 10.1.1.0/24
# 3. Subnet fuer Private Link Service erstellenaz network vnet subnet create \ --resource-group rg-sap-privatelink \ --vnet-name vnet-sap \ --name subnet-privatelink \ --address-prefix 10.1.2.0/24 \ --disable-private-link-service-network-policies trueSchritt 2: Load Balancer konfigurieren
# Standard Load Balancer erstellenaz network lb create \ --resource-group rg-sap-privatelink \ --name lb-sap-gateway \ --sku Standard \ --frontend-ip-name frontend-sap \ --backend-pool-name backend-sap \ --vnet-name vnet-sap \ --subnet subnet-sap
# Health Probe hinzufuegenaz network lb probe create \ --resource-group rg-sap-privatelink \ --lb-name lb-sap-gateway \ --name probe-https \ --protocol Tcp \ --port 443
# Load Balancing Rule erstellenaz network lb rule create \ --resource-group rg-sap-privatelink \ --lb-name lb-sap-gateway \ --name rule-https \ --protocol Tcp \ --frontend-port 443 \ --backend-port 443 \ --frontend-ip-name frontend-sap \ --backend-pool-name backend-sap \ --probe-name probe-httpsSchritt 3: Private Link Service erstellen
# Private Link Service erstellenaz network private-link-service create \ --resource-group rg-sap-privatelink \ --name pls-sap-gateway \ --vnet-name vnet-sap \ --subnet subnet-privatelink \ --lb-name lb-sap-gateway \ --lb-frontend-ip-configs frontend-sap \ --location westeurope
# Private Link Service ID abrufen (fuer SAP BTP)az network private-link-service show \ --resource-group rg-sap-privatelink \ --name pls-sap-gateway \ --query 'alias' -o tsvSchritt 4: SAP BTP Private Link Service konfigurieren
Im SAP BTP Cockpit:
- Subaccount oeffnen
- Entitlements > Configure Entitlements > Add Service Plans
- Private Link Service hinzufuegen
- Service Instances > Create
- Azure Private Link Alias eingeben
{ "resourceId": "/subscriptions/{subscription-id}/resourceGroups/rg-sap-privatelink/providers/Microsoft.Network/privateLinkServices/pls-sap-gateway"}Setup-Anleitung fuer AWS PrivateLink
Schritt 1: VPC und Subnets erstellen
# VPC erstellenaws ec2 create-vpc \ --cidr-block 10.2.0.0/16 \ --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=vpc-sap-privatelink}]'
# Subnet erstellenaws ec2 create-subnet \ --vpc-id vpc-xxxxxxxxx \ --cidr-block 10.2.1.0/24 \ --availability-zone eu-central-1a \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=subnet-sap}]'Schritt 2: Network Load Balancer erstellen
# NLB erstellenaws elbv2 create-load-balancer \ --name nlb-sap-gateway \ --type network \ --subnets subnet-xxxxxxxxx \ --scheme internal
# Target Group erstellenaws elbv2 create-target-group \ --name tg-sap-gateway \ --protocol TCP \ --port 443 \ --vpc-id vpc-xxxxxxxxx \ --target-type ip
# SAP-Server als Targets registrierenaws elbv2 register-targets \ --target-group-arn arn:aws:elasticloadbalancing:... \ --targets Id=10.2.1.10,Port=443
# Listener erstellenaws elbv2 create-listener \ --load-balancer-arn arn:aws:elasticloadbalancing:... \ --protocol TCP \ --port 443 \ --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:...Schritt 3: VPC Endpoint Service erstellen
# Endpoint Service erstellenaws ec2 create-vpc-endpoint-service-configuration \ --network-load-balancer-arns arn:aws:elasticloadbalancing:... \ --acceptance-required \ --tag-specifications 'ResourceType=vpc-endpoint-service,Tags=[{Key=Name,Value=vpce-svc-sap}]'
# Service Name abrufen (fuer SAP BTP)aws ec2 describe-vpc-endpoint-service-configurations \ --query 'ServiceConfigurations[0].ServiceName' \ --output textSchritt 4: SAP BTP konfigurieren
{ "serviceName": "com.amazonaws.vpce.eu-central-1.vpce-svc-xxxxxxxxx"}Destination mit Private Link nutzen
Destination Service Konfiguration
Nach erfolgreicher Einrichtung des Private Link Service erstellen Sie eine Destination in SAP BTP:
{ "Name": "PRIVATE_LINK_S4HANA", "Type": "HTTP", "URL": "https://private-endpoint-url:443", "ProxyType": "PrivateLink", "Authentication": "BasicAuthentication", "User": "ABAP_USER", "Password": "xxxxxxxx", "sap.applicationdevelopment.actions.enabled": "true", "sap.processautomation.enabled": "true", "HTML5.ForwardAuthToken": "true"}ABAP Cloud Code fuer Private Link Destination
CLASS zcl_private_link_demo DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION. INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS zcl_private_link_demo IMPLEMENTATION.
METHOD if_oo_adt_classrun~main. " Destination mit Private Link verwenden TRY. DATA(lo_destination) = cl_http_destination_provider=>create_by_cloud_destination( i_name = 'PRIVATE_LINK_S4HANA' i_authn_mode = if_a4c_cp_service=>user_propagation ).
DATA(lo_http_client) = cl_web_http_client_manager=>create_by_http_destination( i_destination = lo_destination ).
" OData-Service aufrufen DATA(lo_request) = lo_http_client->get_http_request( ). lo_request->set_uri_path( '/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner' ). lo_request->set_header_field( i_name = 'Accept' i_value = 'application/json' ).
DATA(lo_response) = lo_http_client->execute( if_web_http_client=>get ). DATA(lv_status) = lo_response->get_status( ). DATA(lv_body) = lo_response->get_text( ).
IF lv_status-code = 200. out->write( |Erfolg! Antwort: { lv_body }| ). ELSE. out->write( |Fehler: { lv_status-code } - { lv_status-reason }| ). ENDIF.
lo_http_client->close( ).
CATCH cx_http_dest_provider_error INTO DATA(lx_dest). out->write( |Destination-Fehler: { lx_dest->get_text( ) }| ).
CATCH cx_web_http_client_error INTO DATA(lx_http). out->write( |HTTP-Fehler: { lx_http->get_text( ) }| ). ENDTRY. ENDMETHOD.
ENDCLASS.Mehrere Backend-Systeme ueber Private Link
CLASS zcl_multi_backend_demo DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION. TYPES: BEGIN OF ty_backend_result, system_name TYPE string, status TYPE i, data TYPE string, END OF ty_backend_result, tt_backend_results TYPE STANDARD TABLE OF ty_backend_result WITH EMPTY KEY.
METHODS: call_all_backends RETURNING VALUE(rt_results) TYPE tt_backend_results.
ENDCLASS.
CLASS zcl_multi_backend_demo IMPLEMENTATION.
METHOD call_all_backends. " Verschiedene Backend-Systeme ueber Private Link DATA(lt_destinations) = VALUE string_table( ( `PRIVATE_LINK_S4HANA` ) ( `PRIVATE_LINK_ECC` ) ( `PRIVATE_LINK_CRM` ) ).
LOOP AT lt_destinations INTO DATA(lv_destination). DATA(ls_result) = VALUE ty_backend_result( system_name = lv_destination ).
TRY. DATA(lo_destination) = cl_http_destination_provider=>create_by_cloud_destination( i_name = lv_destination ).
DATA(lo_client) = cl_web_http_client_manager=>create_by_http_destination( lo_destination ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>get ).
ls_result-status = lo_response->get_status( )-code. ls_result-data = lo_response->get_text( ).
lo_client->close( ).
CATCH cx_root INTO DATA(lx_error). ls_result-status = 500. ls_result-data = lx_error->get_text( ). ENDTRY.
APPEND ls_result TO rt_results. ENDLOOP. ENDMETHOD.
ENDCLASS.Security-Aspekte und Compliance
Sicherheitsvorteile von Private Link
| Aspekt | Beschreibung |
|---|---|
| Keine Internet-Exposition | Daten verlassen nie das private Netzwerk |
| DDoS-Schutz | Keine oeffentlichen Endpunkte angreifbar |
| Daten-Souveraenitaet | Daten bleiben in definierten Regionen |
| Compliance | GDPR, HIPAA, PCI-DSS konform |
| Audit-Trail | Vollstaendige Protokollierung im Cloud-Provider |
Verschluesselung
┌─────────────────────────────────────────────────────────────────┐│ Verschluesselungsebenen bei Private Link │├─────────────────────────────────────────────────────────────────┤│ ││ 1. Transport Layer Security (TLS 1.3) ││ - Ende-zu-Ende zwischen ABAP Cloud und Backend ││ - Zertifikatsvalidierung auf beiden Seiten ││ ││ 2. Private Link Backbone ││ - Azure/AWS interne Verschluesselung ││ - Keine Moeglichkeit fuer Man-in-the-Middle ││ ││ 3. Optional: mTLS (Mutual TLS) ││ - Client-Zertifikate fuer zusaetzliche Authentifizierung ││ │└─────────────────────────────────────────────────────────────────┘Network Security Groups (NSG)
# Azure: NSG Rules fuer Private Linkaz network nsg rule create \ --resource-group rg-sap-privatelink \ --nsg-name nsg-sap \ --name allow-privatelink-inbound \ --priority 100 \ --direction Inbound \ --source-address-prefixes 10.0.0.0/8 \ --destination-port-ranges 443 \ --access Allow \ --protocol Tcp
# Alle anderen eingehenden Verbindungen blockierenaz network nsg rule create \ --resource-group rg-sap-privatelink \ --nsg-name nsg-sap \ --name deny-internet-inbound \ --priority 4096 \ --direction Inbound \ --source-address-prefixes Internet \ --destination-port-ranges '*' \ --access Deny \ --protocol '*'Compliance-Checkliste
| Anforderung | Private Link Erfuellung |
|---|---|
| GDPR Art. 32 | Technische Massnahmen durch Netzwerkisolation |
| ISO 27001 | Zugriffskontrolle und Netzwerksegmentierung |
| SOC 2 Type II | Auditierbare Konfiguration |
| PCI-DSS | Keine Daten ueber oeffentliches Netzwerk |
| HIPAA | Ende-zu-Ende-Verschluesselung |
Kostenuebersicht und Sizing-Empfehlungen
Azure Private Link Kosten
| Komponente | Preis (ca.) |
|---|---|
| Private Endpoint (pro Stunde) | ~0,01 EUR |
| Datenverarbeitung (pro GB) | ~0,01 EUR |
| Standard Load Balancer | ~0,025 EUR/Stunde + Regeln |
Monatliche Schaetzung (mittlere Last):
- Private Endpoint: ~7 EUR
- 100 GB Datentransfer: ~1 EUR
- Load Balancer: ~25 EUR
- Gesamt: ~33 EUR/Monat
AWS PrivateLink Kosten
| Komponente | Preis (ca.) |
|---|---|
| VPC Endpoint (pro Stunde) | ~0,01 EUR |
| Datenverarbeitung (pro GB) | ~0,01 EUR |
| Network Load Balancer | ~0,02 EUR/Stunde + LCU |
Monatliche Schaetzung (mittlere Last):
- VPC Endpoint: ~7 EUR
- 100 GB Datentransfer: ~1 EUR
- NLB: ~20 EUR
- Gesamt: ~28 EUR/Monat
Sizing-Empfehlungen
| Szenario | Load Balancer Groesse | Erwartete Performance |
|---|---|---|
| Entwicklung/Test | Basic | < 100 Requests/Sek |
| Kleine Produktion | Standard (1 LCU) | ~100-500 Requests/Sek |
| Mittlere Produktion | Standard (5 LCU) | ~500-2000 Requests/Sek |
| Enterprise | Standard (20+ LCU) | > 2000 Requests/Sek |
Bandbreitenplanung
┌─────────────────────────────────────────────────────────────────┐│ Bandbreiten-Kalkulation │├─────────────────────────────────────────────────────────────────┤│ ││ Annahmen: ││ - 1000 OData-Aufrufe pro Stunde ││ - Durchschnittliche Antwortgroesse: 50 KB ││ - Peak-Faktor: 3x ││ ││ Berechnung: ││ - Durchschnitt: 1000 x 50 KB = 50 MB/Stunde ││ - Peak: 50 MB x 3 = 150 MB/Stunde ││ - Taeglich (8 Std): 8 x 50 MB = 400 MB ││ - Monatlich: 400 MB x 22 = ~9 GB ││ ││ Empfehlung: Standard Load Balancer mit Auto-Scaling ││ │└─────────────────────────────────────────────────────────────────┘Monitoring und Troubleshooting
Azure Monitoring
# Metriken fuer Private Link Service abrufenaz monitor metrics list \ --resource /subscriptions/{sub}/resourceGroups/rg-sap-privatelink/providers/Microsoft.Network/privateLinkServices/pls-sap-gateway \ --metric BytesIn,BytesOut,ConnectionCount \ --interval PT1H
# Diagnose-Logs aktivierenaz monitor diagnostic-settings create \ --name pls-diagnostics \ --resource /subscriptions/{sub}/resourceGroups/.../pls-sap-gateway \ --logs '[{"category": "PrivateLinkServiceLogs", "enabled": true}]' \ --workspace /subscriptions/{sub}/resourceGroups/.../workspaces/log-analyticsHaeufige Probleme und Loesungen
| Problem | Ursache | Loesung |
|---|---|---|
| Verbindung timeout | NSG blockiert | NSG-Regeln pruefen |
| DNS-Aufloesung fehlgeschlagen | Private DNS Zone fehlt | DNS-Zone konfigurieren |
| 403 Forbidden | Endpoint-Genehmigung ausstehend | Auto-Approval aktivieren oder manuell genehmigen |
| Hohe Latenz | Falsche Region | Regionen angleichen |
| Verbindungsabbrueche | Load Balancer Health Check | Backend-Server pruefen |
ABAP Cloud Fehlerbehandlung
METHOD handle_private_link_errors. TRY. DATA(lo_destination) = cl_http_destination_provider=>create_by_cloud_destination( i_name = 'PRIVATE_LINK_S4HANA' ).
DATA(lo_client) = cl_web_http_client_manager=>create_by_http_destination( lo_destination ).
" Timeout explizit setzen lo_client->set_timeout( 30 ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>get ).
CATCH cx_http_dest_provider_error INTO DATA(lx_dest). " Destination nicht gefunden oder nicht erreichbar CASE lx_dest->error_code. WHEN 'DESTINATION_NOT_FOUND'. " Destination im BTP Cockpit pruefen RAISE EXCEPTION TYPE zcx_config_error EXPORTING text = 'Private Link Destination nicht konfiguriert'.
WHEN 'CONNECTION_FAILED'. " Private Link Verbindung pruefen RAISE EXCEPTION TYPE zcx_network_error EXPORTING text = 'Private Link Verbindung fehlgeschlagen'.
WHEN OTHERS. RAISE EXCEPTION TYPE zcx_unknown_error EXPORTING text = lx_dest->get_text( ). ENDCASE.
CATCH cx_web_http_client_error INTO DATA(lx_http). " HTTP-Level Fehler RAISE EXCEPTION TYPE zcx_http_error EXPORTING text = lx_http->get_text( ). ENDTRY.ENDMETHOD.Migration von Cloud Connector zu Private Link
Schrittweise Migration
┌─────────────────────────────────────────────────────────────────┐│ Migrationsplan: Cloud Connector → Private Link │├─────────────────────────────────────────────────────────────────┤│ ││ Phase 1: Vorbereitung (2-4 Wochen) ││ - Azure/AWS Infrastruktur aufbauen ││ - Private Link Service einrichten ││ - Parallelbetrieb konfigurieren ││ ││ Phase 2: Test (1-2 Wochen) ││ - Entwicklungssystem ueber Private Link ││ - Performance-Tests durchfuehren ││ - Monitoring etablieren ││ ││ Phase 3: Qualitaetssicherung (1 Woche) ││ - QA-System migrieren ││ - End-to-End Tests ││ - Rollback-Plan validieren ││ ││ Phase 4: Produktion (1 Woche) ││ - Produktivsystem umstellen ││ - Cloud Connector als Fallback behalten ││ - Ueberwachungsphase ││ ││ Phase 5: Dekommissionierung (2 Wochen) ││ - Cloud Connector entfernen ││ - Dokumentation aktualisieren ││ │└─────────────────────────────────────────────────────────────────┘Destination-Umstellung
{ "_comment": "Vorher: Cloud Connector", "Name": "S4HANA_BACKEND", "Type": "HTTP", "URL": "http://virtual-host:443", "ProxyType": "OnPremise", "CloudConnectorLocationId": "LOC1"}
{ "_comment": "Nachher: Private Link", "Name": "S4HANA_BACKEND", "Type": "HTTP", "URL": "https://private-endpoint-url:443", "ProxyType": "PrivateLink"}Best Practices
Empfehlungen fuer den Betrieb
- Redundanz: Mehrere Availability Zones nutzen
- Monitoring: CloudWatch/Azure Monitor einrichten
- Alerting: Schwellwerte fuer Latenz und Fehlerrate
- Dokumentation: Netzwerk-Topologie aktuell halten
- Security: Regelmaessige Audits der NSG-Regeln
- Backup: Fallback ueber Cloud Connector bereithalten
Zusammenfassung
| Aspekt | Empfehlung |
|---|---|
| Region | BTP und Backend in gleicher Region |
| Authentifizierung | OAuth2/SAML fuer User Propagation |
| Verschluesselung | TLS 1.3 erzwingen |
| Monitoring | End-to-End Latenz messen |
| Kosten | Datentransfer-Volumen ueberwachen |
Verwandte Themen
- SAP Cloud Connector - Alternative fuer klassische On-Premise-Systeme
- SAP Destination Service - Destinations zentral verwalten
- HTTP Client in ABAP Cloud - HTTP-Aufrufe programmieren