1. Introducción
En este codelab, se te guiará para recibir detalles de eventos de un tema de Pub/Sub de Google Cloud 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 crearlo:
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.
- GUI de SAP (Windows o Java) instalada en tu sistema Si la GUI de SAP ya está instalada 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
. Se usa la zonaus-west4-b
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 el acceso 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 creada 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 en la lista 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 el cliente suscriptor y, luego, inicia solicitudes a un servidor de Pub/Sub para recuperar mensajes. El cliente suscriptor usa la API de REST Pull.
Métodos clave de la API
API de Google Cloud Pub/Sub
- pull: Inicia una solicitud para recuperar mensajes.
- acknowledge: Indica a Pub/Sub que un mensaje se procesó correctamente.
Equivalencias 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 de recepción. Una respuesta con cero mensajes o con un error no indica necesariamente que no hay mensajes disponibles para recibir. Esta respuesta es la 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
Cómo crear 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
Cómo publicar mensajes
Elige uno de estos métodos para enviar mensajes a PUBSUB_DEMO_TOPIC
:
- Vuelve a usar 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 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 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 Objeto local 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 de ABAP
En esencia, este programa de ABAP se integra a Google Cloud Pub/Sub como suscriptor de mensajes. Verifica una suscripción especificada en busca de 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 mediante la clase
/GOOG/CL_PUBSUB_V1
.
Establece parámetros:
- ID del proyecto: Extrae el ID de proyecto relevante en el que reside la suscripción a Pub/Sub.
- Nombre de la suscripción: Especifica el nombre de la suscripción desde la que se extraen 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).
Obtener 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.
Mensajes de acuse de recibo:
- Llama al método
acknowledge_subscriptions
para enviar una confirmación a Pub/Sub que indique que se recibieron correctamente los mensajes. Esto evita que se vuelvan a entregar.
Cómo controlar el éxito o los errores:
- Proporciona mensajes de éxito si se reciben y confirman los mensajes, y muestra mensajes de error para varias situaciones de fallas (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 completando 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. Si completaste el codelab, demuestras que tienes un conocimiento sólido de los mensajes basados en eventos y cómo usar el SDK de ABAP para Google Cloud para integrarlo 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:
- Cómo usar la API de Translation con el SDK de ABAP para Google Cloud
- Sube un objeto grande a un bucket de Cloud Storage con la 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
Cómo borrar 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