Exemplo de programa do Amazon S3 - AWS SDKpara SAP ABAP

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Exemplo de programa do Amazon S3

Esta seção mostra um exemplo de programa simples para listar o conteúdo de um bucket do Amazon S3 por meio de uma chamada de ListObjectsV2.

Pré-requisitos

Você deve cumprir os seguintes pré-requisitos para executar este programa de exemplo.

  • Você tem um bucket do Amazon S3. Neste tutorial, o bucket tem um nome demo-invoices.customer.com.

  • Transação /AWS1/IMG:

    • Tem um perfil SDK definido chamado DEMO_S3.

      • No perfil do SDK, o perfil lógico do IAM TESTUSER deve ser mapeado para um perfil do IAM, como a arn:aws:iam::111122223333:role/SapDemoFinance que concede a permissão s3:ListBucket para listar o conteúdo do seu bucket do Amazon S3.

    • Tem um recurso lógico chamado DEMO_BUCKET que é mapeado para seu bucket do Amazon S3 com o SID e o cliente do seu sistema SAP.

  • Seu usuário tem uma função PFCG que:

    • Autoriza o usuário a acessar o perfil do SDK DEMO_S3 por meio do objeto de autenticação - /AWS1/SESS.

    • Autoriza o usuário a acessar o perfil lógico do IAM TESTUSER por meio do objeto de autenticação - /AWS1/LROL.

  • Seu sistema SAP pode se autenticar à AWS usando o método definido no perfil do SDK.

  • Seu perfil de instância do Amazon EC2 concede ao seu sistema SAP os direitos sobre a sts:assumeRole no perfil do IAM arn:aws:iam::111122223333:role/SapDemoFinance mapeado no perfil do SDK.

Código

O bloco de código a seguir mostra como deve ser a aparência do seu código.

REPORT  zdemo_s3_listbuckets. START-OF-SELECTION.   PARAMETERS pv_lres TYPE  /aws1/rt_resource_logical                      DEFAULT 'DEMO_BUCKET' OBLIGATORY.   DATA(go_session) = /aws1/cl_rt_session_aws=>create( 'DEMO_S3'  ).   DATA(gv_bucket)   = go_session->resolve_lresource( pv_lres ).   DATA(go_s3)       = /aws1/cl_s3_factory=>create( go_session ).   TRY.       DATA(lo_output) = go_s3->listobjectsv2(             iv_bucket = CONV string( gv_bucket )             iv_maxkeys = 100       ).       LOOP AT lo_output->get_contents(  ) INTO DATA(lo_object).         DATA lv_mdate TYPE datum.         CONVERT TIME STAMP lo_object->get_lastmodified( )                 TIME ZONE 'UTC'                 INTO DATE lv_mdate.         WRITE: /  CONV text30( lo_object->get_key( ) ),                  lv_mdate, lo_object->get_size( ).       ENDLOOP.     CATCH /aws1/cx_rt_generic INTO DATA(lo_ex).       DATA(lv_msg) = lo_ex->if_message~get_text(  ).       MESSAGE lv_msg TYPE 'I'.   ENDTRY.

Seções de código

A seguir, é apresentada uma análise do código nas seções.

  PARAMETERS pv_lres TYPE  /aws1/rt_resource_logical                      DEFAULT 'DEMO_BUCKET' OBLIGATORY.

O usuário não pode especificar um nome de bucket físico. Eles especificam um bucket lógico e os administradores do sistema (especificamente o analista de negócios), em coordenação com o administrador da AWS, mapeiam os buckets lógicos para os buckets físicos no /AWS1/IMG. Na maioria dos cenários de negócios, o usuário não tem a chance de escolher o bucket lógico: o ID do recurso lógico tem codificação rígida ou configurado em uma tabela de configuração personalizada.

  DATA(go_session) = /aws1/cl_rt_session_aws=>create( 'DEMO_S3'  ).

