Ereignis von Cloud Pub/Sub in SAP mit dem ABAP SDK for Google Cloud empfangen

1. Einführung

In diesem Codelab erfahren Sie, wie Sie mit dem ABAP SDK for Google Cloud Ereignisdetails von einem Google Cloud Pub/Sub-Thema empfangen. Wir nutzen die folgenden Google Cloud-Dienste:

  • Cloud Pub/Sub
  • Cloud Shell

Vorbereitung

  • Sie benötigen Zugriff auf ein SAP-System mit installiertem ABAP SDK for Google Cloud.
  • Im Codelab Install ABAP Platform Trial on Google Cloud Platform and Install ABAP SDK (ABAP-Plattform-Testversion auf der Google Cloud-Plattform installieren und ABAP SDK installieren) erfahren Sie, wie Sie ein neues System einrichten.
  • Sie haben im Rahmen des Codelabs Send events from SAP to Pub/Sub using ABAP SDK (Ereignisse mit dem ABAP SDK von SAP an Pub/Sub senden) in Ihrem Google Cloud-Projekt das Thema PUBSUB_DEMO_TOPIC erstellt. Falls noch nicht geschehen, erstellen Sie mit dem folgenden Befehl eine Gruppe:
gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Aufgaben

Sie erstellen Folgendes:

  • Ein Dienstkonto mit den Berechtigungen „Abonnent“ für die Interaktion mit der Pub/Sub API.
  • Ein ABAP-Programm zum Empfangen und Bestätigen von Nachrichten von Ihrem Pub/Sub-Thema.

2. Voraussetzungen

3. Hinweis

6757b2fb50ddcc2d.png

  • Führen Sie die folgenden Befehle aus, um sich für Ihr Konto zu authentifizieren und das Standardprojekt auf abap-sdk-poc festzulegen. Als Beispiel wird Zone us-west4-b verwendet. Ändern Sie bei Bedarf das Projekt und die Zone in den folgenden Befehlen entsprechend Ihren Anforderungen.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. Dienstkonto für den Pub/Sub-Zugriff erstellen

Die Verwendung eines Dienstkontos mit der Rolle Subscriber ist die sicherste Methode, mit der Ihr ABAP-Programm Nachrichten von Pub/Sub empfangen kann. Diese Rolle schränkt die Berechtigungen auf den Abruf von Nachrichten ein, um potenzielle Sicherheitslücken zu vermeiden.

Dienstkonto erstellen

So erstellen Sie ein Dienstkonto mit der erforderlichen Rolle:

  1. Führen Sie im Cloud Shell-Terminal den folgenden Befehl aus:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. Fügen Sie dem im vorherigen Schritt erstellten Dienstkonto nun die erforderlichen Rollen hinzu:
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'

Im obigen Befehl wird abap-sdk-poc als Platzhalter für das Google Cloud-Projekt verwendet. Ersetzen Sie abap-sdk-poc durch Ihre Projekt-ID.

  1. Rufen Sie die Seite IAM auf, um zu prüfen, ob die Rolle hinzugefügt wurde. Das von Ihnen erstellte Dienstkonto sollte zusammen mit der zugewiesenen Rolle aufgeführt sein.

5. Pull-Abos

Bei einem Pull-Abo fungiert Ihr SAP-System als Abonnentenclient und initiiert Anfragen an einen Pub/Sub-Server, um Nachrichten abzurufen. Der Abonnentenclient verwendet die REST Pull API.

Wichtige API-Methoden

Google Cloud Pub/Sub API

  • pull: Damit wird eine Anfrage zum Abrufen von Nachrichten initiiert.
  • acknowledge: Gibt Pub/Sub an, dass eine Nachricht erfolgreich verarbeitet wurde.

Entsprechungen zum ABAP SDK for Google Cloud

  • /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
  • /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS

Nachrichtenfluss für ein Pull-Abo

Das folgende Bild zeigt den Workflow zwischen einem Abonnentenclient und einem Pull-Abo.

