Recevoir un événement de Cloud Pub/Sub dans SAP à l'aide du SDK ABAP pour Google Cloud

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

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

6757b2fb50ddcc2d.png

  • Exécutez les commandes suivantes pour vous authentifier pour votre compte et définir le projet par défaut sur abap-sdk-poc. La zone us-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

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:

  1. 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"
  1. 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.

  1. 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.

f0fc44265192f348.png

  1. Requête pull:votre système SAP (l'abonné) utilise la méthode pull pour demander des messages au serveur Pub/Sub.
  2. 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.
  3. 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 de PUBSUB_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:

  1. Dans l'IUG de SAP, saisissez le code de transaction SPRO.
  2. Cliquez sur SAP Reference IMG.
  3. Cliquez sur SDK ABAP pour Google Cloud > Paramètres de base > Configurer la clé client.

25871e639293b9ee.png

  1. 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

  1. Connectez-vous à votre système SAP.
  2. Accédez au code de transaction SE38 et créez un programme de rapport nommé ZDEMO_RECEIVE_CPS_EVENTS..
  3. Dans le pop-up qui s'affiche, fournissez les informations indiquées ci-dessous, puis cliquez sur Enregistrer.

7c739236bedb5bf1.png

  1. Dans la fenêtre pop-up suivante, sélectionnez Objet local ou indiquez un nom de package, le cas échéant.
  2. 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.
  1. Enregistrez et activez le rapport.
  2. Exécutez le rapport (F8).

Si l'exécution réussit, le résultat du rapport s'affiche comme suit:

5b76e886ef79d0ba.png

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

  1. Supprimez l'instance de calcul:
gcloud compute instances delete abap-trial-docker
  1. Supprimez les règles de pare-feu :
gcloud compute firewall-rules delete sapmachine
  1. Supprimez le compte de service :
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com