Recibe un evento de Cloud Pub/Sub en SAP con el SDK de ABAP para Google Cloud

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

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

6757b2fb50ddcc2d.png

  • Ejecuta los siguientes comandos para autenticar tu cuenta y establecer el proyecto predeterminado en abap-sdk-poc. Se usa la zona us-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

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:

  1. 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"
  1. 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.

  1. 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.

f0fc44265192f348.png

  1. Solicitud de extracción: Tu sistema SAP (el suscriptor) usa el método de extracción para solicitar mensajes del servidor de Pub/Sub.
  2. 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.
  3. 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 de PUBSUB_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:

  1. En la GUI de SAP, ingresa el código de transacción SPRO.
  2. Haz clic en IMG de referencia de SAP.
  3. Haz clic en SDK de ABAP para Google Cloud > Configuración básica > Configurar clave de cliente.

25871e639293b9ee.png

  1. 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

  1. Accede a tu sistema SAP.
  2. Ve al código de transacción SE38 y crea un programa de informes con el nombre ZDEMO_RECEIVE_CPS_EVENTS..
  3. En la ventana emergente que se abre, proporciona los detalles como se muestra a continuación y haz clic en Guardar.

7c739236bedb5bf1.png

  1. En la siguiente ventana emergente, selecciona Objeto local o proporciona un nombre de paquete según corresponda.
  2. 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.
  1. Guarda y activa el informe.
  2. Ejecuta el informe (F8).

Si la ejecución se realiza correctamente, deberías ver el resultado del informe como se muestra a continuación:

5b76e886ef79d0ba.png

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

  1. Borra la instancia de procesamiento:
gcloud compute instances delete abap-trial-docker
  1. Borra las reglas de firewall:
gcloud compute firewall-rules delete sapmachine
  1. Borra la cuenta de servicio:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com