Fazer upload de um arquivo para o Cloud Storage com divisão

Fazer upload de um arquivo no Cloud Storage com divisão em blocos

Sobre este codelab

subjectÚltimo set. 4, 2024 atualizado
account_circleEscrito por Satish Inamdar

1. Introdução

Neste codelab, listamos as etapas para criar uma conta de serviço e usá-la para configurar a tabela de chaves de cliente e mapa de comunicação fornecida pelo ABAP SDK for Google Cloud e invocar a API JSON do Cloud Storage no ABAP.

Os seguintes serviços do Google Cloud são usados neste codelab:

  • Compute Engine
  • Serviços de rede
  • Cloud Shell
  • API Cloud Storage JSON v1

Observação: quando você cria um projeto do Google Cloud, um conjunto específico de APIs e serviços, incluindo o Cloud Storage, é ativado automaticamente. Assim, você pode aproveitar imediatamente os benefícios dessa solução de armazenamento robusta. Portanto, não é necessário ativá-lo como uma etapa adicional.

Pré-requisitos

O que você vai criar

Você vai criar os seguintes programas no seu sistema SAP usando o SDK ABAP for Google Cloud.

  • Crie um bucket do Cloud Storage.
  • Leia um arquivo do servidor do aplicativo e faça o upload dele para o bucket do Cloud Storage criado.

2. Requisitos

  • Um navegador, como o Chrome ou o Firefox
  • Um projeto do Google Cloud com o faturamento ativado ou Crie uma conta de teste sem custo financeiro de 90 dias para o Google Cloud Platform.
  • GUI do SAP (Windows ou Java) instalado no sistema. Se o SAP GUI já estiver instalado no seu laptop, conecte-se ao SAP usando o endereço IP externo da VM como o IP do servidor de aplicativos. Se você estiver usando um Mac, também poderá instalar o SAP GUI para Java disponível neste link.

3. Antes de começar

6757b2fb50ddcc2d.png

  • Execute os comandos a seguir para fazer a autenticação da sua conta e definir o projeto padrão como abap-sdk-poc. A zona us-west4-b é usada como exemplo. Se necessário, mude o projeto e a zona nos comandos a seguir de acordo com sua preferência.
gcloud auth login
gcloud config
set project abap-sdk-poc
gcloud config
set compute/zone us-west4-b
  • É necessário ter acesso a um sistema SAP com o SDK do ABAP para Google Cloud instalado.
  • É necessário concluir o codelab 1 (Instalar o teste da plataforma ABAP 1909 no Google Cloud Platform e instalar o SDK ABAP para o Google Cloud) e o codelab 2 (Configurar a autenticação do SDK ABAP usando tokens para SAP hospedado na VM do Compute Engine) antes de prosseguir com este codelab.
  • Se você concluiu o codelab 1 e o codelab 2, você teria um sistema de teste da plataforma ABAP 1909 no Google Cloud, além da configuração necessária para autenticação e conectividade.
  • Se você não tiver concluído os codelabs 1 e 2, não terá toda a infraestrutura e conectividade necessárias para realizar as etapas fornecidas neste codelab. Portanto, você precisa concluir o codelab 1 e o codelab 2 antes de prosseguir com este codelab.

4. Criar uma conta de serviço com o papel de usuário de objeto de armazenamento

Para criar uma conta de serviço com a função necessária, siga estas etapas:

  1. Execute o seguinte comando no terminal do Cloud Shell:
gcloud iam service-accounts create abap-sdk-storage-tester \
--display-name="Service Account for Cloud Storage"
  1. Agora adicione os papéis necessários à conta de serviço criada na etapa acima:
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'

O comando acima usa abap-sdk-poc como marcador de posição para o projeto do Google Cloud. Substitua abap-sdk-poc pelo ID do projeto.

  1. Para verificar se o papel foi adicionado, acesse a página IAM. A conta de serviço que você criou deve ser listada com a função atribuída a ela, conforme mostrado abaixo:

