

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

# 適用於 SAP ABAP 的 AWS SDK features
<a name="features"></a>

適用於 SAP ABAP 的 AWS SDK 提供下列功能。

**Topics**
+ [程式設計組態](#programmatic-configuration)
+ [等待程式](#waiters)
+ [分頁程式](#paginators)
+ [重試行為](#retry-behavior)
+ [預先簽章者](#presigners)
+ [跨帳戶 IAM 角色鏈結](#source-profile)

## 程式設計組態
<a name="programmatic-configuration"></a>

使用適用於 SAP ABAP 的 AWS SDK 的 `/n/AWS1/IMG` IMG 轉換，以及適用於適用於 SAP ABAP 的 AWS SDK 的自訂商業組態應用程式 - 適用於程式設計組態的 BTP 版本。

若要開始程式設計組態，請先使用 `get_config( )`命令擷取組態物件。

```
data(lo_config) = lo_s3->get_config( ).
```

每個組態物件都會實作`/AWS1/IF_RT_CONFIG`介面，其中包含對應至 的 `GET`ters 和 `SET`ters`IMG`。例如，預設區域可以覆寫。請參閱下列範例命令。

```
lo_s3->get_config( )->/aws1/if_rt_config~set_region( 'us-east-1' ).
```

有些組態物件沒有`IMG`表示法，只能以程式設計方式設定，例如重試次數上限。請參閱下列範例命令。

```
lo_s3->get_config( )->/aws1/if_rt_config~set_max_attempts( 10 ).
```

的組態物件 AWS 服務 也可以包含未在 中表示的服務特定方法`/aws1/if_rt_config`。例如，Amazon S3 可以使用`foobucket.s3.region.amazonaws.com`虛擬端點或`s3.region.amazonaws.com/foobucket`路徑樣式來定址名為 `foobucket`的儲存貯體。您可以使用下列範例命令強制使用路徑樣式。

```
lo_s3->get_config( )->set_forcepathstyle( abap_true ).
```

如需服務組態的詳細資訊，請參閱 [適用於 SAP ABAP 的 AWS SDK – API 參考指南](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)。

## 等待程式
<a name="waiters"></a>

使用非同步 AWS APIs 時，您需要等待特定資源可用，才能採取進一步動作。例如， 的 `CREATETABLE()` API 會立即 Amazon DynamoDB 回應資料表狀態 `CREATING`。只有在資料表的狀態變更為 之後，您才能啟動讀取或寫入操作`ACTIVE`。等待程式可讓您先確認 AWS 資源處於特定狀態，再對其執行動作。

等待者使用服務操作輪詢 AWS 資源的狀態，直到資源達到預期狀態，或直到確定資源未達到預期狀態為止。編寫程式碼以持續輪詢 AWS 資源可能非常耗時且容易出錯。等待程式會代表您負責執行輪詢，協助簡化此複雜性。

請參閱下列使用等待程式的 Amazon S3 範例。

```
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ).
 
" Create a bucket - initiates the process of creating an S3 bucket and might return before the bucket exists
lo_s3→createbucket( iv_bucket = |amzn-s3-demo-bucket| ).
 
" Wait until the newly created bucket becomes available
lo_s3->get_waiter( )->bucketexists(
    iv_max_wait_time = 200
    iv_bucket = |amzn-s3-demo-bucket|
).
```
+ 在此範例中，Amazon S3 用戶端用於建立儲存貯體。已實作 `get_waiter()`命令來指定 的時間`bucketexists`。
+ 您必須為每個等待程式指定 `iv_max_wait_time` 參數。它代表等待程式在完成之前必須等待的總時間量。在上述範例中，等待程式可以執行 200 秒。
+ 您可能需要為必要參數提供額外的輸入。在上述範例中，`iv_bucket`參數需要 Amazon S3 儲存貯體名稱。
+ `/AWS1/CX_RT_WAITER_FAILURE` 例外狀況表示等待程式超過 `iv_max_wait_time` 參數中指定的時間上限。
+ `/AWS1/CX_RT_WAITER_TIMEOUT` 例外狀況表示等待程式已因未達到所需狀態而停止。

## 分頁程式
<a name="paginators"></a>

有些 AWS 服務 操作提供分頁回應。它們會分頁，以傳回每個回應的固定資料量。您需要使用字符或標記提出後續請求，才能擷取整個結果集。例如，Amazon S3 `ListObjectsV2` 操作一次最多傳回 1，000 個物件。您必須使用適當的字符提出後續請求，以取得下一頁的結果。

分頁是傳送連續請求的程序，以從前一個請求停止的位置挑選。分頁程式是 SDK for SAP ABAP 所提供結果的迭代器。您可以輕鬆使用分頁 APIs，而無需了解使用分頁字符的 API 基礎機制。

**使用分頁程式**

您可以使用傳回分頁器物件的 `get_paginator()`方法建立分頁器。分頁器物件會呼叫正在分頁的操作。分頁器物件接受要提供給基礎 API 的必要參數。此程序會傳回迭代器物件，可用於使用 `has_next()`和 `get_next()`方法逐一查看分頁結果。
+ `has_next()` 會傳回布林值，指出呼叫的操作是否有更多的回應或頁面可用。
+ `get_next()` 會傳回操作回應。

下列範例列出使用分頁器擷取的 S3 儲存貯體中的所有物件。

```
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( 'DEMO' ).
DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ).

TRY.
    DATA(lo_paginator) = lo_s3->get_paginator( ).
    DATA(lo_iterator) = lo_paginator->listobjectsv2(  
        iv_bucket = 'example_bucket'
    ).
    WHILE lo_iterator->has_next( ). 
        DATA(lo_output) = lo_iterator->get_next( ).
        LOOP AT lo_output->get_contents(  ) INTO DATA(lo_object).
            WRITE: / lo_object->get_key( ), lo_object->get_size( ).
        ENDLOOP.
    ENDWHILE.
CATCH /aws1/cx_rt_generic INTO DATA(lo_ex).
    MESSAGE lo_ex->if_message~get_text(  ) TYPE 'I'.
ENDTRY.
```

## 重試行為
<a name="retry-behavior"></a>

適用於 SAP ABAP 的 SDK 可讓您為因限流或暫時性錯誤而 AWS 服務 失敗的 請求設定重試次數上限。服務用戶端層級允許的重試次數，也就是 SDK 在失敗和引發例外狀況之前重試操作的次數，由服務組態物件中的 `AV_MAX_ATTEMPTS` 屬性指定。建立服務用戶端物件時，開發套件會將 `AV_MAX_ATTEMPTS` 屬性設定為預設值 3。服務組態物件可用來以程式設計方式將重試次數上限設定為所需的值。如需詳細資訊，請參閱下列範例。

```
" Retrieve configuration object using Amazon S3 service’s get_config( ) method
DATA(lo_config) = lo_s3->get_config( ).

" Set the maximum number of retries to 5
lo_config->/aws1/if_rt_config~set_max_attempts( 5 ).
 
" Get the value of the maximum retry attempt.
DATA(lv_max_retry_attempts) = lo_config->/aws1/if_rt_config~get_max_attempts( ).
```

**注意**  
雖然組態物件 ABAP SDK 允許使用 `/AWS1/IF_RT_CONFIG~SET_RETRY_MODE()`方法設定*重試模式*，但 SDK 僅支援`standard`重試模式。如需詳細資訊，請參閱[重試行為](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html) AWS SDKs和工具參考指南。

## 預先簽章者
<a name="presigners"></a>

您可以使用預先簽章URLs，將時間限制的存取權授予某些 URL AWS 服務。預先簽章的 URL 可以在瀏覽器中輸入，或由程式用來執行服務操作。您可以多次使用此預先簽章 URL，直到到期日期和時間為止。如需詳細資訊，請參閱[針對支援預先簽章者的服務使用 SAP ABAP 用戶端的預先簽章 URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html) 開發套件將有一個特殊方法，稱為 `GET_PRESIGNER()` 來建立該服務的預先簽章者。然後呼叫預先簽章者的方法，其對應於 API 用戶端的方法，但它們傳回預先簽章的 URL，而不是實際執行操作。

```
" Retrieve a presigner for Amazon S3
DATA(lo_presigner) = lo_s3->get_presigner( iv_expires_sec = 600 ).

" the presigner getobject() method has the same signature as
" lo_s3->getobject(), but it doesn't actually make the call.
" to the service.  It just prepares a presigned URL for a future call
DATA(lo_presigned_req) = lo_presigner->getobject( iv_bucket = iv_bucket_name iv_key = iv_key ).

" You can provide this URL to a web page, user, email etc so they
" can retrieve the file.  The URL will expire in 10 minutes.
ov_url = lo_presigned_req->get_url( ).
```

## 跨帳戶 IAM 角色鏈結
<a name="source-profile"></a>

跨帳戶 IAM 角色鏈結支援可透過來源設定檔組態，跨多個 AWS 帳戶無縫存取資源。此功能可讓您設定多個角色假設，其中一個設定檔擔任的角色接著擔任另一個角色，進而啟用複雜的跨帳戶存取模式。

如需詳細資訊，請參閱[使用來源設定檔進行跨帳戶存取](https://docs.aws.amazon.com/sdk-for-sapabap/latest/developer-guide/source-profile.html)。