在 SDK 描述檔中,邏輯 IAM 角色
TESTUSER
必須映射至 IAM 角色,例如
arn:aws:iam::
111122223333
:role/SapDemoFinance
授予列出 Amazon S3 儲存貯體內容的
s3:ListBucket
許可。
具有名為 的邏輯資源
DEMO_BUCKET
,其會映射至具有 SAP 系統的 SID 和用戶端的 Amazon S3 儲存貯體。
您的使用者具有以下 PFCG 角色:
授權使用者透過身分驗證物件 - 存取
DEMO_S3
SDK 描述檔
/AWS1/SESS
。
授權使用者透過身分驗證物件 - 進行邏輯 IAM 角色
TESTUSER
存取
/AWS1/LROL
。
您的 SAP 系統可以使用 SDK AWS 描述檔中定義的方法,對 進行自我驗證。
您的 Amazon EC2 執行個體描述檔授予 SAP 系統 SDK 描述
sts:assumeRole
檔中 IAM 角色
arn:aws:iam::
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 ).
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 ).
此行使用 的
create()
方法,為 Amazon S3 建立 API 物件
/aws1/cl_s3_factory
。傳回的物件類型為
/aws1/if_s3
,這是 Amazon S3 API 的界面。必須為每個服務建立單獨的 API 物件。例如,如果 ABAP 程式正在使用 Amazon S3 AWS Lambda和 DynamoDB,則會從
/aws1/cl_s3_factory
、
/aws1/cl_lmd_factory
和 建立 API 物件
/aws1/cl_dyn_factory
。
建構函數有一些選用參數,可讓您在想要覆寫設定的預設區域 時指定區域
IMG
。如此一來,如果您想要將物件從一個區域中的儲存貯體複製到另一個區域中的儲存貯體,則可能會有兩個 執行個體,
/aws1/if_s3
一個用於
us-west-2
,
us-east-1
另一個用於 。同樣地,如果您需要報告從財務相關儲存貯體讀取並將物件寫入物流相關儲存貯體
/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 項目的物件。在大多數情況下, AWS SDK 採用這種物件導向方法,所有資料都以物件和資料表表示。
LastModified
欄位以時間戳記表示,可以使用 ABAP 原生
CONVERT TIME STAMP
命令轉換為日期。 會
GET_SIZE()
傳回
INT4
,以便於數學和格式化操作。