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 は 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/SapDemoFinancests: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 ロールを取得します。AUTHORIZATION-CHECK への呼び出しは、認証オブジェクト /AWS1/SESS が満たされていることを確認するために自動的に行われます。さらに、承認オブジェクト /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 の 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 コマンドで日付に変換できます。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 エラーを含むすべてのエラーは例外として表されます。それぞれの例外に個別に対処できます。例外を情報エラー、再試行、警告、ショートダンプ、またはその他の処理として処理するかどうかを選択できます。