Carica un file in Cloud Storage con il chunking

Caricare un file su Cloud Storage con il chunking

Informazioni su questo codelab

subjectUltimo aggiornamento: set 4, 2024
account_circleScritto da: Satish Inamdar

1. Introduzione

In questo codelab abbiamo elencato i passaggi per creare un account di servizio e utilizzarlo per configurare la tabella Client Key e Communication Map fornita dall'SDK ABAP per 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 Cloud Storage 1

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

Prerequisiti

Cosa creerai

Creerai i seguenti programmi nel sistema SAP utilizzando l'SDK ABAP per Google Cloud

  • Crea un bucket Cloud Storage.
  • Leggi un file dal server dell'applicazione 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 la piattaforma Google Cloud.
  • SAP GUI (Windows o Java) installato nel sistema. Se SAP GUI è già installato sul tuo laptop, connettiti a SAP utilizzando l'indirizzo IP esterno della VM come indirizzo IP del server di applicazioni. Se utilizzi un Mac, puoi anche installare SAP GUI per Java disponibile in questo link.

3. Prima di iniziare

6757b2fb50ddcc2d.png

  • Esegui i seguenti 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 comandi seguenti 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 l'SDK ABAP per Google Cloud installato.
  • Prima di procedere con questo codelab, devi completare il codelab 1 (Install ABAP Platform Trial 1909 on Google Cloud Platform and Install ABAP SDK for Google Cloud) e il codelab 2 (Configure ABAP SDK Authentication using tokens for SAP Hosted on Compute Engine VM).
  • Se hai completato i codelab 1 e 2, avrai eseguito il provisioning di un sistema ABAP Platform Trial 1909 su Google Cloud, insieme alla configurazione richiesta per l'autenticazione e la connettività.
  • Se non hai completato i codelab 1 e 2, non avrai tutta l'infrastruttura e la connettività necessarie per eseguire i passaggi descritti in questo codelab. Pertanto, devi completare i codelab 1 e 2 prima di procedere con questo.

4. Crea un account di servizio con il ruolo Utente oggetto archiviazione

Per creare un account di servizio con il ruolo richiesto, svolgi i seguenti 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 riportato sopra utilizza abap-sdk-poc come segnaposto per il progetto Google Cloud. Sostituisci abap-sdk-poc con l'ID del tuo progetto.

  1. Per verificare che il ruolo sia stato aggiunto, vai alla pagina IAM. L'account di servizio 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'SDK ABAP per Google Cloud utilizza la tabella /GOOG/CLIENT_KEY

Per mantenere la configurazione nella tabella /GOOG/CLIENT_KEY, svolgi i seguenti passaggi:

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

Campo

Valore

Nome della chiave Google Cloud

TEST_STORAGE

Nome dell'account di servizio 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

Classe di autorizzazione

/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 sistema SAP.
  2. Vai al codice transazione SE38 e crea un programma 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 ed esegui il report.
  2. Esegui il report (premi F8).

Al termine dell'esecuzione, dovresti vedere l'output del report come mostrato di seguito:

ff232fba9a4178fb.png

7. Creare un report Z per leggere un file dall'Application Server e caricarlo nel bucket Cloud Storage

Prima di svolgere questa attività, devi preparare un file di testo di grandi dimensioni. Qui abbiamo già un file di testo di grandi dimensioni creato e caricato sul nostro server di applicazioni. Puoi utilizzare il codice 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 nell'Application Server nella directory /tmp.

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

  1. Accedi al sistema SAP
  2. Vai al codice transazione SE38 e crea un programma 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 ed esegui il report.
  2. Esegui il report (premi F8).

Al termine dell'esecuzione, dovresti vedere l'output del report come mostrato di seguito:

c982bfcd07d7e487.png

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

90678b475e165adf.png

1886be610c63ed6b.png

8. Carica il file su Cloud Storage utilizzando il codice dell&#39;SDK ABAP spiegato

In sostanza, questo programma ABAP si integra con Google Cloud Storage. Legge un file dal server dell'applicazione e passa i dati del file allo stub client dell'API Storage per il caricamento 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:

Procedura dettagliata

Stabilisci 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 in formato XSTRING.

Aggiungere parametri di query comuni

  • Per ottenere il chunking, dobbiamo scegliere il tipo di caricamento "Riavviabile". Per impostazione predefinita, quando è selezionato il caricamento riavviabile, i dati del file vengono suddivisi in blocchi di 8 MB e caricati. Gli sviluppatori possono però modificare questa dimensione del chunking 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 "Ripristinabile", 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: nome del bucket in cui deve essere caricato il file
  • IS_DATA: dati del file da caricare
  • IV_CONTENT_TYPE: il tipo di contenuto del file. Per il nostro scenario attuale utilizziamo "text/plain" perché stiamo caricando un file di testo.

Tieni presente che non viene passato alcun valore al parametro di importazione IV_CHUNK_SIZE e che lo stub client dell'API utilizza il valore predefinito associato a questo parametro, ovvero 8 MB.

Gestisci stato riuscito/errori:

  • Mostra la risposta dell'API in base al fatto che la chiamata all'API sia andata a buon fine o meno.

Chiudi connessione:

  • Chiude la connessione HTTP al servizio di archiviazione.

9. Complimenti

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

L'API JSON di Cloud Storage offre molte funzionalità e con l'SDK ABAP per 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.

Ecco alcuni dei vantaggi dell'utilizzo di Google Cloud Storage:

  • Economicità: Google Cloud Storage è un modo economico 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 seguente codelab per continuare il tuo percorso di apprendimento sull'utilizzo dell'SDK ABAP 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 l'oscuramento delle PII
  • Chiamare BigQuery ML da ABAP

10. Esegui la pulizia

Se non vuoi continuare con i codelab aggiuntivi relativi all'SDK ABAP per Google Cloud, procedi con la pulizia.

Elimina il progetto

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

Eliminare singole risorse

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