Carica un file in Cloud Storage con il chunking

1. Introduzione

In questo codelab sono elencati i passaggi per creare un service account e utilizzarlo per configurare la tabella della mappa di comunicazione e della chiave client fornita da ABAP SDK for Google Cloud e richiamare l'API JSON di Cloud Storage in ABAP.

In questo codelab vengono utilizzati i seguenti servizi Google Cloud:

  • Compute Engine
  • Servizi di rete
  • Cloud Shell
  • API JSON di Cloud Storage V1

Nota: quando crei un nuovo progetto Google Cloud, viene abilitato automaticamente un insieme specifico di API e servizi, tra cui Cloud Storage. In questo modo, puoi sfruttare immediatamente questa solida soluzione di archiviazione. Pertanto, non è necessario abilitarlo come passaggio aggiuntivo.

Prerequisiti

Cosa creerai

Creerai i seguenti programmi nel tuo sistema SAP utilizzando ABAP SDK for Google Cloud

  • Crea un bucket Cloud Storage.
  • Leggi un file dal server delle applicazioni e caricalo nel bucket Cloud Storage creato.

2. Requisiti

  • Un 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 Google Cloud.
  • GUI SAP (Windows o Java) installata nel sistema. Se SAP GUI è già installato sul tuo laptop, connettiti a SAP utilizzando l'indirizzo IP esterno della VM come IP del server applicazioni. Se utilizzi Mac, puoi anche installare SAP GUI per Java disponibile in questo link.

3. Prima di iniziare

