

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

# Amazon S3 範例程式
<a name="example-program"></a>

本節將引導您完成簡單的範例程式，透過呼叫 列出 Amazon S3 儲存貯體的內容`ListObjectsV2`。

**Topics**
+ [

## 先決條件
](#prerequisites-example-program)
+ [

## 代碼
](#code-example-program)
+ [

## 程式碼區段
](#code-sections)

## 先決條件
<a name="prerequisites-example-program"></a>

您必須符合下列先決條件，才能執行此範例程式。
+ 您有 Amazon S3 儲存貯體。在本教學課程中，儲存貯體名為 `demo-invoices.customer.com`。
+ 交易`/AWS1/IMG`：
  + 已定義名為 的 SDK 描述檔`DEMO_S3`。
    + 在 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`映射的 權利。

## 代碼
<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 角色。`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`，以便於數學和格式化操作。

```
    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 錯誤，例如授權或組態錯誤，都會以例外狀況表示。您可以分別處理每個例外狀況。您可以選擇是否應將例外狀況視為資訊錯誤、重試、警告、簡短傾印或任何其他類型的處理。