Sube un archivo a Cloud Storage con fragmentación

1. Introducción

En este codelab, enumeramos los pasos para crear una cuenta de servicio y usarla para configurar la clave del cliente y la tabla de asignación de comunicación que proporciona el SDK de ABAP para Google Cloud, y para invocar la API de JSON de Cloud Storage en ABAP.

En este codelab, se usan los siguientes servicios de Google Cloud:

  • Compute Engine
  • Servicios de red
  • Cloud Shell
  • API de Cloud Storage JSON V1

Nota: Cuando creas un proyecto nuevo de Google Cloud, se habilitan automáticamente un conjunto específico de APIs y servicios, incluido Cloud Storage. Esto garantiza que puedas aprovechar de inmediato esta sólida solución de almacenamiento. Por lo tanto, no es necesario que lo habilites como un paso adicional.

Requisitos previos

Qué compilarás

Crearás los siguientes programas en tu sistema SAP con el SDK de ABAP para Google Cloud

  • Cree un bucket de Cloud Storage.
  • Leer un archivo del servidor de aplicaciones y subirlo al bucket de Cloud Storage creado

2. Requisitos

  • Un navegador, 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

6757b2fb50ddcc2d.png

  • Ejecuta los siguientes comandos para autenticar tu cuenta y establecer el proyecto predeterminado en abap-sdk-poc. La zona us-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
  • Debes tener acceso a un sistema SAP con el SDK de ABAP para Google Cloud instalado.
  • Antes de continuar con este codelab, debes completar el codelab 1 (Instala la versión de prueba de la plataforma ABAP 1909 en Google Cloud Platform y el SDK de ABAP para Google Cloud) y el codelab 2 (Configura la autenticación del SDK de ABAP con tokens para SAP alojado en la VM de Compute Engine).
  • Si completaste los codelabs 1 y 2, se te habrá aprovisionado un sistema de prueba de la plataforma ABAP 1909 en Google Cloud, junto con la configuración necesaria para la autenticación y la conectividad.
  • Si no completaste los codelabs 1 y 2, no tendrás toda la infraestructura y la conectividad necesarias para realizar los pasos que se proporcionan en este codelab. Por lo tanto, debes completar el codelab 1 y el codelab 2 antes de continuar con este codelab.

4. Crea una cuenta de servicio con el rol de Usuario de objetos de almacenamiento

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-storage-tester \
--display-name="Service Account for Cloud Storage"
  1. 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-storage-tester@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/storage.objectUser'

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 junto con el rol que se le asignó, como se muestra a continuación:

92d75ce1554efb69.png

5. 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 la tabla /GOOG/CLIENT_KEY.

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.
  4. Mantén los siguientes valores en los campos:

Campo

Valor

Nombre de la clave de Google Cloud

TEST_STORAGE

Nombre de la cuenta de servicio de Google Cloud

abap-sdk-storage-tester@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

Deja todos los demás campos en blanco.

6. Crea un Z-Report para crear un bucket en Cloud Storage

  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_CREATE_BUCKET..
  3. En la ventana emergente que se abre, proporciona los detalles que se muestran a continuación:

93f3edb7bbb5c3c4.png

En la siguiente ventana emergente, selecciona Objeto local o Proporciona un nombre de paquete según tu elección.

  1. En el editor de ABAP, agrega el siguiente código:
DATA lv_json_response TYPE string.
DATA ls_input         TYPE /goog/cl_storage_v1=>ty_001.
DATA lo_storage       TYPE REF TO /goog/cl_storage_v1.

