1. 簡介
在本程式碼實驗室中,我們列出建立服務帳戶的步驟,並說明如何使用該帳戶設定 ABAP SDK for Google Cloud 提供的用戶端金鑰和通訊地圖表格,以及在 ABAP 中叫用 Cloud Storage JSON API。
本程式碼研究室會使用下列 Google Cloud 服務:
- Compute Engine
- 網路服務
- Cloud Shell
- Cloud Storage JSON API V1
注意:建立新的 Google Cloud 專案時,系統會自動啟用特定 API 和服務,包括 Cloud Storage。確保您能立即使用這項強大的儲存空間解決方案。因此您不必額外啟用這項功能。
必要條件
- 確認您有權存取已安裝 ABAP SDK for Google Cloud 的 SAP 系統。
- 如要設定新系統,請參閱「在 Google Cloud Platform 上安裝 ABAP Platform Trial,並安裝 ABAP SDK」程式碼實驗室。
建構項目
您將使用 ABAP SDK for Google Cloud,在 SAP 系統中建立下列程式
- 建立 Cloud Storage bucket。
- 從應用程式伺服器讀取檔案,並上傳至建立的 Cloud Storage Bucket。
2. 需求條件
- 瀏覽器,例如 Chrome 或 Firefox。
- 啟用計費功能的 Google Cloud 專案,或建立 Google Cloud Platform 90 天免費試用帳戶。
- 系統中已安裝 SAP GUI (Windows 或 Java)。如果筆電上已安裝 SAP GUI,請使用 VM 外部 IP 位址做為應用程式伺服器 IP,連線至 SAP。如果您使用 Mac,也可以透過這個連結安裝 SAP GUI for Java。
3. 事前準備
- 確認您有權存取已安裝 ABAP SDK for Google Cloud 的 SAP 系統。
- 如要設定新系統,請參閱程式碼實驗室「在 Google Cloud Platform 上安裝 ABAP Platform Trial 並安裝 ABAP SDK」。
- 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案 (例如:
abap-sdk-poc). - 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。如果使用 90 天免費試用帳戶,請略過這個步驟。
- 您將使用 Cloud Shell,這是 Google Cloud 執行的指令列環境。在 Cloud 控制台,點選右上角的「啟用 Cloud Shell」:

- 執行下列指令,驗證帳戶並將預設專案設為
abap-sdk-poc。以區域us-west4-b為例。視需要根據偏好設定,變更下列指令中的專案和區域。
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- 您必須有權存取已安裝 ABAP SDK for Google Cloud 的 SAP 系統。
- 請先完成程式碼實驗室 1 (在 Google Cloud Platform 上安裝 ABAP Platform Trial 1909,並安裝 ABAP SDK for Google Cloud) 和程式碼實驗室 2 (使用權杖設定 ABAP SDK 驗證機制,適用於 Compute Engine VM 託管的 SAP),再繼續進行本程式碼實驗室。
- 如果您已完成程式碼實驗室 1 和程式碼實驗室 2,應該已在 Google Cloud 上佈建 ABAP Platform Trial 1909 系統,並完成驗證和連線的必要設定。
- 如果您尚未完成程式碼研究室 1 和 2,就無法具備所有必要基礎架構和連線,因此無法執行本程式碼研究室提供的步驟。因此,您必須先完成程式碼研究室 1 和 2,才能繼續進行本程式碼研究室。
4. 建立具有「Storage 物件使用者」角色的服務帳戶
如要建立具備必要角色的服務帳戶,請完成下列步驟:
- 在 Cloud Shell 終端機中執行下列指令:
gcloud iam service-accounts create abap-sdk-storage-tester \
--display-name="Service Account for Cloud Storage"
- 現在,請將必要角色新增至上述步驟中建立的服務帳戶:
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-storage-tester@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/storage.objectUser'
上述指令會使用 abap-sdk-poc 做為 Google Cloud 專案的預留位置。將 abap-sdk-poc 替換為專案 ID。

5. 建立用戶端金鑰設定
Google Cloud 端的必要條件設定完成後,我們就可以繼續進行 SAP 端的設定。
如要進行驗證和連線相關設定,ABAP SDK for Google Cloud 會使用 /GOOG/CLIENT_KEY 資料表
如要在 /GOOG/CLIENT_KEY 資料表中維護設定,請按照下列步驟操作:
- 在 SAP GUI 中輸入交易代碼
SPRO。 - 按一下「SAP Reference IMG」。
- 依序點選「ABAP SDK for Google Cloud」>「Basic Settings」>「Configure Client Key」。
- 針對欄位保留下列值:
欄位 | 值 |
Google Cloud 金鑰名稱 | TEST_STORAGE |
Google Cloud 服務帳戶名稱 |
|
Google Cloud 範圍 |
|
專案 ID | abap-sdk-poc |
授權類別 |
|
將其他所有欄位留空
6. 建立 Z 報表,在 Cloud Storage 上建立 bucket
- 登入 SAP 系統。
- 前往交易代碼
SE38,並建立名為ZDEMO_CREATE_BUCKET.的報表程式 - 在隨即開啟的彈出式視窗中,提供如下所示的詳細資料:

