Le SAP Private Link Service permet une connexion réseau directe et privée entre SAP BTP et les infrastructures cloud comme Microsoft Azure ou Amazon AWS. Contrairement au Cloud Connector, la communication s’effectue entièrement via des adresses IP privées, sans utiliser l’Internet public.
Private Link vs. Cloud Connector
Les deux technologies résolvent le même problème – la connexion sécurisée des systèmes on-premise – mais de manière différente.
Comparaison architecturale
| Aspect | Cloud Connector | Private Link Service |
|---|---|---|
| Type de connexion | Tunnel via Internet | Connexion réseau privée |
| Réseau | Internet public avec TLS | Complètement privé (aucune exposition Internet) |
| Latence | Plus élevée (routage Internet) | Plus faible (peering direct) |
| Bande passante | Dépend de la connexion Internet | Capacité dédiée |
| Logiciel on-premise | Installer Cloud Connector | Aucun logiciel nécessaire |
| Fournisseur cloud | Tous | Azure, AWS |
| Coûts | Licence Cloud Connector | Frais Private Link |
Quand utiliser Private Link ?
Private Link est idéal pour :
- Exigences de conformité strictes : Les données ne doivent jamais quitter le réseau privé
- Besoins en bande passante élevés : Transfert de grandes quantités de données
- Faible latence : Applications temps réel, interfaces utilisateur interactives
- Infrastructure basée sur Azure/AWS : Charges de travail on-premise dans le cloud
Quand utiliser Cloud Connector ?
Cloud Connector reste le bon choix pour :
- Centres de données on-premise classiques : Serveurs physiques dans votre propre datacenter
- Scénarios multi-cloud : Connexion de différents fournisseurs cloud
- Configurations simples : Démarrage rapide sans peering réseau
- Optimisation des coûts : Avec un faible volume de données
Architecture et topologie réseau
Azure Private Link
┌─────────────────────────────────────────────────────────────────────────────┐│ SAP BTP (Cloud Foundry) ││ ┌──────────────────┐ ┌─────────────────────────────────────────────┐ ││ │ Application │───>│ SAP Private Link Service │ ││ │ ABAP Cloud │ │ │ ││ └──────────────────┘ │ ┌─────────────────────────────────────┐ │ ││ │ │ Private Endpoint │ │ ││ │ │ (IP privée : 10.0.0.5) │ │ ││ │ └──────────────┬──────────────────────┘ │ ││ └─────────────────│───────────────────────────┘ │└─────────────────────────────────────────────│───────────────────────────────┘ │ Azure Private Link │ (Backbone privé) (Pas d'Internet !) │ │┌─────────────────────────────────────────────│───────────────────────────────┐│ Azure Virtual Network ││ ┌─────────────────────────────────────────┴────────────────────────────┐ ││ │ Azure Private Link Service │ ││ │ (IP frontend : 10.1.0.10) │ ││ └───────────────────────────────────┬──────────────────────────────────┘ ││ │ ││ ┌───────────────────────────────────┴──────────────────────────────────┐ ││ │ Azure Load Balancer (Standard) │ ││ │ (Backend : VM SAP, serveur Gateway) │ ││ └───────────────────────────────────┬──────────────────────────────────┘ ││ │ ││ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ ││ │ SAP S/4HANA │ │ SAP Gateway │ │ Autres services Azure │ ││ │ (VM) │ │ (VM) │ │ (App Service, SQL, ...) │ ││ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │└─────────────────────────────────────────────────────────────────────────────┘AWS PrivateLink
┌─────────────────────────────────────────────────────────────────────────────┐│ SAP BTP (Cloud Foundry) ││ ┌──────────────────┐ ┌─────────────────────────────────────────────┐ ││ │ Application │───>│ SAP Private Link Service │ ││ │ ABAP Cloud │ │ │ ││ └──────────────────┘ │ ┌─────────────────────────────────────┐ │ ││ │ │ VPC Endpoint │ │ ││ │ │ (ENI : 10.0.1.50) │ │ ││ │ └──────────────┬──────────────────────┘ │ ││ └─────────────────│───────────────────────────┘ │└─────────────────────────────────────────────│───────────────────────────────┘ │ AWS PrivateLink │ (Backbone AWS) (Pas d'Internet !) │ │┌─────────────────────────────────────────────│───────────────────────────────┐│ AWS VPC ││ ┌─────────────────────────────────────────┴────────────────────────────┐ ││ │ VPC Endpoint Service │ ││ │ (com.amazonaws.vpce.eu-central-1.vpce-svc-xxx) │ ││ └───────────────────────────────────┬──────────────────────────────────┘ ││ │ ││ ┌───────────────────────────────────┴──────────────────────────────────┐ ││ │ Network Load Balancer │ ││ │ (Target Group : instances EC2 SAP) │ ││ └───────────────────────────────────┬──────────────────────────────────┘ ││ │ ││ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ ││ │ SAP S/4HANA │ │ SAP Gateway │ │ Autres services AWS │ ││ │ (EC2) │ │ (EC2) │ │ (RDS, Lambda, ...) │ ││ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │└─────────────────────────────────────────────────────────────────────────────┘Guide de configuration pour Azure Private Link
Étape 1 : Créer les ressources Azure
# 1. Créer un groupe de ressourcesaz group create \ --name rg-sap-privatelink \ --location westeurope
# 2. Créer un réseau virtuelaz 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. Créer un sous-réseau pour Private Link Serviceaz 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 trueÉtape 2 : Configurer le Load Balancer
# Créer un Load Balancer Standardaz 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
# Ajouter une sonde de santéaz network lb probe create \ --resource-group rg-sap-privatelink \ --lb-name lb-sap-gateway \ --name probe-https \ --protocol Tcp \ --port 443
# Créer une règle de load balancingaz 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-httpsÉtape 3 : Créer le Private Link Service
# Créer le Private Link Serviceaz 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
# Récupérer l'ID du Private Link Service (pour SAP BTP)az network private-link-service show \ --resource-group rg-sap-privatelink \ --name pls-sap-gateway \ --query 'alias' -o tsvÉtape 4 : Configurer SAP BTP Private Link Service
Dans le cockpit SAP BTP :
- Ouvrir le Subaccount
- Entitlements > Configure Entitlements > Add Service Plans
- Ajouter Private Link Service
- Service Instances > Create
- Saisir l’alias Azure Private Link
{ "resourceId": "/subscriptions/{subscription-id}/resourceGroups/rg-sap-privatelink/providers/Microsoft.Network/privateLinkServices/pls-sap-gateway"}Guide de configuration pour AWS PrivateLink
Étape 1 : Créer le VPC et les sous-réseaux
# Créer un VPCaws ec2 create-vpc \ --cidr-block 10.2.0.0/16 \ --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=vpc-sap-privatelink}]"
# Créer un sous-réseauaws 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}]"Étape 2 : Créer un Network Load Balancer
# Créer un NLBaws elbv2 create-load-balancer \ --name nlb-sap-gateway \ --type network \ --subnets subnet-xxxxxxxxx \ --scheme internal
# Créer un groupe cibleaws elbv2 create-target-group \ --name tg-sap-gateway \ --protocol TCP \ --port 443 \ --vpc-id vpc-xxxxxxxxx \ --target-type ip
# Enregistrer les serveurs SAP comme ciblesaws elbv2 register-targets \ --target-group-arn arn:aws:elasticloadbalancing:... \ --targets Id=10.2.1.10,Port=443
# Créer un listeneraws elbv2 create-listener \ --load-balancer-arn arn:aws:elasticloadbalancing:... \ --protocol TCP \ --port 443 \ --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:...Étape 3 : Créer le VPC Endpoint Service
# Créer le service de point de terminaisonaws 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}]"
# Récupérer le nom du service (pour SAP BTP)aws ec2 describe-vpc-endpoint-service-configurations \ --query 'ServiceConfigurations[0].ServiceName' \ --output textÉtape 4 : Configurer SAP BTP
{ "serviceName": "com.amazonaws.vpce.eu-central-1.vpce-svc-xxxxxxxxx"}Utiliser une destination avec Private Link
Configuration du Destination Service
Après avoir configuré avec succès le Private Link Service, créez une destination dans 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"}Code ABAP Cloud pour destination Private Link
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. " Utiliser une destination avec Private Link 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 ).
" Appeler le service OData 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( |Succès ! Réponse : { lv_body }| ). ELSE. out->write( |Erreur : { lv_status-code } - { lv_status-reason }| ). ENDIF.
lo_http_client->close( ).
CATCH cx_http_dest_provider_error INTO DATA(lx_dest). out->write( |Erreur de destination : { lx_dest->get_text( ) }| ).
CATCH cx_web_http_client_error INTO DATA(lx_http). out->write( |Erreur HTTP : { lx_http->get_text( ) }| ). ENDTRY. ENDMETHOD.
ENDCLASS.Plusieurs systèmes backend via 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. " Différents systèmes backend via 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.Aspects sécurité et conformité
Avantages de sécurité de Private Link
| Aspect | Description |
|---|---|
| Aucune exposition Internet | Les données ne quittent jamais le réseau privé |
| Protection DDoS | Aucun point de terminaison public attaquable |
| Souveraineté des données | Les données restent dans des régions définies |
| Conformité | Conforme RGPD, HIPAA, PCI-DSS |
| Piste d’audit | Journalisation complète dans le fournisseur cloud |
Chiffrement
┌─────────────────────────────────────────────────────────────────┐│ Niveaux de chiffrement avec Private Link │├─────────────────────────────────────────────────────────────────┤│ ││ 1. Transport Layer Security (TLS 1.3) ││ - Bout en bout entre ABAP Cloud et backend ││ - Validation de certificat des deux côtés ││ ││ 2. Backbone Private Link ││ - Chiffrement interne Azure/AWS ││ - Aucune possibilité de Man-in-the-Middle ││ ││ 3. Optionnel : mTLS (Mutual TLS) ││ - Certificats client pour authentification supplémentaire ││ │└─────────────────────────────────────────────────────────────────┘Groupes de sécurité réseau (NSG)
# Azure : Règles NSG pour 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
# Bloquer toutes les autres connexions entrantesaz 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 '*"Liste de contrôle de conformité
| Exigence | Réponse Private Link |
|---|---|
| RGPD Art. 32 | Mesures techniques par isolation réseau |
| ISO 27001 | Contrôle d’accès et segmentation réseau |
| SOC 2 Type II | Configuration auditable |
| PCI-DSS | Aucune donnée sur réseau public |
| HIPAA | Chiffrement de bout en bout |
Aperçu des coûts et recommandations de dimensionnement
Coûts Azure Private Link
| Composant | Prix (approx.) |
|---|---|
| Private Endpoint (par heure) | ~0,01 EUR |
| Traitement de données (par GB) | ~0,01 EUR |
| Standard Load Balancer | ~0,025 EUR/heure + règles |
Estimation mensuelle (charge moyenne) :
- Private Endpoint : ~7 EUR
- 100 GB de transfert de données : ~1 EUR
- Load Balancer : ~25 EUR
- Total : ~33 EUR/mois
Coûts AWS PrivateLink
| Composant | Prix (approx.) |
|---|---|
| VPC Endpoint (par heure) | ~0,01 EUR |
| Traitement de données (par GB) | ~0,01 EUR |
| Network Load Balancer | ~0,02 EUR/heure + LCU |
Estimation mensuelle (charge moyenne) :
- VPC Endpoint : ~7 EUR
- 100 GB de transfert de données : ~1 EUR
- NLB : ~20 EUR
- Total : ~28 EUR/mois
Recommandations de dimensionnement
| Scénario | Taille Load Balancer | Performance attendue |
|---|---|---|
| Développement/Test | Basic | < 100 requêtes/sec |
| Petite production | Standard (1 LCU) | ~100-500 requêtes/sec |
| Production moyenne | Standard (5 LCU) | ~500-2000 requêtes/sec |
| Entreprise | Standard (20+ LCU) | > 2000 requêtes/sec |
Planification de la bande passante
┌─────────────────────────────────────────────────────────────────┐│ Calcul de la bande passante │├─────────────────────────────────────────────────────────────────┤│ ││ Hypothèses : ││ - 1000 appels OData par heure ││ - Taille moyenne de réponse : 50 KB ││ - Facteur de pointe : 3x ││ ││ Calcul : ││ - Moyenne : 1000 x 50 KB = 50 MB/heure ││ - Pointe : 50 MB x 3 = 150 MB/heure ││ - Quotidien (8 h) : 8 x 50 MB = 400 MB ││ - Mensuel : 400 MB x 22 = ~9 GB ││ ││ Recommandation : Standard Load Balancer avec Auto-Scaling ││ │└─────────────────────────────────────────────────────────────────┘Surveillance et dépannage
Surveillance Azure
# Récupérer les métriques pour Private Link Serviceaz monitor metrics list \ --resource /subscriptions/{sub}/resourceGroups/rg-sap-privatelink/providers/Microsoft.Network/privateLinkServices/pls-sap-gateway \ --metric BytesIn,BytesOut,ConnectionCount \ --interval PT1H
# Activer les journaux de diagnosticaz 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-analyticsProblèmes courants et solutions
| Problème | Cause | Solution |
|---|---|---|
| Connexion timeout | NSG bloque | Vérifier les règles NSG |
| Échec de résolution DNS | Zone DNS privée manquante | Configurer la zone DNS |
| 403 Forbidden | Approbation de point de terminaison en attente | Activer l’approbation automatique ou approuver manuellement |
| Latence élevée | Mauvaise région | Aligner les régions |
| Interruptions de connexion | Health Check du Load Balancer | Vérifier les serveurs backend |
Gestion des erreurs ABAP Cloud
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 ).
" Définir explicitement le timeout 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 introuvable ou inaccessible CASE lx_dest->error_code. WHEN 'DESTINATION_NOT_FOUND'. " Vérifier la destination dans le cockpit BTP RAISE EXCEPTION TYPE zcx_config_error EXPORTING text = 'Destination Private Link non configurée'.
WHEN 'CONNECTION_FAILED'. " Vérifier la connexion Private Link RAISE EXCEPTION TYPE zcx_network_error EXPORTING text = 'Échec de la connexion Private Link'.
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). " Erreur au niveau HTTP RAISE EXCEPTION TYPE zcx_http_error EXPORTING text = lx_http->get_text( ). ENDTRY.ENDMETHOD.Migration de Cloud Connector vers Private Link
Migration progressive
┌─────────────────────────────────────────────────────────────────┐│ Plan de migration : Cloud Connector → Private Link │├─────────────────────────────────────────────────────────────────┤│ ││ Phase 1 : Préparation (2-4 semaines) ││ - Construire l'infrastructure Azure/AWS ││ - Configurer le Private Link Service ││ - Configurer le fonctionnement parallèle ││ ││ Phase 2 : Test (1-2 semaines) ││ - Système de développement via Private Link ││ - Effectuer des tests de performance ││ - Établir la surveillance ││ ││ Phase 3 : Assurance qualité (1 semaine) ││ - Migrer le système QA ││ - Tests de bout en bout ││ - Valider le plan de rollback ││ ││ Phase 4 : Production (1 semaine) ││ - Basculer le système de production ││ - Conserver Cloud Connector comme solution de secours ││ - Phase de surveillance ││ ││ Phase 5 : Décommissionnement (2 semaines) ││ - Supprimer Cloud Connector ││ - Mettre à jour la documentation ││ │└─────────────────────────────────────────────────────────────────┘Changement de destination
{ "_comment": "Avant : Cloud Connector", "Name": "S4HANA_BACKEND", "Type": "HTTP", "URL": "http://virtual-host:443", "ProxyType": "OnPremise", "CloudConnectorLocationId": "LOC1"}
{ "_comment": "Après : Private Link", "Name": "S4HANA_BACKEND", "Type": "HTTP", "URL": "https://private-endpoint-url:443", "ProxyType": "PrivateLink"}Bonnes pratiques
Recommandations pour l’exploitation
- Redondance : Utiliser plusieurs zones de disponibilité
- Surveillance : Configurer CloudWatch/Azure Monitor
- Alertes : Seuils pour la latence et le taux d’erreur
- Documentation : Maintenir la topologie réseau à jour
- Sécurité : Audits réguliers des règles NSG
- Sauvegarde : Maintenir une solution de secours via Cloud Connector
Résumé
| Aspect | Recommandation |
|---|---|
| Région | BTP et backend dans la même région |
| Authentification | OAuth2/SAML pour la propagation utilisateur |
| Chiffrement | Imposer TLS 1.3 |
| Surveillance | Mesurer la latence de bout en bout |
| Coûts | Surveiller le volume de transfert de données |
Sujets connexes
- SAP Cloud Connector - Alternative pour les systèmes on-premise classiques
- SAP Destination Service - Gérer les destinations de manière centralisée
- Client HTTP dans ABAP Cloud - Programmer des appels HTTP