6757b2fb50ddcc2d.png

  • Esegui questi comandi per autenticarti per il tuo account e impostare il progetto predefinito su abap-sdk-poc. La zona us-west4-b viene utilizzata come esempio. Se necessario, modifica il progetto e la zona nei seguenti comandi in base alle tue preferenze.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • Devi avere accesso a un sistema SAP con ABAP SDK for Google Cloud installato.
  • Prima di procedere con questo codelab, devi completare il codelab 1 (Installare la versione di prova di ABAP Platform 1909 su Google Cloud Platform e installare ABAP SDK for Google Cloud) e il codelab 2 (Configurare l'autenticazione di ABAP SDK utilizzando i token per SAP ospitato su una VM di Compute Engine).
  • Se hai completato il codelab 1 e il codelab 2, avrai eseguito il provisioning di un sistema di prova della piattaforma ABAP 1909 su Google Cloud, insieme alla configurazione richiesta per l'autenticazione e la connettività.
  • Se non hai completato il codelab 1 e il codelab 2, non avrai tutta l'infrastruttura e la connettività necessarie per eseguire i passaggi forniti in questo codelab. Pertanto, devi completare il codelab 1 e il codelab 2 prima di procedere con questo codelab.

4. Crea un service account con il ruolo Utente oggetti Storage

Per creare un service account con il ruolo richiesto, segui questi passaggi:

  1. Esegui questo comando nel terminale Cloud Shell:
gcloud iam service-accounts create abap-sdk-storage-tester \
--display-name="Service Account for Cloud Storage"
  1. 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-storage-tester@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/storage.objectUser'

Il comando precedente utilizza abap-sdk-poc come segnaposto per il progetto Google Cloud. Sostituisci abap-sdk-poc con l'ID progetto.

  1. Per verificare che il ruolo sia stato aggiunto, vai alla pagina IAM. Il service account che hai creato dovrebbe essere elencato insieme al ruolo che gli è stato assegnato, come mostrato di seguito:

92d75ce1554efb69.png

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

Per mantenere la configurazione nella tabella /GOOG/CLIENT_KEY, segui questi passaggi:

  1. Nella GUI SAP, inserisci il codice di transazione SPRO.
  2. Fai clic su SAP Reference IMG.
  3. Fai clic su ABAP SDK for Google Cloud > Impostazioni di base > Configura chiave client.
  4. Mantieni i seguenti valori nei campi:

Campo

Valore

Nome della chiave Google Cloud

TEST_STORAGE

Nome del service account Google Cloud

abap-sdk-storage-tester@abap-sdk-poc.iam.gserviceaccount.com

Ambito Google Cloud

https://www.googleapis.com/auth/cloud-platform

ID progetto

abap-sdk-poc

Authorization Class

/GOOG/CL_AUTH_GOOGLE

Lascia vuoti tutti gli altri campi.

6. Creare un report Z per creare un bucket su Cloud Storage

  1. Accedi al tuo sistema SAP.
  2. Vai al codice transazione SE38 e crea un programma di report con il nome ZDEMO_CREATE_BUCKET.
  3. Nel popup che si apre, fornisci i dettagli come mostrato di seguito:

93f3edb7bbb5c3c4.png

Nel popup successivo, seleziona Oggetto locale o Fornisci un nome del pacchetto in base alla tua scelta.

  1. Nell'editor ABAP, aggiungi il seguente codice:
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.
 

Tieni presente che se il nome del bucket non è univoco a livello globale, il bucket non verrà creato, quindi prova a utilizzare un nome univoco per il bucket prima di eseguire il codice

  1. Salva e attiva il report.
  2. Esegui il report (premi F8).

Se l'esecuzione va a buon fine, dovresti visualizzare l'output del report come mostrato di seguito:

ff232fba9a4178fb.png

7. Crea un report Z per leggere un file dal server delle applicazioni e caricarlo nel bucket Cloud Storage

Prima di eseguire questa attività, devi preparare un file di testo di grandi dimensioni. Qui abbiamo già creato e caricato un file di testo di grandi dimensioni sul nostro server delle applicazioni. Puoi utilizzare il codice di transazione CG3Z per caricare un file sul server delle applicazioni del tuo sistema SAP

Per questo esempio, utilizziamo un file di testo di circa 40 MB, già caricato sul server delle applicazioni nella directory /tmp.

Puoi anche scaricare questa cartella da GitHub utilizzando il seguente link: File di esempio

  1. Accedi al tuo sistema SAP
  2. Vai al codice transazione SE38 e crea un programma di report con il nome ZDEMO_UPLOAD_FILE.
  3. Nel popup che si apre, fornisci i dettagli come mostrato di seguito:

19cbe6987bba58e4.png

Nel popup successivo, seleziona Oggetto locale o Fornisci un nome del pacchetto in base alla tua scelta.

  1. Nell'editor ABAP, aggiungi il seguente codice:
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. Salva e attiva il report.
  2. Esegui il report (premi F8).

Se l'esecuzione va a buon fine, dovresti visualizzare l'output del report come mostrato di seguito:

c982bfcd07d7e487.png

Puoi verificare se il file è stato caricato correttamente o meno accedendo al tuo bucket Cloud Storage come mostrato di seguito.

90678b475e165adf.png1886be610c63ed6b.png

8. Carica il file su Cloud Storage utilizzando il codice ABAP SDK spiegato

In sostanza, questo programma ABAP si integra con Google Cloud Storage. Legge un file dal server delle applicazioni e passa i dati del file allo stub client API dell'API Storage per caricarlo in un bucket di archiviazione, creato nel programma di report precedente.

Il programma di report che hai creato per caricare un file esegue le seguenti operazioni:

Suddivisione dettagliata

Stabilisci la connessione:

  • Stabilisce una connessione HTTP al servizio Google Storage utilizzando la classe /GOOG/CL_STORAGE_V1.

Leggi dati file

  • Legge il file sul server delle applicazioni eseguendo un OPEN DATASET e poi chiama il modulo di funzione SAP standard SCMS_STRING_TO_XSTRING per la conversione nel formato XSTRING.

Aggiungere parametri di query comuni

  • Per ottenere la suddivisione in blocchi, il tipo di caricamento che dobbiamo scegliere è "Riprendibile". Per impostazione predefinita, quando viene selezionato il caricamento ripristinabile, i dati del file vengono suddivisi in blocchi di 8 MB e caricati. Gli sviluppatori possono tuttavia modificare le dimensioni dei blocchi impostando il parametro IV_P_CHUNK_SIZE, ma è consigliabile utilizzare l'impostazione predefinita.
  • Per comunicare al metodo API che deve essere scelta l'opzione di caricamento "Riprendibile", chiamiamo il metodo ADD_COMMON_QPARAM e passiamo uploadType come resumable.

Inserire oggetti

  • Chiama il metodo INSERT_OBJECTS passando i seguenti parametri:
  • IV_Q_NAME: Nome del file con cui i contenuti devono essere archiviati in Cloud Storage
  • IV_P_BUCKET: il nome del bucket in cui deve essere caricato il file
  • IS_DATA: Dati del file da caricare
  • IV_CONTENT_TYPE: Tipo di contenuto del file. Nello scenario attuale, utilizziamo "text/plain" perché stiamo caricando un file di testo.

Tieni presente che non passiamo alcun valore al parametro di importazione IV_CHUNK_SIZE e lasciamo che lo stub client API utilizzi il valore predefinito associato a questo parametro, ovvero 8 MB.

Gestisci esito positivo/errori:

  • Mostra la risposta dell'API in base all'esito della chiamata API.

Chiudi connessione:

  • Chiude la connessione HTTP al servizio di archiviazione.

9. Complimenti

Complimenti! Hai completato correttamente il Codelab "Caricamento di un file in un bucket Cloud Storage".

L'API Cloud Storage JSON offre molte funzionalità e, con ABAP SDK for Google Cloud, puoi accedervi direttamente nei tuoi sistemi SAP in modo nativo utilizzando ABAP.

Google Cloud Storage è un'ottima opzione per archiviare e gestire grandi quantità di dati. Viene utilizzato da un'ampia gamma di attività, aziende e applicazioni.

Alcuni dei vantaggi dell'utilizzo di Google Cloud Storage:

  • Convenienza: Google Cloud Storage è un modo conveniente per archiviare e gestire grandi quantità di dati.
  • Semplicità: Google Cloud Storage è facile da usare, con un'API semplice e intuitiva.
  • Flessibilità: Google Cloud Storage può essere utilizzato con una serie di applicazioni e piattaforme.

Ora puoi procedere con il codelab riportato di seguito per continuare il tuo percorso di apprendimento sull'utilizzo dell'ABAP SDK per accedere a vari servizi Google Cloud.

  • Inviare un evento a Pub/Sub
  • Ricevere un evento da Cloud Pub/Sub
  • Utilizzare l'API Cloud Translation per tradurre i testi
  • Utilizzare l'API DLP per la rimozione delle informazioni PII
  • Chiamare BigQuery ML da ABAP

10. Esegui la pulizia

Se non vuoi continuare con i codelab aggiuntivi relativi ad ABAP SDK for Google Cloud, procedi con la pulizia.

Elimina il progetto

  • Elimina il progetto Google Cloud:
gcloud projects delete abap-sdk-poc

Elimina singole risorse

  1. Elimina l'istanza di computing:
gcloud compute instances delete abap-trial-docker
  1. Elimina le regole firewall:
gcloud compute firewall-rules delete sapmachine
  1. Elimina il service account:
gcloud iam service-accounts delete \
    abap-sdk-dev@abap-sdk-poc.iam.gserviceaccount.com