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'SDK ABAP per Google Cloud. Sfrutteremo i seguenti servizi Google Cloud:

  • Cloud Pub/Sub
  • Cloud Shell

Prerequisiti

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Cosa creerai

Dovrai creare quanto segue:

  • Un account di servizio con autorizzazioni "Abbonato" 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 la piattaforma Google Cloud.
  • SAP GUI (Windows o Java) installato nel sistema. Se SAP GUI è già installato sul tuo laptop, connettiti a SAP utilizzando l'indirizzo IP esterno della VM come indirizzo IP del server di applicazioni. Se utilizzi un Mac, puoi anche installare SAP GUI per Java disponibile in questo link.

3. Prima di iniziare

6757b2fb50ddcc2d.png

  • Esegui i seguenti 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 comandi seguenti 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 account di servizio per l'accesso a Pub/Sub

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

Crea l'account di servizio

Per creare un account di servizio con il ruolo richiesto, svolgi i seguenti 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 all'account di servizio 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 riportato sopra utilizza abap-sdk-poc come segnaposto per il progetto Google Cloud. Sostituisci abap-sdk-poc con l'ID del tuo progetto.

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

5. Informazioni sulle sottoscrizioni pull

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

Metodi API principali

API Google Cloud Pub/Sub

  • pull: avvia una richiesta di recupero dei messaggi.
  • acknowledge: indica a Pub/Sub che un messaggio è stato elaborato correttamente.

Equivalenti di ABAP SDK for Google Cloud

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

Flusso di messaggi per una sottoscrizione pull

L'immagine seguente mostra il flusso di lavoro tra un client sottoscrittore e un abbonamento pull.

f0fc44265192f348.png

  1. Richiesta pull: il sistema SAP (l'abbonato) 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 conferma. Una risposta con zero messaggi o con un errore non indica necessariamente che non sono disponibili messaggi da ricevere. Questa risposta è la PullResponse mostrata nell'immagine.
  3. Acknowledgement: dopo aver elaborato un messaggio, il sistema SAP utilizza il metodo di conferma insieme all'ID di conferma ricevuto. In questo modo, Pub/Sub non recapita 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à i messaggi da PUBSUB_DEMO_TOPIC:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Pubblicare messaggi

Scegli uno di questi metodi per inviare messaggi a PUBSUB_DEMO_TOPIC:

  • Riutilizza il programma:se hai il programma di un codelab precedente per la pubblicazione, utilizzalo.
  • Pubblicazione diretta: per un test rapido, prova una delle seguenti opzioni:
  • Cloud Console: pubblica direttamente nella console Google Cloud. Per maggiori dettagli, consulta la documentazione di Pub/Sub.
  • Comando gcloud: esegui il seguente 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. In SAP GUI, inserisci il codice transazione SPRO.
  2. Fai clic su SAP Reference IMG (Immagine di riferimento SAP).
  3. Fai clic su ABAP SDK for Google Cloud > Impostazioni di base > Configura chiave client.

25871e639293b9ee.png

  1. Mantieni i seguenti valori per i 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

Classe di autorizzazione

/GOOG/CL_AUTH_GOOGLE

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

  1. Accedi al sistema SAP.
  2. Vai al codice transazione SE38 e crea un programma report con il nome ZDEMO_RECEIVE_CPS_EVENTS.
  3. Nella finestra popup visualizzata, 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 del 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).

Al termine dell'esecuzione, dovresti vedere l'output del report come mostrato di seguito:

5b76e886ef79d0ba.png

9. Spiegazione del codice sottoscrittore Pub/Sub ABAP

In sostanza, questo programma ABAP si integra con Google Cloud Pub/Sub come sottoscrittore di messaggi. Controlla su un abbonamento specificato la presenza di nuovi messaggi su richiesta, li elabora e poi ne conferma la ricezione per evitare un'eventuale nuova consegna in futuro.

Il programma svolgerà le seguenti attività:

Analisi dettagliata passo passo

Stabilisci connessione:

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

Imposta i parametri:

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

Recupero messaggi:

  • Chiama il metodo pull_subscriptions per recuperare i messaggi dall'abbonamento specificato.

Elabora i messaggi ricevuti:

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

Acknowledge Messages:

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

Gestisci stato riuscito/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 dell'API e così via).

Chiudi connessione:

  • Chiude la connessione HTTP al servizio Pub/Sub.

10. Complimenti

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

Hai creato un collegamento tra ABAP e Google Cloud Pub/Sub. Il completamento del codelab dimostra una solida conoscenza 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 interessanti opzioni:

  • Utilizzo dell'API Translation con l'SDK ABAP per Google Cloud
  • Caricare un oggetto di grandi dimensioni in un bucket Cloud Storage utilizzando il chunking
  • Recupero delle credenziali/degli secret da Secret Manager con l'SDK ABAP per Google Cloud
  • Chiama 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 l'account di servizio:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com