本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
亞馬遜 S3 示例程序
本節將引導您完成一個簡單的示例程序,以列出 Amazon S3 存儲桶的內容ListObjectsV2
。
先決條件
您必須符合下列先決條件才能執行此範例程式。
-
你有一個亞馬遜 S3 存儲桶。在本教學課程中,值區會命名為
demo-invoices.customer.com
。 -
交易
/AWS1/IMG
:-
具有名為的已定義 SDK 設定檔
DEMO_S3
。-
在 SDK 設定檔中,邏輯 IAM 角色
TESTUSER
必須對應至 IAM 角色,例如arn:aws:iam::
其中授予111122223333
:role/SapDemoFinances3: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::
映射在 SDK 配置文件中。111122223333
:role/SapDemoFinance
代碼
下面的代碼塊演示了你的代碼將是什麼樣子。
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
很滿意。此外,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 錯誤,如授權或配置錯誤,都表示為異常。您可以單獨處理每個異常。您可以選擇是否應將例外狀況當做資訊性錯誤、重試、警告、短暫傾印或任何其他類型的處理來處理。