TRY.

    lo_storage = NEW #( iv_key_name = 'TEST_STORAGE' ).
        
        " Bucket Name should be globally unique & permanent
    ls_input = VALUE #( name = 'newtest_bucket_abapsdk_gcloud001' ).  
    lo_storage->insert_buckets
                ( EXPORTING iv_q_project = CONV #( lo_storage->gv_project_id )
                    is_input     = ls_input
          IMPORTING es_raw       = lv_json_response
                    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_storage->is_success( lv_ret_code ) = abap_true.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Bucket was created:'
        )->next_section( 'JSON Response:'
        )->write_json( lv_json_response
        )->display( ).

    ELSE.
      DATA(lv_msg) = lv_ret_code && ':' && lv_err_text.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Bucket creation failed;'
        )->next_section( 'Error:'
        )->write_json( lv_msg
        )->display( ).
    ENDIF.

  CATCH /goog/cx_sdk INTO DATA(lo_sdk_excp).
    lv_msg = lo_sdk_excp->get_text( ).
    MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
 

Ten en cuenta que, si el nombre del bucket no es único a nivel global, no se creará el bucket. Por lo tanto, intenta usar un nombre único para el bucket antes de ejecutar el código.

  1. Guarda y activa el informe.
  2. Ejecuta el informe (presiona F8).

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

ff232fba9a4178fb.png

7. Crea un informe Z para leer un archivo del servidor de aplicaciones y subirlo al bucket de Cloud Storage

Antes de realizar esta actividad, debes preparar un archivo de texto grande. Aquí ya tenemos un archivo de texto grande creado y subido a nuestro servidor de aplicaciones. Puedes usar el código de transacción CG3Z para subir un archivo al servidor de aplicaciones de tu sistema SAP.

En este ejemplo, usamos un archivo de texto de aproximadamente 40 MB, que ya se subió al servidor de aplicaciones en el directorio /tmp.

También puedes descargar esta carpeta de GitHub con el siguiente vínculo: Archivo de muestra

  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_UPLOAD_FILE..
  3. En la ventana emergente que se abre, proporciona los detalles que se muestran a continuación:

19cbe6987bba58e4.png

En la siguiente ventana emergente, selecciona Objeto local o Proporciona un nombre de paquete según tu elección.

  1. En el editor de ABAP, agrega el siguiente código:
DATA lv_file_length TYPE i.
DATA lv_msg         TYPE string.
DATA lv_dset        TYPE string.
DATA lv_data        TYPE string.
DATA ls_data        TYPE xstring.
DATA lo_storage     TYPE REF TO /goog/cl_storage_v1.

" Read file data from the application server
DATA(dset) = '/tmp/sample_file.txt'.
OPEN DATASET dset FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc <> 0.
  MESSAGE 'Cannot opening/reading dataset' TYPE 'E'.
ENDIF.
DO.
  READ DATASET dset INTO lv_dset.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

  CONCATENATE lv_data lv_dset INTO lv_data SEPARATED BY cl_abap_char_utilities=>newline.
  CLEAR lv_dset.

ENDDO.

CLOSE DATASET dset.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING  text   = lv_data
  IMPORTING  buffer = ls_data
  EXCEPTIONS failed = 1
             OTHERS = 2.
IF sy-subrc <> 0.
  MESSAGE 'Conversion from string to xstring failed' TYPE 'E'.
ENDIF.

TRY.

    lo_storage = NEW #( iv_key_name = 'DEMO_STORAGE' ).

    lo_storage->add_common_qparam( iv_name = 'uploadType' iv_value = 'resumable' ).

    lo_storage->insert_objects( EXPORTING iv_q_name       = 'large_text_file_demo.txt'
                                          iv_p_bucket     = 'newtest_bucket_abapsdk_gcloud001'
                                          is_data         = ls_data
                                          iv_content_type = 'text/pdf'
                                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_storage->is_success( lv_ret_code ) = abap_true.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Object was uploaded successfully'
        )->write_text( 'Object Self Link:'
        )->write_text( ls_output-self_link
        )->display( ).
    ELSE.
      cl_demo_output=>new(
        )->begin_section( 'Error:'
        )->write_text( lv_msg
        )->display( ).
    ENDIF.
  CATCH /goog/cx_sdk INTO data(lo_sdk_excp).
    lv_msg = lo_sdk_excp->get_text( ).
    MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
ENDTRY.

lo_storage->close( ).
  1. Guarda y activa el informe.
  2. Ejecuta el informe (presiona F8).

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

c982bfcd07d7e487.png

