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
- Prüfen Sie, ob Sie Zugriff auf ein SAP-System haben, in dem das ABAP SDK for Google Cloud installiert ist.
- Im Codelab Install ABAP Platform Trial on Google Cloud Platform and Install ABAP SDK (ABAP-Plattform-Testversion auf Google Cloud Platform installieren und ABAP SDK installieren) finden Sie Informationen zum Einrichten eines neuen Systems.
- Sie haben im Rahmen des Codelabs Ereignisse von SAP mit dem ABAP SDK an Pub/Sub senden in Ihrem Google Cloud-Projekt das Thema
PUBSUB_DEMO_TOPIC
erstellt. Wenn sie nicht erstellt wurde, verwenden Sie den folgenden Befehl, um sie zu erstellen:
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
- Wählen Sie in der Google Cloud Console auf der Seite zur Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines (z. B.
abap-sdk-poc
). - Prüfen Sie, ob für Ihr Cloud-Projekt die Abrechnung aktiviert ist. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist. Überspringen Sie diesen Schritt, wenn Sie das 90‑Tage-Testkonto 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 die 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 vorherigen Codelab Ereignis an Pub/Sub senden haben Sie bereits die Pub/Sub API aktiviert, das Thema erstellt und Nachrichten in Pub/Sub veröffentlicht.
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:
- 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 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 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.
- 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 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.
- 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
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:
- 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.
- 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
- Melden Sie sich in Ihrem SAP-System an.
- Gehen Sie zum Transaktionscode
SE38
und erstellen Sie ein Berichtsprogramm mit dem NamenZDEMO_RECEIVE_CPS_EVENTS.
. - Geben Sie im Pop-up-Fenster, das sich öffnet, die unten gezeigten Details 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 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.
- Speichern und aktivieren Sie den Bericht.
- Führen Sie den Bericht aus (F8).
Bei erfolgreicher Ausführung sollte die Berichtsausgabe so aussehen:
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
- 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