Amazon S3 예제 프로그램 - AWS SDK에 대한 SAP ABAP

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon S3 예제 프로그램

이 섹션에서는 ListObjectsV2을(를) 호출하여 Amazon S3 버킷의 콘텐츠를 나열하는 간단한 예제 프로그램을 안내합니다.

사전 조건

이 예제 프로그램을 실행하려면 다음 사전 조건을 충족해야 합니다.

  • Amazon S3 버킷이 있습니다. 이 자습서에서 버킷의 이름은 demo-invoices.customer.com입니다.

  • 트랜잭션 /AWS1/IMG:

    • 이름이 DEMO_S3인 정의된 SDK 프로필이 있습니다.

      • SDK 프로파일에서 논리적 IAM 역할 TESTUSER은(는) Amazon S3 버킷의 콘텐츠를 나열할 s3:ListBucket 권한을 부여하는 arn:aws:iam::111122223333:role/SapDemoFinance와 같은 IAM 역할에 매핑되어야 합니다.

    • SAP 시스템의 SID 및 클라이언트를 사용하여 Amazon S3 버킷에 매핑된 DEMO_BUCKET 논리적 리소스가 있습니다.

  • 사용자의 PFCG 역할은 다음과 같습니다.

    • 사용자가 인증 객체 /AWS1/SESS을(를) 통해 DEMO_S3 SDK 프로필에 액세스할 수 있도록 권한을 부여합니다.

    • 인증 객체 /AWS1/LROL을(를) 통해 사용자에게 논리적 IAM 역할 TESTUSER 액세스 권한을 부여합니다.

  • SAP 시스템은 SDK 프로파일에 정의된 방법을 사용하여 AWS로 자체 인증이 가능합니다.

  • Amazon EC2 인스턴스 프로파일은 SDK 프로필에 매핑된 IAM 역할 arn:aws:iam::111122223333:role/SapDemoFinance에 대한 sts:assumeRole 권한을 SAP 시스템에 부여합니다.

코드

다음 코드 블록은 코드가 어떻게 보이는지 보여줍니다.

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.

코드 섹션

다음은 섹션별 코드를 검토한 것입니다.

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

사용자는 물리적 버킷 이름을 지정할 수 없습니다. 논리적 버킷을 지정하고 시스템 관리자(특히 비즈니스 분석가)는 AWS 관리자와 협력하여 논리적 버킷을 /AWS1/IMG의 물리적 버킷에 매핑합니다. 대부분의 비즈니스 시나리오에서 사용자는 논리적 버킷을 선택할 기회가 없습니다. 논리적 리소스 ID는 코드에 하드 코딩되어 있거나 사용자 지정 구성 테이블에 구성되어 있기 때문입니다.

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

이 행은 보안 세션을 설정하고 이 ABAP 프로그램이 DEMO_S3 SDK 프로필을 사용할 것으로 예상한다고 선언합니다. 이 호출은 SDK 구성에 대한 연결이며 기본 리전, 인증 설정 및 원하는 IAM 역할을 가져옵니다. 권한 부여 객체 /AWS1/SESS가 충족되었는지 확인하기 위해 AUTHORIZATION-CHECK(이)가 자동으로 호출됩니다. 또한 권한 부여 객체 /AWS1/LROL를 기반으로 사용자에게 권한이 부여되는 가장 강력한(하위 시퀀스 번호) 논리적 IAM 역할을 결정하기 위한 AUTHORIZATION-CHECK 호출이 이루어집니다. SDK는 IAM 역할이 SID 및 클라이언트의 논리적 IAM 역할에 매핑된 것으로 가정합니다. 그러면 세션 개체가 IMG의 추적 설정을 기반으로 추적을 활성화합니다.

사용자에게 요청된 SDK 프로필 또는 사용 가능한 논리적 IAM 역할에 대한 권한이 없는 경우 예외가 발생합니다.

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

이 행은 논리적 리소스를 물리적 버킷 이름으로 해결합니다. 구성에 이 SID/클라이언트 조합에 대한 매핑이 없어서 논리적 리소스를 확인할 수 없는 경우 예외가 발생합니다.

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

이 행은 /aws1/cl_s3_factorycreate() 메서드를 사용하여 Amazon S3용 API 객체를 생성합니다. 반환된 객체는 Amazon S3 API의 인터페이스 /aws1/if_s3 유형입니다. 각 서비스에 대해 별도의 API 객체를 생성해야 합니다. 예를 들어, ABAP 프로그램이 Amazon S3, AWS Lambda 및 DynamoDB를 사용하는 경우 /aws1/cl_s3_factory, /aws1/cl_lmd_factory/aws1/cl_dyn_factory에서 API 객체를 생성합니다.

IMG(으)로 구성된 기본 리전을 재정의하려는 경우 생성자에는 지역을 지정할 수 있는 몇 가지 선택적 파라미터가 존재합니다. 이렇게 하면 한 리전의 버킷에서 다른 리전의 버킷으로 객체를 복사하려는 경우 /aws1/if_s3 인스턴스가 두 개(하나는 us-east-1용, 하나는 us-west-2용) 있을 수 있습니다. 마찬가지로, 재무 관련 버킷에서 읽고 물류 관련 버킷에 객체를 쓰는 보고서가 필요한 경우 두 개의 서로 다른 보안 세션 객체를 생성하여 두 개의 개별 /aws1/cl_s3 인스턴스를 만들 수 있습니다.

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

이 행은 ListObjectsV2에 대한 호출입니다. 간단한 입력 인수가 필요하며 단일 객체를 반환합니다. 이러한 객체는 ABAP 객체 지향 구조로 역직렬화된 심층 JSON 및 XML 데이터를 나타낼 수 있습니다. 경우에 따라 상당히 복잡할 수 있습니다. 이제는 출력을 처리하여 버킷의 내용을 나열하기만 하면 됩니다.

      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.

데이터의 내부 표현을 숨기는 GET...() 스타일 메서드를 사용하여 데이터에 액세스합니다. GET_CONTENTS( )은(는) ABAP 테이블을 반환하고 각 행 자체에는 단일 Amazon S3 항목을 나타내는 객체가 포함됩니다. 대부분의 경우 AWS SDK는 이러한 객체 지향 접근 방식을 취하며 모든 데이터는 객체와 테이블로 표시됩니다. LastModified 필드는 ABAP 기본 CONVERT TIME STAMP 명령을 사용하여 날짜로 변환할 수 있는 타임스탬프로 표시됩니다. 쉽게 수학 및 형식 지정 작업을 수행할 수 있도록 GET_SIZE()은(는) INT4을(를) 반환합니다.

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

연결, 4xx 클라이언트, 5xx 서버, 권한 부여 또는 구성 오류 등의 모든 ABAP 오류는 예외로 표시됩니다. 각 예외를 개별적으로 해결할 수 있습니다. 예외를 정보 오류로 처리할지, 재시도, 경고, 간단한 덤프 또는 기타 처리로 처리할지 여부를 선택할 수 있습니다.