92d75ce1554efb69.png

5. Criar configuração de chave de cliente

Agora que você configurou os pré-requisitos no Google Cloud, podemos prosseguir com a configuração no SAP.

Para a configuração relacionada à autenticação e conectividade, o SDK ABAP para Google Cloud usa a tabela /GOOG/CLIENT_KEY.

Para manter a configuração na tabela /GOOG/CLIENT_KEY, siga estas etapas:

  1. Na GUI do SAP, insira o código da transação SPRO.
  2. Clique em IMG de referência SAP.
  3. Clique em ABAP SDK for Google Cloud > Configurações básicas > Configurar chave do cliente.
  4. Mantenha os seguintes valores nos campos:

Campo

Valor

Nome da chave do Google Cloud

TEST_STORAGE

Nome da conta de serviço do Google Cloud

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

Escopo do Google Cloud

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

ID do projeto

abap-sdk-poc

Classe de autorização

/GOOG/CL_AUTH_GOOGLE

Deixe todos os outros campos em branco

6. Criar um relatório Z para criar um bucket no Cloud Storage

  1. Faça login no sistema SAP.
  2. Acesse o código da transação SE38 e crie um programa de relatório com o nome ZDEMO_CREATE_BUCKET..
  3. No pop-up que abrir, forneça os detalhes, conforme mostrado abaixo:

93f3edb7bbb5c3c4.png

No próximo pop-up, selecione "Objeto local" ou "Forneça um nome de pacote", conforme sua escolha.

  1. No Editor ABAP, adicione o seguinte 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.
 

Se o nome do bucket não for globalmente exclusivo, ele não será criado. Portanto, use um nome exclusivo antes de executar o código.

  1. Salve e ative o relatório.
  2. Execute o relatório (pressione F8).

Se a execução for bem-sucedida, você vai ver a saída do relatório, conforme mostrado abaixo:

ff232fba9a4178fb.png

7. Criar um Z-Report para ler um arquivo do servidor de aplicativos e fazer upload dele para o bucket do Cloud Storage

Antes de realizar esta atividade, você precisa preparar um arquivo de texto grande. Aqui já temos um arquivo de texto grande criado e enviado para o servidor do aplicativo. Você pode usar o código de transação CG3Z para fazer upload de um arquivo para o servidor de aplicativos do sistema SAP.

Neste exemplo, usamos um arquivo de texto com cerca de 40 MB, que já foi enviado para o servidor de aplicativos no diretório /tmp.

Também é possível fazer o download dessa pasta do GitHub usando o seguinte link: Sample File

  1. Faça login no seu sistema SAP
  2. Acesse o código de transação SE38 e crie um programa de relatórios com o nome ZDEMO_UPLOAD_FILE..
  3. No pop-up que abrir, forneça os detalhes, conforme mostrado abaixo:

19cbe6987bba58e4.png

No próximo pop-up, selecione "Objeto local" ou "Forneça um nome de pacote", conforme sua escolha.

  1. No Editor ABAP, adicione o seguinte 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. Salve e ative o relatório.
  2. Execute o relatório (pressione F8).

Se a execução for bem-sucedida, você vai ver a saída do relatório, conforme mostrado abaixo:

c982bfcd07d7e487.png

Para verificar se o upload do arquivo foi concluído, acesse o bucket do Cloud Storage conforme mostrado abaixo.

90678b475e165adf.png

1886be610c63ed6b.png

8. Explicação sobre o upload de arquivos para o Cloud Storage usando o código do SDK do ABAP

Em essência, esse programa ABAP é integrado ao Google Cloud Storage. Ele lê um arquivo do servidor do aplicativo e transmite os dados do arquivo para o stub de cliente da API Storage para fazer upload para um bucket de armazenamento, que foi criado no programa de relatórios anterior.

O programa de relatório que você criou para fazer upload de um arquivo faz o seguinte:

Detalhes do processo

