Ricevi un evento da Cloud Pub/Sub in SAP utilizzando l'SDK ABAP per Google Cloud

1. Introduzione

Questo codelab ti guida nella ricezione dei dettagli degli eventi da un argomento Google Cloud Pub/Sub utilizzando l'ABAP SDK for Google Cloud. Utilizzeremo i seguenti servizi Google Cloud:

  • Cloud Pub/Sub
  • Cloud Shell

Prerequisiti

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Cosa creerai

Creerai quanto segue:

  • Un service account con autorizzazioni "Sottoscrittore" per interagire con l'API Pub/Sub.
  • Un programma ABAP per ricevere e confermare i messaggi dall'argomento Pub/Sub.

2. Requisiti

  • Browser, ad esempio Chrome o Firefox.
  • Un progetto Google Cloud con la fatturazione abilitata o crea un account di prova senza costi di 90 giorni per Google Cloud.
  • GUI SAP (Windows o Java) installata nel sistema. Se SAP GUI è già installato sul tuo laptop, connettiti a SAP utilizzando l'indirizzo IP esterno della VM come IP del server applicazioni. Se utilizzi Mac, puoi anche installare SAP GUI per Java disponibile in questo link.

3. Prima di iniziare

6757b2fb50ddcc2d.png

  • Esegui questi comandi per autenticarti per il tuo account e impostare il progetto predefinito su abap-sdk-poc. La zona us-west4-b viene utilizzata come esempio. Se necessario, modifica il progetto e la zona nei seguenti comandi in base alle tue preferenze.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. Crea un service account per l'accesso a Pub/Sub

L'utilizzo di un service account con il ruolo Subscriber è il modo più sicuro per il tuo programma ABAP di ricevere messaggi da Pub/Sub. Questo ruolo limita le autorizzazioni al solo recupero dei messaggi, evitando potenziali vulnerabilità della sicurezza.

Crea l'account di servizio

Per creare un service account con il ruolo richiesto, segui questi passaggi:

  1. Esegui questo comando nel terminale Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. Ora aggiungi i ruoli richiesti al service account creato nel passaggio precedente:
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'

Il comando precedente utilizza abap-sdk-poc come segnaposto per il progetto Google Cloud. Sostituisci abap-sdk-poc con l'ID progetto.

  1. Per verificare che il ruolo sia stato aggiunto, vai alla pagina IAM. Il service account che hai creato dovrebbe essere elencato insieme al ruolo che gli è stato assegnato.

5. Informazioni sulle sottoscrizioni al pull

Per una sottoscrizione pull, il sistema SAP funge da client sottoscrittore e avvia richieste a un server Pub/Sub per recuperare i messaggi. Il client sottoscrittore utilizza l'API REST Pull.

Metodi API chiave

API Google Cloud Pub/Sub

  • pull: avvia una richiesta per recuperare i messaggi.
  • acknowledge: segnala a Pub/Sub che un messaggio è stato elaborato correttamente.

ABAP SDK for Google Cloud Equivalents

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

Flusso di messaggi per una sottoscrizione pull

La seguente immagine mostra il flusso di lavoro tra un client sottoscrittore e una sottoscrizione pull.

f0fc44265192f348.png

  1. Richiesta pull:il sistema SAP (il sottoscrittore) utilizza il metodo pull per richiedere i messaggi dal server Pub/Sub.
  2. Risposta pull: il server Pub/Sub risponde con zero o più messaggi e ID di riconoscimento. Una risposta con zero messaggi o con un errore non indica necessariamente che non sono disponibili messaggi da ricevere. Questa risposta è PullResponse, come mostrato nell'immagine.
  3. Riconoscimento:dopo aver elaborato un messaggio, il sistema SAP utilizza il metodo di riconoscimento insieme all'ID di riconoscimento ricevuto. In questo modo, Pub/Sub non invia nuovamente il messaggio.

6. Configurare l'abbonamento e inviare messaggi

Creare una sottoscrizione pull

  • Esegui questo comando gcloud per creare una sottoscrizione pull denominata PUBSUB_DEMO_SUBSCRIPTION che riceverà messaggi da PUBSUB_DEMO_TOPIC:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Pubblica messaggi

Scegli uno di questi metodi per inviare messaggi a PUBSUB_DEMO_TOPIC:

  • Riutilizza il tuo programma:se hai il programma di un codelab precedente per la pubblicazione, utilizzalo.
  • Pubblicazione diretta: per un test rapido, prova una delle seguenti opzioni:
  • Console Cloud: pubblica direttamente nella console Google Cloud. Per maggiori dettagli, consulta la documentazione di Pub/Sub.
  • Comando gcloud: esegui questo comando:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. Crea la configurazione della chiave client

Ora che hai configurato i prerequisiti lato Google Cloud, possiamo procedere con la configurazione lato SAP.

Per la configurazione relativa all'autenticazione e alla connettività, l'ABAP SDK for Google Cloud utilizza le tabelle /GOOG/CLIENT_KEY e /GOOG/SERVIC_MAP..