在下一個彈出式視窗中,視需要選取「本機物件」或提供套件名稱。
- 在 ABAP 編輯器中,新增下列程式碼:
DATA lv_json_response TYPE string.
DATA ls_input TYPE /goog/cl_storage_v1=>ty_001.
DATA lo_storage TYPE REF TO /goog/cl_storage_v1.
TRY.
lo_storage = NEW #( iv_key_name = 'TEST_STORAGE' ).
" Bucket Name should be globally unique & permanent
ls_input = VALUE #( name = 'newtest_bucket_abapsdk_gcloud001' ).
lo_storage->insert_buckets
( EXPORTING iv_q_project = CONV #( lo_storage->gv_project_id )
is_input = ls_input
IMPORTING es_raw = lv_json_response
es_output = DATA(ls_output)
ev_ret_code = DATA(lv_ret_code)
ev_err_text = DATA(lv_err_text)
es_err_resp = DATA(ls_err_resp) ).
IF lo_storage->is_success( lv_ret_code ) = abap_true.
cl_demo_output=>new(
)->begin_section( 'Result:'
)->write_text( 'Bucket was created:'
)->next_section( 'JSON Response:'
)->write_json( lv_json_response
)->display( ).
ELSE.
DATA(lv_msg) = lv_ret_code && ':' && lv_err_text.
cl_demo_output=>new(
)->begin_section( 'Result:'
)->write_text( 'Bucket creation failed;'
)->next_section( 'Error:'
)->write_json( lv_msg
)->display( ).
ENDIF.
CATCH /goog/cx_sdk INTO DATA(lo_sdk_excp).
lv_msg = lo_sdk_excp->get_text( ).
MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
請注意,如果 bucket 名稱在全域範圍內重複,系統就不會建立 bucket,因此請先為 bucket 使用不重複的名稱,再執行程式碼
- 儲存並啟用報表。
- 執行報表 (按下 F8 鍵)。
執行成功後,您應該會看到如下所示的報表輸出內容:

7. 建立 Z 報表,從應用程式伺服器讀取檔案,並上傳至 Cloud Storage bucket
執行這項活動前,請先準備大型文字檔。我們已建立大型文字檔,並上傳至應用程式伺服器。您可以使用交易代碼 CG3Z,將檔案上傳至 SAP 系統的應用程式伺服器
在本範例中,我們使用大小約 40 MB 的文字檔,該檔案已上傳至應用程式伺服器的 /tmp 目錄。
您也可以使用下列連結從 GitHub 下載這個資料夾:範例檔案
- 登入 SAP 系統
- 前往交易代碼
SE38,並建立名為ZDEMO_UPLOAD_FILE.的報表程式 - 在隨即開啟的彈出式視窗中,提供如下所示的詳細資料:

在下一個彈出式視窗中,視需要選取「本機物件」或提供套件名稱。
- 在 ABAP 編輯器中,新增下列程式碼:
DATA lv_file_length TYPE i.
DATA lv_msg TYPE string.
DATA lv_dset TYPE string.
DATA lv_data TYPE string.
DATA ls_data TYPE xstring.
DATA lo_storage TYPE REF TO /goog/cl_storage_v1.
" Read file data from the application server
DATA(dset) = '/tmp/sample_file.txt'.
OPEN DATASET dset FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc <> 0.
MESSAGE 'Cannot opening/reading dataset' TYPE 'E'.
ENDIF.
DO.
READ DATASET dset INTO lv_dset.
IF sy-subrc <> 0.
EXIT.
ENDIF.
CONCATENATE lv_data lv_dset INTO lv_data SEPARATED BY cl_abap_char_utilities=>newline.
CLEAR lv_dset.
ENDDO.
CLOSE DATASET dset.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING text = lv_data
IMPORTING buffer = ls_data
EXCEPTIONS failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'Conversion from string to xstring failed' TYPE 'E'.
ENDIF.
TRY.
lo_storage = NEW #( iv_key_name = 'DEMO_STORAGE' ).
lo_storage->add_common_qparam( iv_name = 'uploadType' iv_value = 'resumable' ).
lo_storage->insert_objects( EXPORTING iv_q_name = 'large_text_file_demo.txt'
iv_p_bucket = 'newtest_bucket_abapsdk_gcloud001'
is_data = ls_data
iv_content_type = 'text/pdf'
IMPORTING es_output = data(ls_output)
ev_ret_code = data(lv_ret_code)
ev_err_text = data(lv_err_text)
es_err_resp = data(ls_err_resp) ).
IF lo_storage->is_success( lv_ret_code ) = abap_true.
cl_demo_output=>new(
)->begin_section( 'Result:'
)->write_text( 'Object was uploaded successfully'
)->write_text( 'Object Self Link:'
)->write_text( ls_output-self_link
)->display( ).
ELSE.
cl_demo_output=>new(
)->begin_section( 'Error:'
)->write_text( lv_msg
)->display( ).
ENDIF.
CATCH /goog/cx_sdk INTO data(lo_sdk_excp).
lv_msg = lo_sdk_excp->get_text( ).
MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDTRY.
lo_storage->close( ).
- 儲存並啟用報表。
- 執行報表 (按下 F8 鍵)。
執行成功後,您應該會看到如下所示的報表輸出內容:

