

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Exemple de programme Amazon S3
<a name="example-program"></a>

Cette section présente un exemple de programme simple permettant de répertorier le contenu d'un compartiment Amazon S3 en appelant`ListObjectsV2`.

**Topics**
+ [

## Prérequis
](#prerequisites-example-program)
+ [

## Code
](#code-example-program)
+ [

## Sections du code
](#code-sections)

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

Vous devez remplir les conditions préalables suivantes pour exécuter cet exemple de programme.
+ Vous disposez d'un compartiment Amazon S3. Dans ce didacticiel, le bucket est nommé`demo-invoices.customer.com`.
+ Transaction `/AWS1/IMG` :
  + Possède un profil SDK défini nommé`DEMO_S3`.
    + Dans le profil du SDK, le rôle IAM logique `TESTUSER` doit être mappé à un rôle IAM, par exemple celui `arn:aws:iam::111122223333:role/SapDemoFinance` qui accorde l'`s3:ListBucket`autorisation de répertorier le contenu de votre compartiment Amazon S3.
  + Possède une ressource logique nommée `DEMO_BUCKET` qui est mappée à votre compartiment Amazon S3 avec le SID et le client de votre système SAP.
+ Votre utilisateur possède un rôle PFCG qui :
  + Autorise l'utilisateur à accéder au profil du `DEMO_S3` SDK via l'objet d'authentification -. `/AWS1/SESS`
  + Autorise l'utilisateur à `TESTUSER` accéder au rôle IAM logique via un objet d'authentification -. `/AWS1/LROL`
+ Votre système SAP peut s'authentifier à AWS l'aide de la méthode définie dans le profil du SDK.
+ Votre profil d' EC2 instance Amazon accorde à votre système SAP le droit d'`sts:assumeRole`accéder au rôle IAM `arn:aws:iam::111122223333:role/SapDemoFinance` mappé dans le profil SDK.

## Code
<a name="code-example-program"></a>

Le bloc de code suivant montre à quoi ressemblerait votre code.

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

## Sections du code
<a name="code-sections"></a>

Ce qui suit est un examen du code en sections.

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

L'utilisateur ne peut pas spécifier de nom de compartiment physique. Ils spécifient un compartiment logique et les administrateurs système (en particulier l'analyste commercial), en coordination avec l' AWS administrateur, mappent les compartiments logiques aux compartiments physiques. `/AWS1/IMG` Dans la plupart des scénarios commerciaux, l'utilisateur n'a pas la possibilité de choisir le compartiment logique : l'ID de ressource logique est codé en dur dans le code ou configuré dans une table de configuration personnalisée.

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

Cette ligne établit une session de sécurité et déclare que ce programme ABAP prévoit d'utiliser le profil du `DEMO_S3` SDK. Cet appel est la connexion à la configuration du SDK et intègre la région par défaut, les paramètres d'authentification et le rôle IAM souhaité. Un appel `AUTHORIZATION-CHECK` est automatiquement effectué pour s'assurer que l'objet d'autorisation `/AWS1/SESS` est satisfait. En outre, des `AUTHORIZATION-CHECK` appels seront effectués pour déterminer le rôle IAM logique le plus puissant (numéro de séquence inférieur) pour lequel l'utilisateur est autorisé, en fonction de l'objet `/AWS1/LROL` d'autorisation. Le SDK supposera que le rôle IAM est mappé au rôle IAM logique pour le SID et le client. L'objet de session active ensuite le suivi en fonction des paramètres de suivi du`IMG`.

Si l'utilisateur n'est pas autorisé pour le profil SDK demandé ou pour un rôle IAM logique disponible, une exception sera déclenchée.

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

Cette ligne convertit la ressource logique en un nom de compartiment physique. Si la ressource logique ne peut pas être résolue parce que la configuration n'a aucun mappage pour cette combinaison SID/client, une exception sera déclenchée.

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

Cette ligne crée un objet API pour Amazon S3 à l'aide de la `create()` méthode de`/aws1/cl_s3_factory`. L'objet renvoyé est du type `/aws1/if_s3` qui est l'interface d'une API Amazon S3. Un objet d'API distinct doit être créé pour chaque service. Par exemple, si un programme ABAP utilise Amazon S3 et DynamoDB AWS Lambda, il crée des objets `/aws1/cl_s3_factory` d'API à partir de, et. `/aws1/cl_lmd_factory` `/aws1/cl_dyn_factory`

Certains paramètres facultatifs du constructeur vous permettent de spécifier la région si vous souhaitez remplacer la région configurée par défaut. `IMG` Ainsi, il peut y avoir deux instances`/aws1/if_s3`, une pour `us-east-1` et une pour`us-west-2`, si vous souhaitez copier des objets d'un compartiment d'une région vers un compartiment d'une autre région. De même, vous pouvez créer deux objets de session de sécurité différents et les utiliser pour créer deux instances distinctes de`/aws1/cl_s3`, si vous avez besoin d'un rapport pour lire un bucket lié aux finances et écrire des objets dans un bucket lié à la logistique.

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

 Cette ligne est un appel à`ListObjectsV2`. Il nécessite des arguments d'entrée simples et renvoie un seul objet. Ces objets peuvent représenter des données JSON et XML profondes, désérialisées dans une construction orientée objet ABAP. Cela peut être assez compliqué dans certains cas. Il ne vous reste plus qu'à traiter la sortie pour répertorier le contenu du 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.
```

Les données sont accessibles à l'aide d'une méthode de `GET...()` style qui masque la représentation interne des données. `GET_CONTENTS( )`renvoie une table ABAP et chaque ligne elle-même contient un objet représentant une seule entrée Amazon S3. Dans la plupart des cas, le AWS SDK adopte cette approche orientée objet et toutes les données sont représentées sous forme d'objets et de tables. Le `LastModified` champ est représenté sous la forme d'un horodatage qui peut être converti en date à l'aide de la `CONVERT TIME STAMP` commande ABAP-native. Il `GET_SIZE()` renvoie un `INT4` pour faciliter les opérations mathématiques et de formatage.

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

Toutes les erreurs (connexion, client 4xx, serveur 5xx ou toute erreur ABAP, telle que les erreurs d'autorisation ou de configuration) sont représentées comme des exceptions. Vous pouvez traiter chaque exception séparément. Vous pouvez choisir si une exception doit être traitée comme une erreur d'information, une nouvelle tentative, un avertissement, un short dump ou tout autre type de traitement.