

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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` は IAM ロールにマッピングする必要があります。例えば、`arn:aws:iam::111122223333:role/SapDemoFinance` は、Amazon S3 バケットの内容を一覧表示する `s3:ListBucket` アクセス権限を付与します。
  + 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_s3_factory`、、`/aws1/cl_lmd_factory`および から API オブジェクトを作成します`/aws1/cl_dyn_factory`。

コンストラクタには、`IMG` に設定されているデフォルトリージョンをオーバーライドしたい場合にリージョンを指定できるオプションパラメータがいくつかあります。このように、あるリージョンのバケットから別のリージョンのバケットにオブジェクトをコピーする場合、`/aws1/if_s3` の 2 つのインスタンス (`us-east-1` 用と `us-west-2` 用) を使用できます。同様に、財務関連のバケットからレポートを読み込み、ロジスティクス関連のバケットにオブジェクトを書き込む必要がある場合は、2 つの異なるセキュリティセッションオブジェクトを作成し、それらを使用して `/aws1/cl_s3` の 2 つの個別のインスタンスを作成できます。

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

 この行は `ListObjectsV2` への呼び出しです。単純な入力引数が必要で、1 つのオブジェクトを返します。これらのオブジェクトは、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 エラーを含むすべてのエラーは例外として表されます。それぞれの例外に個別に対処できます。例外を情報エラー、再試行、警告、ショートダンプ、またはその他の処理として処理するかどうかを選択できます。