Per mantenere la configurazione nella tabella /GOOG/CLIENT_KEY, segui questi passaggi:

  1. Nella GUI SAP, inserisci il codice transazione SPRO.
  2. Fai clic su SAP Reference IMG.
  3. Fai clic su ABAP SDK for Google Cloud > Impostazioni di base > Configura chiave client.

25871e639293b9ee.png

  1. Mantieni i seguenti valori nei campi. Lascia vuoti tutti gli altri campi.

Campo

Valore

Nome della chiave Google Cloud

PUBSUB_SUBSCRIBER

Nome dell'account di servizio Google Cloud

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

Ambito Google Cloud

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

ID progetto

abap-sdk-poc

Authorization Class

/GOOG/CL_AUTH_GOOGLE

8. Crea un report ABAP per ricevere messaggi da Google Cloud Pub/Sub

  1. Accedi al tuo sistema SAP.
  2. Vai al codice transazione SE38 e crea un programma di report con il nome ZDEMO_RECEIVE_CPS_EVENTS.
  3. Nel popup visualizzato, fornisci i dettagli come mostrato di seguito e fai clic su Salva.

7c739236bedb5bf1.png

  1. Nel popup successivo, seleziona Oggetto locale o fornisci un nome di pacchetto, a seconda dei casi.
  2. Nell'editor ABAP, aggiungi il seguente codice:
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. Salva e attiva il report.
  2. Esegui il report (F8).

Se l'esecuzione va a buon fine, dovresti visualizzare l'output del report come mostrato di seguito:

5b76e886ef79d0ba.png

9. Spiegazione del codice del sottoscrittore ABAP Pub/Sub

In sostanza, questo programma ABAP si integra con Google Cloud Pub/Sub come sottoscrittore di messaggi. Controlla una sottoscrizione specificata per rilevare nuovi messaggi on demand, li elabora e poi conferma la ricezione per evitare future riconsegne.

Il programma svolgerà le seguenti attività:

Analisi passo passo

Stabilisci la connessione:

  • Stabilisce una connessione HTTP al servizio Google Cloud Pub/Sub utilizzando la classe /GOOG/CL_PUBSUB_V1.

Set Parameters:

  • ID progetto: estrae l'ID progetto pertinente in cui si trova l'abbonamento Pub/Sub.
  • Nome abbonamento:specifica il nome dell'abbonamento da cui estrarre i messaggi (PUBSUB_DEMO_SUBSCRIPTION).
  • Limite di messaggi: imposta il numero massimo di messaggi da recuperare in una singola chiamata API (in questo caso, 1).

Recupera messaggi:

  • Chiama il metodo pull_subscriptions per recuperare i messaggi dalla sottoscrizione specificata.

Elabora messaggi ricevuti:

  • Se esistono messaggi, il programma decodifica i dati, registra i contenuti e invia una conferma.

Riconoscimento dei messaggi:

  • Chiama il metodo acknowledge_subscriptions per inviare un riconoscimento a Pub/Sub che indica la ricezione corretta dei messaggi. In questo modo, non verranno inviati di nuovo.

Gestisci esito positivo/errori:

  • Fornisce messaggi di successo se i messaggi vengono ricevuti e confermati e mostra messaggi di errore per vari scenari di errore (nessun messaggio ricevuto, errori API e così via).

Chiudi connessione:

  • Chiude la connessione HTTP al servizio Pub/Sub.

10. Complimenti

Ottimo lavoro per aver completato il Codelab "Ricevere un evento da Cloud Pub/Sub utilizzando l'SDK ABAP per Google Cloud".

Hai creato correttamente un ponte tra ABAP e Google Cloud Pub/Sub. Il completamento del codelab dimostra una solida comprensione della messaggistica basata su eventi e di come utilizzare l'SDK ABAP per Google Cloud per l'integrazione con i servizi Google Cloud. Ben fatto!

Hai sbloccato un nuovo livello di integrazione tra ABAP e i servizi Google Cloud. Amplia i tuoi orizzonti con queste entusiasmanti opzioni:

  • Utilizzo dell'API Translation con ABAP SDK for Google Cloud
  • Caricare un oggetto di grandi dimensioni in un bucket Cloud Storage utilizzando la suddivisione in blocchi
  • Recuperare credenziali/secret da Secret Manager con ABAP SDK for Google Cloud
  • Chiamare Vertex AI test-bison da ABAP
  • Chiamare BigQuery ML da ABAP

11. Esegui la pulizia

Se non vuoi continuare con i codelab aggiuntivi relativi all'SDK ABAP per Google Cloud, procedi con la pulizia.

Elimina il progetto

  • Elimina il progetto Google Cloud:
gcloud projects delete abap-sdk-poc

Eliminare singole risorse

  1. Elimina l'istanza di calcolo:
gcloud compute instances delete abap-trial-docker
  1. Elimina le regole firewall:
gcloud compute firewall-rules delete sapmachine
  1. Elimina il account di servizio:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com