

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
<a name="example-program"></a>

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

**Topics**
+ [Pré-requisitos](#prerequisites-example-program)
+ [Código](#code-example-program)
+ [Seções de código](#code-sections)

## Pré-requisitos
<a name="prerequisites-example-program"></a>

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 EC2 instância da Amazon concede ao seu sistema SAP os direitos sobre a `sts:assumeRole` função IAM `arn:aws:iam::111122223333:role/SapDemoFinance` mapeada no perfil do SDK.

## Código
<a name="code-example-program"></a>

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 name="code-sections"></a>

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 Amazon S3 e DynamoDB AWS Lambda, ele criará objetos de API a partir de, e. `/aws1/cl_s3_factory` `/aws1/cl_lmd_factory` `/aws1/cl_dyn_factory`

Existem alguns parâmetros opcionais para a estrutura 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 `LastModified` campo é representado como um timestamp que pode ser convertido em uma data com o `CONVERT TIME STAMP` comando ABAP-native. Ele `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.