1. Introducción
En este codelab, se explica cómo recibir detalles de eventos de un tema de Google Cloud Pub/Sub con el SDK de ABAP para Google Cloud. Aprovecharemos los siguientes servicios de Google Cloud:
- Cloud Pub/Sub
- Cloud Shell
Requisitos previos
- Asegúrate de tener acceso a un sistema SAP con el SDK de ABAP para Google Cloud instalado.
- Puedes consultar el codelab "Install ABAP Platform Trial on Google Cloud Platform and Install ABAP SDK" para configurar un sistema nuevo.
- Creaste un tema
PUBSUB_DEMO_TOPIC
como parte del codelab " Envía eventos de SAP a Pub/Sub con el SDK de ABAP" en tu proyecto de Google Cloud. Si no se creó, usa el siguiente comando para crearla:
gcloud pubsub topics create PUBSUB_DEMO_TOPIC
Qué compilarás
Crearás lo siguiente:
- Una cuenta de servicio con permisos de "suscriptor" para interactuar con la API de Pub/Sub
- Un programa ABAP para recibir y confirmar mensajes de tu tema de Pub/Sub
2. Requisitos
- Navegadores, como Chrome o Firefox
- Un proyecto de Google Cloud con la facturación habilitada o crea una cuenta de prueba gratuita de 90 días para Google Cloud Platform.
- La GUI de SAP (Windows o Java) instalada en tu sistema Si SAP GUI ya está instalado en tu laptop, conéctate a SAP con la dirección IP externa de la VM como la IP del servidor de aplicaciones. Si usas Mac, también puedes instalar la GUI de SAP para Java disponible en este vínculo.
3. Antes de comenzar
- En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud (por ejemplo,
abap-sdk-poc
). - Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto. Omite este paso si usas la cuenta de prueba gratuita de 90 días.
- Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud. En la consola de Cloud, haz clic en Activar Cloud Shell en la esquina superior derecha:
- Ejecuta los siguientes comandos para autenticar tu cuenta y establecer el proyecto predeterminado en
abap-sdk-poc
. La zonaus-west4-b
se usa como ejemplo. Si es necesario, cambia el proyecto y la zona en los siguientes comandos según tus preferencias.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- Como parte del codelab anterior "Envía un evento a Pub/Sub", ya debes haber habilitado la API de Pub/Sub, creado el tema y publicado mensajes en Pub/Sub.
4. Crea una cuenta de servicio para acceder a Pub/Sub
Usar una cuenta de servicio con el rol Subscriber
es la forma más segura para que tu programa ABAP reciba mensajes de Pub/Sub. Este rol limita los permisos solo a la recuperación de mensajes, lo que evita posibles vulnerabilidades de seguridad.
Crea la cuenta de servicio
Para crear una cuenta de servicio con el rol requerido, sigue estos pasos:
- Ejecuta el siguiente comando en la terminal de Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- Ahora, agrega los roles necesarios a la cuenta de servicio que creaste en el paso anterior:
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'
El comando anterior usa abap-sdk-poc
como marcador de posición para el proyecto de Google Cloud. Reemplaza abap-sdk-poc
por el ID de tu proyecto.
- Para verificar que se haya agregado el rol, ve a la página IAM. La cuenta de servicio que creaste debería aparecer junto con el rol que se le asignó.
5. Información sobre las suscripciones de extracción
En el caso de una suscripción de extracción, tu sistema SAP actúa como cliente suscriptor y envía solicitudes a un servidor de Pub/Sub para recuperar mensajes. El cliente suscriptor usa la API de extracción de REST.
Métodos clave de la API
API de Google Cloud Pub/Sub
- pull: Inicia una solicitud para recuperar mensajes.
- acknowledge: Envía una señal a Pub/Sub para indicar que un mensaje se procesó correctamente.
Equivalentes del SDK de ABAP para Google Cloud
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
Flujo de mensajes para una suscripción de extracción
En la siguiente imagen, se muestra el flujo de trabajo entre un cliente suscriptor y una suscripción de extracción.
- Solicitud de extracción: Tu sistema SAP (el suscriptor) usa el método de extracción para solicitar mensajes del servidor de Pub/Sub.
- Respuesta de extracción: El servidor de Pub/Sub responde con cero o más mensajes y IDs de confirmación. Una respuesta con cero mensajes o con un error no indica necesariamente que no hay mensajes disponibles para recibir. Esta respuesta es PullResponse, como se muestra en la imagen.
- Confirmación: Después de procesar un mensaje, tu sistema SAP usa el método de confirmación junto con el ID de confirmación recibido. Esto evita que Pub/Sub vuelva a entregar el mensaje.
6. Cómo configurar tu suscripción y enviar mensajes
Crea una suscripción de extracción
- Ejecuta este comando de gcloud para crear una suscripción de extracción llamada
PUBSUB_DEMO_SUBSCRIPTION
que recibirá mensajes dePUBSUB_DEMO_TOPIC
:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
Publicar mensajes
Elige uno de estos métodos para enviar mensajes a PUBSUB_DEMO_TOPIC
:
- Reutiliza tu programa: Si tienes el programa de un codelab anterior para publicarlo, úsalo.
- Publicación directa: Para realizar una prueba rápida, prueba una de las siguientes opciones:
- Consola de Cloud: Publica directamente en la consola de Google Cloud. Para obtener más información, consulta la documentación de Pub/Sub.
- Comando de gcloud: Ejecuta el siguiente comando:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'
7. Crea la configuración de la clave de cliente
Ahora que configuraste los requisitos previos en Google Cloud, podemos continuar con la configuración en SAP.
En la configuración relacionada con la autenticación y la conectividad, el SDK de ABAP para Google Cloud usa las tablas /GOOG/CLIENT_KEY
y /GOOG/SERVIC_MAP.
.
Para mantener la configuración en la tabla /GOOG/CLIENT_KEY
, sigue estos pasos:
- En la GUI de SAP, ingresa el código de transacción SPRO.
- Haz clic en IMG de referencia de SAP.
- Haz clic en SDK de ABAP para Google Cloud > Configuración básica > Configurar clave de cliente.
- Mantén los siguientes valores en los campos. Deja todos los otros campos en blanco.
Campo | Valor |
Nombre de la clave de Google Cloud | PUBSUB_SUBSCRIBER |
Nombre de la cuenta de servicio de Google Cloud | abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com |
Permiso de Google Cloud | https://www.googleapis.com/auth/cloud-platform |
ID del proyecto | abap-sdk-poc |
Clase de autorización | /GOOG/CL_AUTH_GOOGLE |
8. Compila un informe de ABAP para recibir mensajes de Google Cloud Pub/Sub
- Accede a tu sistema SAP.
- Ve al código de transacción
SE38
y crea un programa de informes con el nombreZDEMO_RECEIVE_CPS_EVENTS.
- En la ventana emergente que se abre, proporciona los detalles como se muestra a continuación y haz clic en Guardar.
- En la siguiente ventana emergente, selecciona Local Object o proporciona un nombre de paquete según corresponda.
- En el editor de ABAP, agrega el siguiente código:
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.
- Guarda y activa el informe.
- Ejecuta el informe (F8).
Si la ejecución se realiza correctamente, deberías ver el resultado del informe como se muestra a continuación:
9. Explicación del código de suscriptor de Pub/Sub en ABAP
Básicamente, este programa ABAP se integra con Google Cloud Pub/Sub como suscriptor de mensajes. Verifica una suscripción especificada para detectar mensajes nuevos a pedido, los procesa y, luego, confirma su recepción para evitar que se vuelvan a entregar en el futuro.
El programa realizará las siguientes actividades:
Desglose paso a paso
Establece la conexión:
- Establece una conexión HTTP con el servicio de Google Cloud Pub/Sub a través de la clase
/GOOG/CL_PUBSUB_V1
.
Establecer parámetros:
- ID del proyecto: Extrae el ID del proyecto pertinente en el que reside la suscripción a Pub/Sub.
- Subscription Name: Especifica el nombre de la suscripción de la que se extraerán los mensajes (
PUBSUB_DEMO_SUBSCRIPTION
). - Límite de mensajes: Establece la cantidad máxima de mensajes que se recuperarán en una sola llamada a la API (en este caso, 1).
Recuperar mensajes:
- Llama al método
pull_subscriptions
para recuperar mensajes de la suscripción especificada.
Procesa los mensajes recibidos:
- Si existen mensajes, el programa decodifica los datos, registra el contenido y envía una confirmación.
Confirmar recepción de mensajes:
- Llama al método
acknowledge_subscriptions
para enviar una confirmación a Pub/Sub que indique la recepción correcta de los mensajes. Esto evita que se vuelvan a enviar.
Controla los errores y los casos de éxito:
- Proporciona mensajes de éxito si se reciben y confirman los mensajes, y muestra mensajes de error para diversas situaciones de falla (no se reciben mensajes, errores de API, etcétera).
Cerrar conexión:
- Cierra la conexión HTTP al servicio de Pub/Sub.
10. Felicitaciones
¡Excelente trabajo por completar el Codelab "Recibe un evento de Cloud Pub/Sub con el SDK de ABAP para Google Cloud"!
Creaste correctamente un puente entre ABAP y Google Cloud Pub/Sub. Completar el codelab demuestra que tienes un conocimiento sólido de la mensajería controlada por eventos y de cómo usar el SDK de ABAP para Google Cloud para realizar integraciones con los servicios de Google Cloud. ¡Bien hecho!
Desbloqueaste un nuevo nivel de integración entre ABAP y los servicios de Google Cloud. Expande tus horizontes con estas emocionantes opciones:
- Usa la API de Translation con el SDK de ABAP para Google Cloud
- Sube un objeto grande a un bucket de Cloud Storage con fragmentación
- Cómo recuperar credenciales o secretos de Secret Manager con el SDK de ABAP para Google Cloud
- Llama a test-bison de Vertex AI desde ABAP
- Llama a BigQuery ML desde ABAP
11. Limpia
Si no deseas continuar con los codelabs adicionales relacionados con el SDK de ABAP para Google Cloud, continúa con la limpieza.
Borra el proyecto
- Borra el proyecto de Google Cloud:
gcloud projects delete abap-sdk-poc
Borra recursos individuales
- Borra la instancia de procesamiento:
gcloud compute instances delete abap-trial-docker
- Borra las reglas de firewall:
gcloud compute firewall-rules delete sapmachine
- Borra la cuenta de servicio:
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com