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
- Browser wie Chrome oder Firefox
- Ein Google Cloud-Projekt mit aktivierter Abrechnung oder ein kostenloses Testkonto für 90 Tage für die Google Cloud Platform erstellen
- SAP GUI (Windows oder Java) auf Ihrem System installiert Wenn die SAP GUI bereits auf Ihrem Laptop installiert ist, stellen Sie eine Verbindung zu SAP her, indem Sie die externe IP-Adresse der VM als IP-Adresse des Anwendungsservers verwenden. Wenn Sie einen Mac verwenden, können Sie auch die SAP GUI for Java installieren, die über diesen Link verfügbar ist.
3. Hinweis
- Wählen Sie in der Google Cloud Console auf der Seite „Projektauswahl“ ein Google Cloud-Projekt aus oder erstellen Sie ein solches Projekt (z. B.
abap-sdk-poc
). - Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist Überspringen Sie diesen Schritt, wenn Sie das Konto mit 90-tägigem kostenlosen Testzeitraum verwenden.
- Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird. Klicken Sie in der Cloud Console rechts oben auf Cloud Shell aktivieren:
- 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 Zoneus-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
- Im Rahmen des vorherigen Codelabs Ereignis an Pub/Sub senden müssen Sie bereits die Pub/Sub API aktiviert, das Thema erstellt und Nachrichten in Pub/Sub veröffentlicht haben.
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:
- 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"
- 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.
- 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.
- Pull-Anfrage: Ihr SAP-System (der Abonnent) verwendet die Pull-Methode, um Nachrichten vom Pub/Sub-Server anzufordern.
- 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.
- 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 vonPUBSUB_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:
- Geben Sie in der SAP-GUI den Transaktionscode SPRO ein.
- Klicken Sie auf SAP-Referenz-IMG.
- Klicken Sie auf ABAP SDK for Google Cloud > Grundlegende Einstellungen > Clientschlüssel konfigurieren.
- 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
- Melden Sie sich in Ihrem SAP-System an.
- Rufen Sie den Transaktionscode
SE38
auf und erstellen Sie ein Berichtsprogramm mit dem NamenZDEMO_RECEIVE_CPS_EVENTS.
. - Geben Sie im Pop-up-Fenster die Details wie unten gezeigt ein und klicken Sie auf Speichern.
- Wählen Sie im nächsten Pop-up-Fenster entweder Lokales Objekt aus oder geben Sie einen Paketnamen an.
- 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.
- Speichern und aktivieren Sie den Bericht.
- Führen Sie den Bericht aus (F8).
Nach erfolgreicher Ausführung sollte die Berichtsausgabe wie unten dargestellt aussehen:
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
- Löschen Sie die Compute-Instanz:
gcloud compute instances delete abap-trial-docker
- Löschen Sie die Firewallregeln:
gcloud compute firewall-rules delete sapmachine
- Löschen Sie das Dienstkonto:
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com