Essa linha estabelece uma sessão de segurança e declara que esse programa ABAP espera usar o perfil do SDK DEMO_S3. Essa chamada é a conexão com a configuração do SDK e extrai a região padrão, as configurações de autenticação e o perfil do IAM desejado. Uma chamada para AUTHORIZATION-CHECK é feita automaticamente para garantir que o objeto de autorização /AWS1/SESS seja satisfeito. Além disso, serão feitas chamadas AUTHORIZATION-CHECK para determinar o perfil lógico do IAM mais poderoso (número de sequência inferior) para o qual o usuário está autorizado, com base no objeto de autorização /AWS1/LROL. O SDK assumirá que o perfil do IAM está mapeado para o perfil lógico do IAM para o SID e o cliente. Em seguida, o objeto da sessão ativa o rastreamento com base nas configurações de rastreamento no IMG.

Se o usuário não estiver autorizado para o perfil do SDK solicitado ou para qualquer perfil lógico do IAM disponível, uma exceção será gerada.

DATA(gv_bucket)   = go_session->resolve_lresource( pv_lres ).

Essa linha resolve o recurso lógico para um nome de bucket físico. Se o recurso lógico não puder ser resolvido porque a configuração não tem mapeamento para essa combinação de SID/cliente, uma exceção será gerada.

  DATA(go_s3)       = /aws1/cl_s3_factory=>create( go_session ).

Essa linha cria um objeto de API para o Amazon S3 usando o método create() de /aws1/cl_s3_factory. O objeto retornado é do tipo /aws1/if_s3 que é a interface de uma API do Amazon S3. Um objeto de API separado deve ser criado para cada serviço. Por exemplo, se um programa ABAP estiver consumindo o Amazon S3, o AWS Lambda e o DynamoDB, ele criará objetos de API a partir de /aws1/cl_s3_factory, /aws1/cl_lmd_factory e /aws1/cl_dyn_factory.

Existem alguns parâmetros opcionais para o construtor que permitem especificar a região se você quiser substituir a região padrão configurada IMG. Dessa forma, pode haver duas instâncias de /aws1/if_s3, uma para us-east-1 e outra para us-west-2, se você quiser copiar objetos de um bucket em uma região para um bucket em outra região. Da mesma forma, você pode criar dois objetos de sessão de segurança diferentes e usá-los para criar duas instâncias separadas de /aws1/cl_s3, se precisar de um relatório para ler de um bucket relacionado a finanças e gravar objetos em um bucket relacionado à logística.

      DATA(lo_output) = go_s3->listobjectsv2(             iv_bucket = CONV string( gv_bucket )             iv_maxkeys = 100       ).

Esta linha é uma chamada para ListObjectsV2. Ela exige argumentos de entrada simples e retorna um único objeto. Esses objetos podem representar dados JSON e XML profundos, desserializados em uma estrutura orientada a objetos ABAP. Isso pode ser bastante complicado em alguns casos. Agora você só precisa processar a saída para listar o conteúdo do bucket.

      LOOP AT lo_output->get_contents(  ) INTO DATA(lo_object).         DATA lv_mdate TYPE datum.         CONVERT TIME STAMP lo_object->get_lastmodified( )                 TIME ZONE 'UTC'                 INTO DATE lv_mdate.         WRITE: /  CONV text30( lo_object->get_key( ) ),                  lv_mdate, lo_object->get_size( ).       ENDLOOP.

Os dados são acessados usando um método de estilo GET...() que oculta a representação interna dos dados. GET_CONTENTS( ) retorna uma tabela ABAP e cada linha contém um objeto representando uma única entrada do Amazon S3. Na maioria dos casos, o AWS SDK adota essa abordagem orientada a objetos e todos os dados são representados como objetos e tabelas. O campo LastModified é representado como um carimbo de data/hora que pode ser convertido em uma data com o comando CONVERT TIME STAMP nativo do ABAP. O GET_SIZE() retorna um INT4 para facilitar as operações matemáticas e de formatação.

    CATCH /aws1/cx_rt_generic INTO DATA(lo_ex).       DATA(lv_msg) = lo_ex->if_message~get_text(  ).       MESSAGE lv_msg TYPE 'I'.

Todos os erros, conexão, cliente 4xx, servidor 5xx ou qualquer erro ABAP, como erros de autorização ou configuração, são representados como exceções. Você pode lidar com cada exceção separadamente. Você pode escolher se uma exceção deve ser tratada como um erro informativo, uma nova tentativa, um aviso, um atalho ou qualquer outro tipo de tratamento.