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 Ereignisdetails aus einem Google Cloud Pub/Sub-Thema mit dem ABAP SDK for Google Cloud empfangen. Wir nutzen die folgenden Google Cloud-Dienste:

  • Cloud Pub/Sub
  • Cloud Shell

Vorbereitung

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Aufgaben

Sie erstellen Folgendes:

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

2. Voraussetzungen

  • Browser wie Chrome oder Firefox.
  • Ein Google Cloud-Projekt mit aktivierter Abrechnung oder ein kostenloses 90‑Tage-Testkonto für die Google Cloud Platform.
  • SAP GUI (Windows oder Java) ist auf Ihrem System installiert. Wenn SAP GUI bereits auf Ihrem Laptop installiert ist, stellen Sie eine Verbindung zu SAP her und verwenden Sie dabei die externe IP-Adresse der VM als IP-Adresse des Anwendungsservers. Wenn Sie einen Mac verwenden, können Sie auch die SAP GUI für Java installieren, die über diesen Link verfügbar ist.

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 die 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 Pub/Sub-Zugriff erstellen

Die Verwendung eines Dienstkontos mit der Rolle Subscriber ist die sicherste Methode, damit Ihr ABAP-Programm Nachrichten von Pub/Sub empfangen kann. Diese Rolle beschränkt die Berechtigungen auf das Abrufen von Nachrichten und verhindert so potenzielle Sicherheitslücken.

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 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 ihm 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: Initiiert eine Anfrage zum Abrufen von Nachrichten.
  • Bestätigen: Signalisiert Pub/Sub, dass eine Nachricht erfolgreich verarbeitet wurde.

Entsprechungen im 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 mit null 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

Wählen Sie eine dieser Methoden aus, um Nachrichten an PUBSUB_DEMO_TOPIC zu senden:

  • Programm wiederverwenden:Wenn Sie das Programm aus einem früheren Codelab für die Veröffentlichung haben, verwenden Sie es.
  • Direkte Veröffentlichung: Für einen schnellen Test können Sie eine der folgenden Optionen ausprobieren:
  • Cloud Console: Sie können 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 Sie mit der Konfiguration auf SAP-Seite fortfahren.

Zur 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. Geben Sie die folgenden Werte für die Felder an. 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 erstellen, um Nachrichten von Google Cloud Pub/Sub zu empfangen

  1. Melden Sie sich in Ihrem SAP-System an.
  2. Gehen Sie zum Transaktionscode SE38 und erstellen Sie ein Berichtsprogramm mit dem Namen ZDEMO_RECEIVE_CPS_EVENTS..
  3. Geben Sie im Pop-up-Fenster, das sich öffnet, die unten gezeigten Details 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 hinzu:
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).

Bei erfolgreicher Ausführung sollte die Berichtsausgabe so aussehen:

5b76e886ef79d0ba.png

9. ABAP-Code für Pub/Sub-Abonnenten

Im Grunde wird in diesem ABAP-Programm Google Cloud Pub/Sub als Nachrichtenabonnent eingebunden. Es prüft ein angegebenes Abo bei Bedarf auf neue Nachrichten, verarbeitet sie und bestätigt dann ihren Empfang, um eine zukünftige erneute Zustellung zu verhindern.

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

Schritt-für-Schritt-Aufschlüsselung

Verbindung herstellen:

  • Es wird eine HTTP-Verbindung zum Google Cloud Pub/Sub-Dienst über die Klasse /GOOG/CL_PUBSUB_V1 hergestellt.

Parameter festlegen:

  • Projekt-ID: Extrahiert die relevante Projekt-ID, 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 (Nachrichtenlimit): Legt die maximale Anzahl der 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 eine Bestätigung an Pub/Sub zu senden, dass die Nachrichten erfolgreich empfangen wurden. So wird verhindert, dass sie noch einmal zugestellt werden.

Erfolg/Fehler behandeln:

  • Zeigt Erfolgsmeldungen an, wenn Nachrichten empfangen und bestätigt werden, und Fehlermeldungen für verschiedene Fehlerszenarien (keine Nachrichten empfangen, API-Fehler usw.).

Verbindung schließen:

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

10. Glückwunsch

Herzlichen Glückwunsch zum Abschluss des Codelabs „Ereignis von Cloud Pub/Sub mit dem ABAP SDK for Google Cloud empfangen“!

Sie haben erfolgreich eine Brücke zwischen ABAP und Google Cloud Pub/Sub erstellt. Durch die Teilnahme am Codelab haben Sie gezeigt, dass Sie sich gut mit ereignisgesteuerten Nachrichten auskennen und wissen, wie Sie das ABAP SDK for Google Cloud verwenden, um Google Cloud-Dienste zu integrieren. Gut gemacht!

Sie haben eine neue Integrationsstufe zwischen ABAP und Google Cloud-Diensten erreicht. Mit diesen spannenden Optionen können Sie Ihren Horizont erweitern:

  • Translation API mit dem ABAP SDK for Google Cloud verwenden
  • Großes Objekt mithilfe von Chunking in einen Cloud Storage-Bucket hochladen
  • Anmeldedaten/Secrets aus Secret Manager mit dem ABAP SDK for Google Cloud abrufen
  • Vertex AI test-bison über 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 dem Bereinigen fort.

Projekt löschen

  • Google Cloud-Projekt löschen:
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