如要確認檔案是否上傳成功,請按照下圖所示前往 Cloud Storage Bucket


8. 說明如何使用 ABAP SDK 程式碼將檔案上傳至 Cloud Storage
基本上,這個 ABAP 程式會與 Google Cloud Storage 整合。這個函式會從應用程式伺服器讀取檔案,並將檔案資料傳遞至 Storage API 的 API 用戶端虛設常式,以便上傳至先前在報告程式中建立的儲存空間 bucket。
您建立的報表程式會執行下列操作來上傳檔案:
逐步解析
建立連線:
- 它會使用
/GOOG/CL_STORAGE_V1類別建立與 Google 儲存空間服務的 HTTP 連線。
讀取檔案資料
- 透過
OPENDATASET讀取應用程式伺服器上的檔案,然後呼叫標準 SAP 函式模組SCMS_STRING_TO_XSTRING,轉換為XSTRING格式。
新增常見查詢參數
- 如要進行分塊上傳,我們需要選擇「可續傳」上傳類型。根據預設,選取支援續傳的上傳作業時,檔案資料會分成 8 MB 的區塊上傳。不過,開發人員可以設定
IV_P_CHUNK_SIZE參數來變更這個區塊大小,但建議使用預設設定。 - 如要讓 API 方法知道必須選擇「可續傳」上傳選項,請呼叫
ADD_COMMON_QPARAM方法,並將uploadType做為resumable.傳遞
插入物件
- 將下列參數傳遞至
INSERT_OBJECTS方法,藉此呼叫該方法: IV_Q_NAME:要在 Cloud Storage 中儲存內容的檔案名稱IV_P_BUCKET:檔案上傳至的 Bucket 名稱IS_DATA:需要上傳的檔案資料IV_CONTENT_TYPE:檔案的內容類型。在目前的情境中,我們上傳的是文字檔,因此使用「text/plain」。
請注意,我們不會將任何值傳遞至匯入參數 IV_CHUNK_SIZE,而是讓 API 用戶端 Stub 使用與這個參數相關聯的預設值 (8 MB)。
處理成功/錯誤:
- 根據 API 呼叫是否成功,顯示 API 回應。
關閉連線:
- 關閉與儲存服務的 HTTP 連線。
9. 恭喜
恭喜!您已成功完成「將檔案上傳至 Cloud Storage bucket」程式碼研究室。
Cloud Storage JSON API 具有許多功能,透過 ABAP SDK for Google Cloud,您可以使用 ABAP 在 SAP 系統中直接存取這些功能。
Google Cloud Storage 是儲存及管理大量資料的絕佳選擇。適用於各種商家、企業和應用程式。
使用 Google Cloud Storage 的優點包括:
- 符合成本效益:Google Cloud Storage 是儲存及管理大量資料的經濟實惠方式。
- 簡單易用:Google Cloud Storage 簡單易用,API 簡單直覺。
- 彈性:Google Cloud Storage 可搭配各種應用程式和平台使用。
您現在可以繼續進行下列程式碼實驗室,進一步瞭解如何使用 ABAP SDK 存取各種 Google Cloud 服務。
- 將事件傳送至 Pub/Sub
- 接收來自 Cloud Pub/Sub 的事件
- 使用 Cloud Translation API 翻譯文字
- 使用 DLP API 遮蓋 PII
- 從 ABAP 呼叫 BigQuery ML
10. 清理
如不想繼續進行與 ABAP SDK for Google Cloud 相關的額外程式碼研究室,請繼續進行清理作業。
刪除專案
- 刪除 Google Cloud 專案:
gcloud projects delete abap-sdk-poc
刪除個別資源
- 刪除運算執行個體:
gcloud compute instances delete abap-trial-docker
- 刪除防火牆規則:
gcloud compute firewall-rules delete sapmachine
- 刪除服務帳戶:
gcloud iam service-accounts delete \
abap-sdk-dev@abap-sdk-poc.iam.gserviceaccount.com