亞馬遜 S3 示例程序 - AWS SDK對於 SAP ABAP

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

亞馬遜 S3 示例程序

本節將引導您完成一個簡單的示例程序,以列出 Amazon S3 存儲桶的內容ListObjectsV2

先決條件

您必須符合下列先決條件才能執行此範例程式。

  • 你有一個亞馬遜 S3 存儲桶。在本教學課程中,值區會命名為demo-invoices.customer.com

  • 交易/AWS1/IMG:

    • 具有名為的已定義 SDK 設定檔DEMO_S3

      • 在 SDK 設定檔中,邏輯 IAM 角色TESTUSER必須對應至 IAM 角色,例如arn:aws:iam::111122223333:role/SapDemoFinance其中授予s3:ListBucket允許列出您的亞馬遜 S3 存儲桶的內容。

    • 具有名為的邏輯資源DEMO_BUCKET它使用 SAP 系統的 SID 和客戶端映射到您的亞馬遜 S3 存儲桶。

  • 您的使用者具有下列項目的 PFCG 角色:

    • 授權使用者存取DEMO_S3通過驗證對象的 SDK 配置文件-/AWS1/SESS

    • 授權使用者使用邏輯 IAM 角色TESTUSER通過身份驗證對象訪問-/AWS1/LROL

  • 您的 SAP 系統可以自行驗證AWS使用 SDK 配置文件中定義的方法。

  • 您的亞馬遜 EC2 執行個體設定檔授予您的 SAP 系統的權利sts:assumeRole在 IAM 角色中arn:aws:iam::111122223333:role/SapDemoFinance映射在 SDK 配置文件中。

代碼

下面的代碼塊演示了你的代碼將是什麼樣子。

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_S3SDK 設定檔。此呼叫是 SDK 設定的連線,並提取預設區域、驗證設定和所需的 IAM 角色。一個電話AUTHORIZATION-CHECK自動進行,以確保授權對象/AWS1/SESS很滿意。此外,AUTHORIZATION-CHECK將根據授權對象進行調用以確定用戶獲得授權的最強大(序列號較低的序列號)邏輯 IAM 角色/AWS1/LROL。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 ).

這一行使用亞馬遜 S3 創建一個 API 對象create()的方法/aws1/cl_s3_factory。返回的對像是類型/aws1/if_s3這是一個亞馬遜 S3 API 的接口。必須為每個服務建立個別的 API 物件。例如,如果一個 ABAP 程序正在使用亞馬遜 S3,AWS Lambda,然後它會從中建立 API 物件/aws1/cl_s3_factory,/aws1/cl_lmd_factory,以及/aws1/cl_dyn_factory

構造函數有一些可選參數,如果要覆蓋配置的默認區域,則可以指定 RegionIMG。通過這種方式,可以有兩個實例/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。它需要簡單的輸入參數並返回一個對象。這些對象可以代表深層 JSON 和 XML 數據,反序列化為 ABAP 面向對象的構造。在某些情況下,它可能非常複雜。現在,您只需要處理輸出即可列出存儲桶的內容。

      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 條目的對象。在大多數情況下,AWSSDK 採用這種面向對象的方法和所有數據表示為對象和表。 該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 錯誤,如授權或配置錯誤,都表示為異常。您可以單獨處理每個異常。您可以選擇是否應將例外狀況當做資訊性錯誤、重試、警告、短暫傾印或任何其他類型的處理來處理。