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
- Assicurati di avere accesso a un sistema SAP con l'SDK ABAP per Google Cloud installato.
- Per configurare un nuovo sistema, puoi consultare il codelab "Install ABAP Platform Trial on Google Cloud Platform and Install ABAP SDK".
- Hai creato un argomento
PUBSUB_DEMO_TOPIC
nell'ambito del Codelab "Invia eventi da SAP a Pub/Sub utilizzando l'SDK ABAP" nel tuo progetto Google Cloud. Se non è stato creato, utilizza il comando seguente per crearlo:
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
- Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud (ad esempio
abap-sdk-poc
). - Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è attivata per un progetto. Ignora questo passaggio se utilizzi l'account per la prova senza costi di 90 giorni.
- Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud. In Cloud Console, fai clic su Attiva Cloud Shell nell'angolo in alto a destra:
- Esegui i seguenti comandi per autenticarti per il tuo account e impostare il progetto predefinito su
abap-sdk-poc
. La zonaus-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
- Nell'ambito del codelab precedente "Invia evento a Pub/Sub", devi aver già abilitato l'API Pub/Sub, creato l'argomento e pubblicato i messaggi in Pub/Sub.
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:
- Esegui questo comando nel terminale Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- 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.
- 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.
- Richiesta pull: il sistema SAP (l'abbonato) utilizza il metodo pull per richiedere i messaggi dal server Pub/Sub.
- 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.
- 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 daPUBSUB_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:
- In SAP GUI, inserisci il codice transazione SPRO.
- Fai clic su SAP Reference IMG (Immagine di riferimento SAP).
- Fai clic su ABAP SDK for Google Cloud > Impostazioni di base > Configura chiave client.
- 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
- Accedi al sistema SAP.
- Vai al codice transazione
SE38
e crea un programma report con il nomeZDEMO_RECEIVE_CPS_EVENTS.
- Nella finestra popup visualizzata, fornisci i dettagli come mostrato di seguito e fai clic su Salva.
- Nel popup successivo, seleziona Oggetto locale o fornisci un nome del pacchetto, a seconda dei casi.
- 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.
- Salva e attiva il report.
- Esegui il report (F8).
Al termine dell'esecuzione, dovresti vedere l'output del report come mostrato di seguito:
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
- Elimina l'istanza di calcolo:
gcloud compute instances delete abap-trial-docker
- Elimina le regole firewall:
gcloud compute firewall-rules delete sapmachine
- Elimina l'account di servizio:
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com