Exemple de programme Amazon S3 - AWS SDK pour SAP ABAP

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

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

Prérequis

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:ListBucketautorisation 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:assumeRoleaccéder au rôle IAM arn:aws:iam::111122223333:role/SapDemoFinance mappé dans le profil SDK.

Code

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

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

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