Programa de ejemplo de Amazon S3 - AWS SDKpara SAP ABAP

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Programa de ejemplo de Amazon S3

En esta sección, se muestra un ejemplo de programa sencillo para mostrar el contenido de un bucket de Amazon S3 mediante una llamada a ListObjectsV2.

Requisitos previos

Para ejecutar este programa de ejemplo, debe cumplir los siguientes requisitos previos.

  • Tiene un bucket de Amazon S3. En este tutorial, el bucket se denomina demo-invoices.customer.com.

  • Transacción /AWS1/IMG:

    • Tiene un perfil del SDK definido denominado DEMO_S3.

      • En el perfil del SDK, El rol de IAM lógico TESTUSER debe asignarse a un rol de IAM, por ejemplo, arn:aws:iam::111122223333:role/SapDemoFinance, que otorga a s3:ListBucket permiso para mostrar el contenido de su bucket de Amazon S3.

    • Tiene un recurso lógico llamado DEMO_BUCKET que se asigna a su bucket de Amazon S3 con el SID y el cliente de su sistema SAP.

  • Su usuario tiene un rol de PFCG que:

    • Autoriza al usuario acceder al perfil del SDK de DEMO_S3 a través del objeto de autenticación: /AWS1/SESS.

    • Autoriza al usuario a TESTUSER acceder al rol de IAM lógico mediante el objeto de autenticación: /AWS1/LROL.

  • Su sistema SAP puede autenticarse en AWS mediante el método definido en el perfil del SDK.

  • Su perfil de instancia de Amazon EC2 otorga a su sistema SAP los derechos a sts:assumeRole en el rol de IAM arn:aws:iam::111122223333:role/SapDemoFinance asignado en el perfil del SDK.

Código

El siguiente bloque de código muestra el aspecto que tendrá su 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.

Secciones de código

La siguiente es una revisión del código en secciones.

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

Los usuarios no pueden especificar un nombre de bucket físico. Especifican un bucket lógico y los administradores del sistema (en concreto, el analista empresarial), en coordinación con el administrador de AWS, asignan los buckets lógicos a los buckets físicos en /AWS1/IMG. En la mayoría de los escenarios empresariales, el usuario no tiene la oportunidad de elegir el bucket lógico: el ID del recurso lógico está codificado de forma rígida o configurado en una tabla de configuración personalizada.

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

Esta línea establece una sesión de seguridad y declara que este programa ABAP espera usar el perfil del SDK de DEMO_S3. Esta llamada es la conexión a la configuración del SDK y extrae la región predeterminada, la configuración de autenticación y el rol de IAM deseado. Se realiza automáticamente una llamada a AUTHORIZATION-CHECK para garantizar que se satisfaga el objeto de autorización de /AWS1/SESS. Además, se realizarán llamadas de AUTHORIZATION-CHECK para determinar cuál es el rol de IAM lógico más potente (número de secuencia inferior) para el que está autorizado el usuario, en función del objeto de autorización de /AWS1/LROL. El SDK asumirá que el rol de IAM está asignado al rol de IAM lógico para el SID y el cliente. A continuación, el objeto de sesión activa el rastreo en función de la configuración de rastreo en la IMG.

Si el usuario no está autorizado para el perfil del SDK solicitado ni para ningún rol de IAM lógico disponible, se generará una excepción.

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

Esta línea convierte el recurso lógico en un nombre de bucket físico. Si el recurso lógico no se puede resolver porque la configuración no tiene ninguna asignación para esta combinación de SID/cliente, se generará una excepción.

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

Esta línea crea un objeto de API para Amazon S3 mediante el método create() de /aws1/cl_s3_factory. El objeto devuelto es de tipo /aws1/if_s3, que es la interfaz de una API de Amazon S3. Se debe crear un objeto de API independiente para cada servicio. Por ejemplo, si un programa ABAP consume Amazon S3, AWS Lambda y DynamoDB, entonces crea objetos de API a partir de /aws1/cl_s3_factory, /aws1/cl_lmd_factory y /aws1/cl_dyn_factory.

El constructor tiene algunos parámetros opcionales que le permiten especificar la región si desea anular la región configurada de forma predeterminada IMG. De esta forma, puede haber dos instancias de /aws1/if_s3, una para us-east-1 y otra para us-west-2, si desea copiar objetos de un bucket de una región a un bucket de otra región. Del mismo modo, puede crear dos objetos de sesión de seguridad diferentes y utilizarlos para crear dos instancias distintas de /aws1/cl_s3, si necesita leer un informe de un bucket relacionado con las finanzas y escribir objetos en un bucket relacionado con la logística.

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

Esta línea es una llamada a ListObjectsV2. Requiere argumentos de entrada simples y devuelve un único objeto. Estos objetos pueden representar datos JSON y XML profundos, convertidos por serialización inversa en un constructo ABAP orientado a objetos. En algunos casos, este proceso puede ser bastante complicado. Ahora, solo necesita procesar la salida para mostrar el contenido del 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.

Se accede a los datos mediante un método de tipo GET...() que oculta la representación interna de los datos. GET_CONTENTS( ) devuelve una tabla ABAP y cada fila contiene un objeto que representa una única entrada de Amazon S3. En la mayoría de los casos, el SDK de AWS adopta este enfoque orientado a objetos y todos los datos se representan como objetos y tablas. El campo LastModified se representa como una marca temporal que se puede convertir en una fecha con el comando CONVERT TIME STAMP nativo de ABAP. GET_SIZE() devuelve un INT4 para facilitar las operaciones matemáticas y de formato.

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

Todos los errores (de conexión, de cliente 4xx, de servidor 5xx o cualquier error de ABAP, como errores de autorización o configuración) se representan como excepciones. Puede abordar cada excepción por separado. Puede elegir si una excepción debe gestionarse como un error informativo, un reintento, una advertencia, un error de volcado o cualquier otro tipo de gestión.