f0fc44265192f348.png

  1. Pull-Anfrage: Ihr SAP-System (der Abonnent) verwendet die Pull-Methode, um Nachrichten vom Pub/Sub-Server anzufordern.
  2. Pull-Antwort: Der Pub/Sub-Server antwortet mit null oder mehr Nachrichten und Bestätigungs-IDs. Eine Antwort ohne Nachrichten oder mit einem Fehler bedeutet nicht unbedingt, dass keine Nachrichten zum Empfangen verfügbar sind. Diese Antwort ist die PullResponse, wie im Bild dargestellt.
  3. Bestätigung: Nach der Verarbeitung einer Nachricht verwendet Ihr SAP-System die Bestätigungsmethode zusammen mit der empfangenen Bestätigungs-ID. Dadurch wird verhindert, dass Pub/Sub die Nachricht noch einmal sendet.

6. Abo einrichten und Nachrichten senden

Pull-Abo erstellen

  • Führen Sie diesen gcloud-Befehl aus, um ein Pull-Abo mit dem Namen PUBSUB_DEMO_SUBSCRIPTION zu erstellen, das Nachrichten von PUBSUB_DEMO_TOPIC empfängt:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Nachrichten veröffentlichen

Sie haben folgende Möglichkeiten, Nachrichten an PUBSUB_DEMO_TOPIC zu senden:

  • Programm wiederverwenden:Wenn Sie das Programm aus einem vorherigen Codelab zur Veröffentlichung haben, verwenden Sie es.
  • Direkte Veröffentlichung: Für einen schnellen Test kannst du eine der folgenden Optionen ausprobieren:
  • Cloud Console: Direkt in der Google Cloud Console veröffentlichen. Weitere Informationen finden Sie in der Pub/Sub-Dokumentation.
  • gcloud-Befehl: Führen Sie den folgenden Befehl aus:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. Clientschlüsselkonfiguration erstellen

Nachdem Sie die Voraussetzungen auf Google Cloud-Seite eingerichtet haben, können wir mit der Konfiguration auf SAP-Seite fortfahren.

Für die Authentifizierung und für die Konfiguration von Verbindungen verwendet das ABAP SDK for Google Cloud die Tabellen /GOOG/CLIENT_KEY und /GOOG/SERVIC_MAP..

Führen Sie die folgenden Schritte aus, um die Konfiguration in der Tabelle /GOOG/CLIENT_KEY zu verwalten:

  1. Geben Sie in der SAP-GUI den Transaktionscode SPRO ein.
  2. Klicken Sie auf SAP-Referenz-IMG.
  3. Klicken Sie auf ABAP SDK for Google Cloud > Grundlegende Einstellungen > Clientschlüssel konfigurieren.

25871e639293b9ee.png

  1. Behalten Sie die folgenden Werte für die Felder bei. Lassen Sie alle anderen Felder leer.

Feld

Wert

Google Cloud-Schlüsselname

PUBSUB_SUBSCRIBER

Name des Google Cloud-Dienstkontos

abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com

Google Cloud-Bereich

https://www.googleapis.com/auth/cloud-platform

Projekt-ID

abap-sdk-poc

Autorisierungsklasse

/GOOG/CL_AUTH_GOOGLE

8. ABAP-Bericht zum Empfangen von Nachrichten von Google Cloud Pub/Sub erstellen

  1. Melden Sie sich in Ihrem SAP-System an.
  2. Rufen Sie den Transaktionscode SE38 auf und erstellen Sie ein Berichtsprogramm mit dem Namen ZDEMO_RECEIVE_CPS_EVENTS..
  3. Geben Sie im Pop-up-Fenster die Details wie unten gezeigt ein und klicken Sie auf Speichern.

7c739236bedb5bf1.png

  1. Wählen Sie im nächsten Pop-up-Fenster entweder Lokales Objekt aus oder geben Sie einen Paketnamen an.
  2. Fügen Sie im ABAP-Editor den folgenden Code ein:
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. Speichern und aktivieren Sie den Bericht.
  2. Führen Sie den Bericht aus (F8).

Nach erfolgreicher Ausführung sollte die Berichtsausgabe wie unten dargestellt aussehen:

5b76e886ef79d0ba.png

9. ABAP-Pub/Sub-Abonnentencode

Im Grunde wird dieses ABAP-Programm als Nachrichtenabonnent in Google Cloud Pub/Sub eingebunden. Er prüft auf Anfrage ein bestimmtes Abo auf neue Nachrichten, verarbeitet sie und bestätigt dann ihren Empfang, um eine erneute Zustellung zu verhindern.

Das Programm führt die folgenden Aktivitäten aus:

Detaillierte Aufschlüsselung

Verbindung herstellen:

  • Er stellt mithilfe der Klasse /GOOG/CL_PUBSUB_V1 eine HTTP-Verbindung zum Google Cloud Pub/Sub-Dienst her.

Parameter festlegen:

  • Projekt-ID: Hier wird die entsprechende Projekt-ID extrahiert, in der sich das Pub/Sub-Abo befindet.
  • Aboname:Gibt den Namen des Abos an, aus dem Nachrichten abgerufen werden sollen (PUBSUB_DEMO_SUBSCRIPTION).
  • Message Limit: Legt die maximale Anzahl von Nachrichten fest, die in einem einzelnen API-Aufruf abgerufen werden sollen (in diesem Fall 1).

Nachrichten abrufen:

  • Ruft die Methode pull_subscriptions auf, um Nachrichten aus dem angegebenen Abo abzurufen.

Empfangene Nachrichten verarbeiten:

  • Wenn Nachrichten vorhanden sind, decodiert das Programm die Daten, protokolliert den Inhalt und sendet eine Bestätigung.

Nachrichten bestätigen:

  • Ruft die Methode acknowledge_subscriptions auf, um Pub/Sub eine Bestätigung über den erfolgreichen Empfang der Nachrichten zu senden. So wird verhindert, dass sie noch einmal ausgeliefert werden.

Erfolg/Fehler verarbeiten:

  • Es werden Erfolgsmeldungen angezeigt, wenn Nachrichten empfangen und bestätigt wurden, und Fehlermeldungen für verschiedene Fehlerszenarien (z. B. keine empfangenen Nachrichten oder API-Fehler).

Verbindung schließen:

  • Schließt die HTTP-Verbindung zum Pub/Sub-Dienst.

10. Glückwunsch

Sie haben das Codelab „Ereignisse mit dem ABAP SDK for Google Cloud von Cloud Pub/Sub empfangen“ erfolgreich abgeschlossen.

Sie haben eine Brücke zwischen ABAP und Google Cloud Pub/Sub erstellt. Sie haben das Codelab erfolgreich abgeschlossen und haben damit gezeigt, dass Sie mit ereignisgesteuerten Messaging-Funktionen vertraut sind und wissen, wie Sie das ABAP SDK for Google Cloud in Google Cloud-Dienste einbinden. Gut gemacht!

Sie haben eine neue Stufe der Integration zwischen ABAP und Google Cloud-Diensten erreicht. Mit diesen spannenden Optionen kannst du deinen Horizont erweitern:

  • Translation API mit ABAP SDK for Google Cloud verwenden
  • Große Objekte mithilfe von Chunking in einen Cloud Storage-Bucket hochladen
  • Anmeldedaten/Secrets mit dem ABAP SDK for Google Cloud aus Secret Manager abrufen
  • Vertex AI-Test-Bison aus ABAP aufrufen
  • BigQuery ML aus ABAP aufrufen

11. Bereinigen

Wenn Sie nicht mit den zusätzlichen Codelabs zum ABAP SDK for Google Cloud fortfahren möchten, fahren Sie mit der Bereinigung fort.

Projekt löschen

  • So löschen Sie das Google Cloud-Projekt:
gcloud projects delete abap-sdk-poc

Einzelne Ressourcen löschen

  1. Löschen Sie die Compute-Instanz:
gcloud compute instances delete abap-trial-docker
  1. Löschen Sie die Firewallregeln:
gcloud compute firewall-rules delete sapmachine
  1. Löschen Sie das Dienstkonto:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com