1. 简介
在此 Codelab 中,我们列出了创建服务账号并使用该账号配置 ABAP SDK for Google Cloud 提供的客户端密钥和通信映射表的步骤,以及在 ABAP 中调用 Cloud Storage JSON API 的步骤。
此 Codelab 中使用了以下 Google Cloud 服务:
- Compute Engine
- 网络服务
- Cloud Shell
- Cloud Storage JSON API V1
注意:创建新的 Google Cloud 项目时,系统会自动启用一组特定的 API 和服务,包括 Cloud Storage。这样可确保您能立即利用这一强大的存储解决方案。因此,您无需将其作为额外步骤启用。
前提条件
- 确保您有权访问安装了 ABAP SDK for Google Cloud 的 SAP 系统。
- 您可以参考 Codelab“在 Google Cloud Platform 上安装 ABAP 平台试用版并安装 ABAP SDK”来设置新系统。
构建内容
您将使用 ABAP SDK for Google Cloud 在 SAP 系统中创建以下程序
- 创建 Cloud Storage 存储桶。
- 从应用服务器读取文件,并将其上传到创建的 Cloud Storage 存储桶。
2. 要求
- 一个浏览器,例如 Chrome 或 Firefox。
- 已启用结算功能的 Google Cloud 项目,或创建 Google Cloud Platform 90 天免费试用账号。
- 您的系统中已安装 SAP GUI(Windows 或 Java)。如果您的笔记本电脑上已安装 SAP GUI,请使用虚拟机的外部 IP 地址作为应用服务器 IP 连接到 SAP。如果您使用的是 Mac,还可以安装 此链接中提供的 SAP GUI for Java。
3. 准备工作
- 确保您有权访问安装了 ABAP SDK for Google Cloud 的 SAP 系统。
- 您可以参阅 Codelab 在 Google Cloud Platform 上安装 ABAP 平台试用版并安装 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 系统。
- 在继续学习本 Codelab 之前,您必须先完成 Codelab 1(在 Google Cloud Platform 上安装 ABAP 平台试用版 1909 并安装 ABAP SDK for Google Cloud)和 Codelab 2(使用令牌为托管在 Compute Engine 虚拟机上的 SAP 配置 ABAP SDK 身份验证)。
- 如果您已完成 Codelab 1 和 Codelab 2,那么您应该已在 Google Cloud 上预配了 ABAP 平台试用版 1909 系统,并完成了身份验证和连接所需的设置。
- 如果您尚未完成 Codelab 1 和 Codelab 2,则不具备执行本 Codelab 中提供的步骤所需的所有基础设施和连接。因此,您必须先完成 Codelab 1 和 Codelab 2,然后才能继续学习本 Codelab。
4. 创建具有 Storage Object User 角色的服务账号
如需创建具有所需角色的服务账号,请执行以下步骤:
- 在 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。
- 如需验证角色是否已添加,请前往 IAM 页面。您创建的服务账号应会列出,并显示已为其分配的角色,如下所示:

5. 创建客户端密钥配置
现在,您已在 Google Cloud 端设置了前提条件,接下来可以在 SAP 端进行配置。
对于与身份验证和连接相关的配置,ABAP SDK for Google Cloud 使用表 /GOOG/CLIENT_KEY
如需维护 /GOOG/CLIENT_KEY 表中的配置,请执行以下步骤:
- 在 SAP GUI 中,输入事务代码
SPRO。 - 点击 SAP 参考 IMG。
- 点击 ABAP SDK for Google Cloud > 基本设置 > 配置客户端密钥。
- 针对相应字段保持以下值:
字段 | 值 |
Google Cloud 密钥名称 | TEST_STORAGE |
Google Cloud 服务账号名称 |
|
Google Cloud 范围 |
|
项目 ID | abap-sdk-poc |
授权类 |
|
将所有其他字段留空
6. 创建 Z 报告以在 Cloud Storage 上创建存储桶
- 登录您的 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.
请注意,如果存储桶名称不是全局唯一的,则系统不会创建存储桶,因此请尝试在执行代码之前为存储桶使用唯一名称
- 保存并启用报告。
- 执行报告(按 F8)。
成功执行后,您应该会看到如下所示的报告输出:

7. 创建 Z 报告以从应用服务器读取文件并将其上传到 Cloud Storage 存储桶
在执行此活动之前,您需要准备一个大型文本文件。在此示例中,我们已创建了一个大型文本文件并将其上传到应用服务器。您可以使用事务代码 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 存储桶,验证文件是否已成功上传


8. 使用 ABAP SDK 代码将文件上传到 Cloud Storage(附代码说明)
从本质上讲,此 ABAP 程序与 Google Cloud Storage 集成。它从应用服务器读取文件,并将文件数据传递给 Storage API 的 API 客户端桩,以便将文件上传到之前报告程序中创建的存储桶。
您创建的用于上传文件的报告程序会执行以下操作:
分步细分
建立联系:
- 它使用
/GOOG/CL_STORAGE_V1类与 Google Storage 服务建立 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:必须将文件上传到的存储桶名称IS_DATA:需要上传的文件数据IV_CONTENT_TYPE:文件的内容类型,在当前场景中,我们上传的是文本文件,因此使用“text/plain”。
请注意,我们不会向导入参数 IV_CHUNK_SIZE 传递任何值,而是让 API 客户端桩使用与此参数关联的默认值(即 8 MB)。
处理成功/错误情况:
- 根据 API 调用是否成功显示 API 响应。
关闭连接:
- 关闭与存储服务的 HTTP 连接。
9. 恭喜
恭喜!您已成功完成“将文件上传到 Cloud Storage 存储桶”Codelab。
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 可与各种应用和平台搭配使用。
您现在可以继续学习以下 Codelab,继续了解如何使用 ABAP SDK 访问各种 Google Cloud 服务。
- 向 Pub/Sub 发送事件
- 接收来自 Cloud Pub/Sub 的事件
- 使用 Cloud Translation API 翻译文本
- 使用 DLP API 进行 PII 密文处理
- 从 ABAP 调用 BigQuery ML
10. 清理
如果您不想继续学习与 ABAP SDK for Google Cloud 相关的其他 Codelab,请继续执行清理操作。
删除项目
- 删除 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