1. Introduction
Cet atelier de programmation vous explique comment recevoir des informations sur les événements à partir d'un sujet Google Cloud Pub/Sub à l'aide du SDK ABAP pour Google Cloud. Nous allons utiliser les services Google Cloud suivants:
- Cloud Pub/Sub
- Cloud Shell
Prérequis
- Assurez-vous d'avoir accès à un système SAP sur lequel le SDK ABAP pour Google Cloud est installé.
- Vous pouvez consulter l'atelier de programmation Installer la version d'essai de la plate-forme ABAP sur Google Cloud Platform et installer le SDK ABAP pour configurer un nouveau système.
- Vous avez créé un sujet
PUBSUB_DEMO_TOPIC
dans le cadre du cours de programmation Envoyer des événements de SAP vers Pub/Sub à l'aide du SDK ABAP dans votre projet Google Cloud. Si ce n'est pas le cas, utilisez la commande ci-dessous pour le créer:
gcloud pubsub topics create PUBSUB_DEMO_TOPIC
Ce que vous allez faire
Vous allez créer les éléments suivants:
- Un compte de service disposant d'autorisations de type "Abonné" pour interagir avec l'API Pub/Sub
- Un programme ABAP pour recevoir et accuser réception des messages de votre sujet Pub/Sub.
2. Conditions requises
- Navigateurs, comme Chrome ou Firefox
- Un projet Google Cloud pour lequel la facturation est activée ou créez un compte d'essai sans frais de 90 jours pour Google Cloud Platform.
- Interface utilisateur graphique SAP (Windows ou Java) installée sur votre système. Si l'interface utilisateur SAP est déjà installée sur votre ordinateur portable, connectez-vous à SAP à l'aide de l'adresse IP externe de la VM comme adresse du serveur d'applications. Si vous utilisez un Mac, vous pouvez également installer la GUI SAP pour Java disponible sur ce lien.
3. Avant de commencer
- Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud (par exemple,
abap-sdk-poc
). - Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet. Ignorez cette étape si vous utilisez un compte avec essai sans frais de 90 jours.
- Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud. Dans la console Cloud, cliquez sur Activer Cloud Shell en haut à droite:
- Exécutez les commandes suivantes pour vous authentifier pour votre compte et définir le projet par défaut sur
abap-sdk-poc
. La zoneus-west4-b
est utilisée comme exemple. Si nécessaire, veuillez modifier le projet et la zone dans les commandes suivantes en fonction de vos préférences.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- Dans le cadre du précédent atelier de programmation intitulé Envoyer un événement à Pub/Sub, vous devez déjà avoir activé l'API Pub/Sub, créé le sujet et publié des messages sur Pub/Sub.
4. Créer un compte de service pour accéder à Pub/Sub
L'utilisation d'un compte de service avec le rôle Subscriber
est le moyen le plus sécurisé pour que votre programme ABAP reçoive des messages de Pub/Sub. Ce rôle limite les autorisations à la récupération des messages uniquement, ce qui évite d'éventuelles failles de sécurité.
Créer le compte de service
Pour créer un compte de service avec le rôle requis, procédez comme suit:
- Exécutez la commande suivante dans le terminal Cloud Shell :
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- Ajoutez maintenant les rôles requis au compte de service créé à l'étape précédente:
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/pubsub.subscriber'
La commande ci-dessus utilise abap-sdk-poc
comme espace réservé pour le projet Google Cloud. Remplacez abap-sdk-poc
par l'ID de votre projet.
- Pour vérifier que le rôle a bien été ajouté, accédez à la page IAM. Le compte de service que vous avez créé doit être listé avec le rôle qui lui a été attribué.
5. Comprendre les abonnements pull
Pour un abonnement pull, votre système SAP joue le rôle de client abonné et envoie des requêtes à un serveur Pub/Sub pour récupérer les messages. Le client abonné utilise l'API REST Pull.
Méthodes API clés
API Google Cloud Pub/Sub
- pull: lance une requête pour extraire des messages.
- acknowledge: indique à Pub/Sub qu'un message a bien été traité.
Équivalences du SDK ABAP pour Google Cloud
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
Flux de messages pour un abonnement pull
L'image suivante montre le workflow entre un client abonné et un abonnement pull.
- Requête pull:votre système SAP (l'abonné) utilise la méthode pull pour demander des messages au serveur Pub/Sub.
- Réponse de pull: le serveur Pub/Sub renvoie un ou plusieurs messages et ID de confirmation. Une réponse ne contenant aucun message ou comportant une erreur n'indique pas nécessairement qu'aucun message n'est disponible à recevoir. Cette réponse est la PullResponse, comme illustré dans l'image.
- Confirmation:une fois qu'un message a été traité, votre système SAP utilise la méthode de confirmation avec l'ID de confirmation reçu. Cela empêche Pub/Sub de renvoyer le message.
6. Configurer votre abonnement et envoyer des messages
Créer un abonnement pull
- Exécutez cette commande gcloud pour créer un abonnement pull nommé
PUBSUB_DEMO_SUBSCRIPTION
qui recevra des messages dePUBSUB_DEMO_TOPIC
:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
Publier des messages
Pour envoyer des messages à PUBSUB_DEMO_TOPIC
, choisissez l'une des méthodes suivantes:
- Réutilisez votre programme:si vous avez le programme d'un atelier de programmation précédent à publier, utilisez-le.
- Publication directe: pour un test rapide, essayez l'une des options suivantes:
- Cloud Console: publiez directement dans la console Google Cloud. Pour en savoir plus, consultez la documentation Pub/Sub.
- Commande gcloud: exécutez la commande suivante:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'
7. Créer une configuration de clé client
Maintenant que vous avez configuré les conditions préalables côté Google Cloud, nous pouvons passer à la configuration côté SAP.
Pour la configuration de l'authentification et de la connectivité associée, le SDK ABAP pour Google Cloud utilise les tables /GOOG/CLIENT_KEY
et /GOOG/SERVIC_MAP.
.
Pour gérer la configuration dans la table /GOOG/CLIENT_KEY
, procédez comme suit:
- Dans l'IUG de SAP, saisissez le code de transaction SPRO.
- Cliquez sur SAP Reference IMG.
- Cliquez sur SDK ABAP pour Google Cloud > Paramètres de base > Configurer la clé client.
- Maintenez les valeurs suivantes dans les champs. Laissez tous les autres champs vides.
Champ | Valeur |
Nom de la clé Google Cloud | PUBSUB_SUBSCRIBER |
Nom du compte de service Google Cloud | abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com |
Champ d'application Google Cloud | https://www.googleapis.com/auth/cloud-platform |
ID du projet | abap-sdk-poc |
Classe d'autorisation | /GOOG/CL_AUTH_GOOGLE |
8. Créer un rapport ABAP pour recevoir des messages de Google Cloud Pub/Sub
- Connectez-vous à votre système SAP.
- Accédez au code de transaction
SE38
et créez un programme de rapport nomméZDEMO_RECEIVE_CPS_EVENTS.
. - Dans le pop-up qui s'affiche, fournissez les informations indiquées ci-dessous, puis cliquez sur Enregistrer.
- Dans la fenêtre pop-up suivante, sélectionnez Objet local ou indiquez un nom de package, le cas échéant.
- Dans l'éditeur ABAP, ajoutez le code suivant:
REPORT zdemo_receive_cps_events. TYPES: BEGIN OF ty_event_message, event_time TYPE timestamp, event_type TYPE char30, source TYPE char30, sales_order TYPE vbeln, END OF ty_event_message. DATA: ls_input TYPE /goog/cl_pubsub_v1=>ty_026, ls_input_ack TYPE /goog/cl_pubsub_v1=>ty_001, ls_event_msg TYPE ty_event_message. TRY. "Open HTTP Connection DATA(lo_client) = NEW /goog/cl_pubsub_v1( iv_key_name = 'PUBSUB_SUBSCRIBER' ). "Populate relevant parameters " Derive project id from the client object DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ). " Name of the subscription from where we want to pull data DATA(lv_p_subscriptions_id) = CONV string( 'PUBSUB_DEMO_SUBSCRIPTION' ). " Max number of messages that will be received in 1 API call ls_input-max_messages = 1. "Call API method: pubsub.projects.subscriptions.pull lo_client->pull_subscriptions( EXPORTING iv_p_projects_id = lv_p_projects_id iv_p_subscriptions_id = lv_p_subscriptions_id is_input = ls_input IMPORTING es_output = DATA(ls_output) ev_ret_code = DATA(lv_ret_code) ev_err_text = DATA(lv_err_text) es_err_resp = DATA(ls_err_resp) ). IF lo_client->is_success( lv_ret_code ). DATA(ls_received_msg) = VALUE #( ls_output-received_messages[ 1 ] OPTIONAL ). IF ls_received_msg IS NOT INITIAL. "Messages published to Pub/Sub should be base-64 encoded, hence in order to get the exact message, we need to decode the data field. "However, attributes published to Pub/Sub should be accessible as data references. DATA(lv_msg) = |{ cl_http_utility=>decode_base64( encoded = ls_received_msg-message-data ) }|. /ui2/cl_json=>deserialize( EXPORTING json = lv_msg pretty_name = /ui2/cl_json=>pretty_mode-extended CHANGING data = ls_event_msg ). cl_demo_output=>new( )->begin_section( |Receive Events from Cloud Pubsub using ABAP SDK for Google Cloud| )->write_text( |The below event was successfully received with message ID { ls_received_msg-message-MESSAGE_ID }| )->write_data( ls_event_msg )->end_section( )->display( ). ls_input_ack-ack_ids = VALUE #( ( ls_received_msg-ack_id ) ). "Call API method: pubsub.projects.subscriptions.acknowledge "Acknowledge the messages so it is not pulled again. lo_client->acknowledge_subscriptions( EXPORTING iv_p_projects_id = lv_p_projects_id iv_p_subscriptions_id = lv_p_subscriptions_id is_input = ls_input_ack IMPORTING es_output = DATA(ls_output_ack) ev_ret_code = lv_ret_code ev_err_text = lv_err_text es_err_resp = ls_err_resp ). IF lo_client->is_success( lv_ret_code ). MESSAGE lv_msg TYPE 'S'. ELSE. MESSAGE lv_err_text TYPE 'E'. ENDIF. ELSE. MESSAGE 'No Messages were received!' TYPE 'S'. ENDIF. ELSE. MESSAGE lv_err_text TYPE 'E'. ENDIF. "Close HTTP Connection lo_client->close( ). CATCH /goog/cx_sdk INTO DATA(lo_exception). MESSAGE lo_exception->get_text( ) TYPE 'E'. ENDTRY.
- Enregistrez et activez le rapport.
- Exécutez le rapport (F8).
Si l'exécution réussit, le résultat du rapport s'affiche comme suit:
9. Explication du code d'abonné Pub/Sub ABAP
En substance, ce programme ABAP s'intègre à Google Cloud Pub/Sub en tant qu'abonné aux messages. Il vérifie à la demande si un abonnement spécifié contient de nouveaux messages, les traite, puis confirme leur réception pour éviter toute nouvelle distribution.
Le programme effectue les opérations suivantes:
Détail par étapes
Établir une connexion :
- Il établit une connexion HTTP au service Google Cloud Pub/Sub à l'aide de la classe
/GOOG/CL_PUBSUB_V1
.
Définir les paramètres:
- ID du projet: extrait l'ID de projet approprié où réside l'abonnement Pub/Sub.
- Nom de l'abonnement:spécifie le nom de l'abonnement à partir duquel extraire les messages (
PUBSUB_DEMO_SUBSCRIPTION
). - Message Limit (Limite de messages) : définit le nombre maximal de messages à récupérer dans un seul appel d'API (dans ce cas, 1).
Récupération des messages :
- Appelle la méthode
pull_subscriptions
pour récupérer les messages de l'abonnement spécifié.
Traiter les messages reçus:
- Si des messages existent, le programme décode les données, consigne le contenu et envoie un accusé de réception.
Acknowledge Messages (Messages de confirmation) :
- Appelle la méthode
acknowledge_subscriptions
pour envoyer un accusé de réception à Pub/Sub indiquant la bonne réception des messages. Cela évite qu'elles soient renvoyées.
Gérer les succès/erreurs:
- Affiche des messages de réussite si des messages sont reçus et confirmés, et des messages d'erreur pour divers scénarios de défaillance (aucun message reçu, erreurs d'API, etc.).
Close Connection (Fermer la connexion) :
- Ferme la connexion HTTP au service Pub/Sub.
10. Félicitations
Vous avez terminé le cours de programmation "Recevoir un événement de Cloud Pub/Sub à l'aide du SDK ABAP pour Google Cloud". Bravo !
Vous avez réussi à créer un pont entre ABAP et Google Cloud Pub/Sub. Vous avez terminé l'atelier de programmation, ce qui démontre que vous maîtrisez bien la messagerie basée sur les événements et que vous savez utiliser le SDK ABAP pour Google Cloud pour intégrer les services Google Cloud. Bravo !
Vous avez débloqué un nouveau niveau d'intégration entre ABAP et les services Google Cloud. Élargissez vos horizons avec ces options intéressantes:
- Utiliser l'API Translation avec le SDK ABAP pour Google Cloud
- Importer un objet volumineux dans un bucket Cloud Storage à l'aide de la fragmentation
- Récupérer des identifiants/secrets à partir de Secret Manager avec le SDK ABAP pour Google Cloud
- Appeler Vertex AI test-bison à partir d'ABAP
- Appeler BigQuery ML depuis ABAP
11. Effectuer un nettoyage
Si vous ne souhaitez pas poursuivre les ateliers de programmation supplémentaires liés au SDK ABAP pour Google Cloud, veuillez procéder au nettoyage.
Supprimer le projet
- Supprimez le projet Google Cloud:
gcloud projects delete abap-sdk-poc
Supprimer des ressources individuelles
- Supprimez l'instance de calcul:
gcloud compute instances delete abap-trial-docker
- Supprimez les règles de pare-feu :
gcloud compute firewall-rules delete sapmachine
- Supprimez le compte de service :
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com