Para verificar si el archivo se subió correctamente, navega a tu bucket de Cloud Storage como se muestra a continuación.

90678b475e165adf.png1886be610c63ed6b.png

8. Explicación del código del SDK de ABAP para subir archivos a Cloud Storage

En esencia, este programa ABAP se integra con Google Cloud Storage. Lee un archivo del servidor de aplicaciones y pasa los datos del archivo al cliente auxiliar de la API de Storage para subirlo a un bucket de almacenamiento, que se creó en el programa de informes anterior.

El programa de informes que creaste para subir un archivo hace lo siguiente:

Desglose paso a paso

Establecer conexión:

  • Establece una conexión HTTP con el servicio de Google Storage a través de la clase /GOOG/CL_STORAGE_V1.

Leer datos de archivo

  • Lee el archivo en el servidor de aplicaciones realizando un OPEN DATASET y, luego, llama al módulo de funciones estándar de SAP SCMS_STRING_TO_XSTRING para convertirlo al formato XSTRING.

Agrega parámetros de consulta comunes

  • Para lograr la fragmentación, el tipo de carga que debemos elegir es la carga "reanudable". De forma predeterminada, cuando se selecciona la carga reanudable, los datos del archivo se dividen en fragmentos de 8 MB y se suben. Sin embargo, los desarrolladores pueden modificar este tamaño de fragmentación configurando el parámetro IV_P_CHUNK_SIZE, pero se recomienda usar el parámetro de configuración predeterminado.
  • Para que el método de la API sepa que se debe elegir la opción de carga "reanudable", llamamos al método ADD_COMMON_QPARAM y pasamos uploadType como resumable..

Insertar objetos

  • Llama al método INSERT_OBJECTS pasando los siguientes parámetros:
  • IV_Q_NAME: Nombre del archivo con el que se almacenará el contenido en Cloud Storage
  • IV_P_BUCKET: Nombre del bucket en el que se debe subir el archivo
  • IS_DATA: Datos del archivo que se deben subir
  • IV_CONTENT_TYPE: Es el tipo de contenido del archivo. En nuestro caso actual, usamos "text/plain" porque subimos un archivo de texto.

Ten en cuenta que no pasamos ningún valor al parámetro de importación IV_CHUNK_SIZE y dejamos que el stub del cliente de la API use el valor predeterminado asociado a este parámetro, que es de 8 MB.

Controla los errores y los casos de éxito:

  • Muestra la respuesta de la API según si la llamada a la API se realizó correctamente o no.

Cerrar conexión:

  • Cierra la conexión HTTP al servicio de almacenamiento.

9. Felicitaciones

¡Felicitaciones! Completaste correctamente el codelab "Cómo subir un archivo a un bucket de Cloud Storage".

La API de JSON de Cloud Storage tiene muchas capacidades y, con el SDK de ABAP para Google Cloud, puedes acceder a ellas directamente en tus sistemas SAP de forma nativa con ABAP.

Google Cloud Storage es una excelente opción para almacenar y administrar grandes cantidades de datos. Lo usan una amplia variedad de empresas, organizaciones y aplicaciones.

Estos son algunos de los beneficios de usar Google Cloud Storage:

  • Rentabilidad: Google Cloud Storage es una forma rentable de almacenar y administrar grandes cantidades de datos.
  • Simplicidad: Google Cloud Storage es fácil de usar, con una API simple e intuitiva.
  • Flexibilidad: Google Cloud Storage se puede usar con una variedad de aplicaciones y plataformas.

Ahora puedes continuar con el siguiente codelab para seguir tu recorrido de aprendizaje sobre el uso del SDK de ABAP para acceder a varios servicios de Google Cloud.

  • Envía un evento a Pub/Sub
  • Recibe un evento de Cloud Pub/Sub
  • Usa la API de Cloud Translation para traducir textos
  • Usa la API de DLP para ocultar la IIP
  • Cómo llamar a BigQuery ML desde ABAP

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

  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-dev@abap-sdk-poc.iam.gserviceaccount.com