

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

# Amazon S3 예제 프로그램
<a name="example-program"></a>

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

**Topics**
+ [

## 사전 조건
](#prerequisites-example-program)
+ [

## 코드
](#code-example-program)
+ [

## 코드 섹션
](#code-sections)

## 사전 조건
<a name="prerequisites-example-program"></a>

이 예제 프로그램을 실행하려면 다음 사전 조건을 충족해야 합니다.
+ 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 시스템에 부여합니다.

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

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

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

## 코드 섹션
<a name="code-sections"></a>

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

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

`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` 명령을 사용하여 날짜로 변환할 수 있는 타임스탬프로 표시됩니다.는 쉬운 수학 및 형식 지정 작업을 `INT4` 위해를 `GET_SIZE()` 반환합니다.

```
    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 오류는 예외로 표시됩니다. 각 예외를 개별적으로 해결할 수 있습니다. 예외를 정보 오류로 처리할지, 재시도, 경고, 간단한 덤프 또는 기타 처리로 처리할지 여부를 선택할 수 있습니다.