Estabelecer conexão:

  • Ele estabelece uma conexão HTTP com o serviço do Google Storage usando a classe /GOOG/CL_STORAGE_V1.

Ler dados de arquivo

  • Lê o arquivo no servidor de aplicativos fazendo um DATASET OPEN e, em seguida, chama o módulo de função SAP padrão SCMS_STRING_TO_XSTRING para converter para o formato XSTRING.

Adicionar parâmetros de consulta comuns

  • Para conseguir o chunking, o tipo de upload que precisamos escolher é o "Resumable". Por padrão, quando o upload retomável é selecionado, os dados do arquivo são divididos em blocos de 8 MB e enviados. No entanto, os desenvolvedores podem alterar esse tamanho de divisão definindo o parâmetro IV_P_CHUNK_SIZE, mas é recomendável usar a configuração padrão.
  • Para informar ao método da API que a opção de upload "Resumable" precisa ser escolhida, chamamos o método ADD_COMMON_QPARAM e transmitimos uploadType como resumable..

Inserir objetos

  • Chama o método INSERT_OBJECTS transmitindo os seguintes parâmetros:
  • IV_Q_NAME: nome do arquivo em que o conteúdo será armazenado no Cloud Storage
  • IV_P_BUCKET: nome do bucket em que o arquivo precisa ser enviado
  • IS_DATA: dados do arquivo que precisam ser enviados
  • IV_CONTENT_TYPE: o tipo de conteúdo do arquivo. No nosso cenário atual, estamos usando "text/plain" porque estamos fazendo o upload de um arquivo de texto.

Não transmitimos nenhum valor para o parâmetro de importação IV_CHUNK_SIZE e permitimos que o stub de cliente da API use o valor padrão associado a esse parâmetro, que é 8 MB.

Processar sucessos/erros:

  • Mostra a resposta da API com base no sucesso ou não da chamada.

Encerrar conexão:

  • Fecha a conexão HTTP com o serviço de armazenamento.

9. Parabéns

Parabéns! Você concluiu o codelab "Como fazer upload de um arquivo para um bucket do Cloud Storage".

A API JSON do Cloud Storage tem muitos recursos, e com o SDK do ABAP for Google Cloud, você pode acessá-los diretamente nos sistemas SAP de forma nativa usando ABAP.

O Google Cloud Storage é uma ótima opção para armazenar e gerenciar grandes quantidades de dados. Ele é usado por uma ampla variedade de empresas, empreendimentos e aplicativos.

Alguns dos benefícios do uso do Google Cloud Storage:

  • Economia: o Google Cloud Storage é uma maneira econômica de armazenar e gerenciar grandes quantidades de dados.
  • Simplicidade: o Google Cloud Storage é fácil de usar e tem uma API simples e intuitiva.
  • Flexibilidade: o Google Cloud Storage pode ser usado com vários aplicativos e plataformas.

Agora você pode prosseguir com o codelab abaixo para continuar sua jornada de aprendizado sobre como usar o SDK ABAP para acessar vários serviços do Google Cloud.

  • Enviar um evento para o Pub/Sub
  • Receber um evento do Cloud Pub/Sub
  • Usar a API Cloud Translation para traduzir textos
  • Usar a API DLP para remover PIIs
  • Chamar o BigQuery ML do ABAP

10. Limpar

Se você não quiser continuar com os outros codelabs relacionados ao SDK ABAP para Google Cloud, prossiga com a limpeza.

Excluir o projeto

  • Exclua o projeto do Google Cloud:
gcloud projects delete abap-sdk-poc

Excluir recursos individuais

  1. Exclua a instância de computação:
gcloud compute instances delete abap-trial-docker
  1. Exclua as regras de firewall:
gcloud compute firewall-rules delete sapmachine
  1. Exclua a conta de serviço:
gcloud iam service-accounts delete \
    abap-sdk-dev@abap-sdk-poc.iam.gserviceaccount.com