1. はじめに
この Codelab では、ABAP SDK for Google Cloud を使用して Google Cloud Pub/Sub トピックからイベントの詳細を受信する方法について説明します。次の Google Cloud サービスを活用します。
- Cloud Pub/Sub
- Cloud Shell
前提条件
- ABAP SDK for Google Cloud がインストールされている SAP システムにアクセスできることを確認します。
- 新しいシステムを設定するには、Codelab の「Google Cloud Platform に ABAP Platform Trial をインストールして ABAP SDK をインストールする」を参照してください。
- Google Cloud プロジェクトで、Codelab「ABAP SDK を使用して SAP から Pub/Sub にイベントを送信する」の一部としてトピック
PUBSUB_DEMO_TOPICを作成している。作成されていない場合は、次のコマンドを使用して作成します。
gcloud pubsub topics create PUBSUB_DEMO_TOPIC
作成するアプリの概要
次のものを作成します。
- Pub/Sub API とのやり取りを行うための「サブスクライバー」権限を持つサービス アカウント。
- Pub/Sub トピックからメッセージを受信して確認する ABAP プログラム。
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. 始める前に
- Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクト(例:
abap-sdk-poc)を選択または作成します。 - Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。90 日間の無料トライアル アカウントを使用している場合は、この手順をスキップしてください。
- Google Cloud 上で動作するコマンドライン環境の Cloud Shell を使用します。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
- 前の Codelab「Pub/Sub にイベントを送信する」の一環として、すでに Pub/Sub API を有効にし、トピックを作成し、Pub/Sub にメッセージを公開しているはずです。
4. Pub/Sub アクセス用のサービス アカウントを作成する
Subscriber ロールを持つサービス アカウントを使用することは、ABAP プログラムが Pub/Sub からメッセージを受信する最も安全な方法です。このロールは、権限をメッセージの取得のみに制限し、潜在的なセキュリティの脆弱性を防ぎます。
サービス アカウントを作成する
必要なロールを持つサービス アカウントを作成する手順は次のとおりです。
- Cloud Shell ターミナルで次のコマンドを実行します。
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- 上記の手順で作成したサービス アカウントに必要なロールを追加します。
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/pubsub.subscriber'
上記のコマンドでは、Google Cloud プロジェクトのプレースホルダとして abap-sdk-poc を使用しています。abap-sdk-poc は、実際のプロジェクト ID に置き換えます。
- ロールが追加されたことを確認するには、[IAM] ページに移動します。作成したサービス アカウントと、そのサービス アカウントに割り当てられたロールが表示されます。
5. pull サブスクリプションについて
pull サブスクリプションの場合、SAP システムはサブスクライバー クライアントとして機能し、Pub/Sub サーバーに対してメッセージを取得するリクエストを開始します。サブスクライバー クライアントは REST Pull API を使用します。
主要な API メソッド
Cloud Pub/Sub API
- pull: メッセージを取得するリクエストを開始します。
- acknowledge: メッセージが正常に処理されたことを Pub/Sub に通知します。
ABAP SDK for Google Cloud の同等機能
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
pull サブスクリプションのメッセージのフロー
次の図は、サブスクライバー クライアントと pull サブスクリプション間のワークフローを示しています。

- Pull リクエスト: SAP システム(サブスクライバー)は、pull 方式を使用して Pub/Sub サーバーからメッセージをリクエストします。
- Pull レスポンス: Pub/Sub サーバーは、0 個以上のメッセージと確認応答 ID で応答します。メッセージがないレスポンスまたはエラーがあるレスポンスは、受信可能なメッセージが存在しないことを示すとは限りません。このレスポンスは、画像に示す PullResponse です。
- 確認応答: メッセージの処理後、SAP システムは受信した確認応答 ID とともに acknowledge メソッドを使用します。これにより、Pub/Sub がメッセージを再配信しなくなります。
6. 定期購入の設定とメッセージの送信
pull サブスクリプションを作成する
- 次の gcloud コマンドを実行して、
PUBSUB_DEMO_TOPICからメッセージを受信するPUBSUB_DEMO_SUBSCRIPTIONという名前の pull サブスクリプションを作成します。
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
メッセージをパブリッシュする
次のいずれかの方法で PUBSUB_DEMO_TOPIC にメッセージを送信します。
- プログラムを再利用する: 公開用の以前の Codelab のプログラムがある場合は、それを使用します。
- 直接公開: 簡単なテストを行うには、次のいずれかのオプションを試してください。
- Cloud Console: Google Cloud Console 内で直接公開します。詳細については、Pub/Sub のドキュメントをご覧ください。
- gcloud コマンド: 次のコマンドを実行します。
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'
7. クライアント キー構成を作成する
Google Cloud 側の前提条件の設定が完了したので、SAP 側の構成に進みます。
認証と接続に関連する構成の場合、ABAP SDK for Google Cloud ではテーブル /GOOG/CLIENT_KEY と /GOOG/SERVIC_MAP. が使用されます。
/GOOG/CLIENT_KEY テーブルで構成を維持するには、次の操作を行います。
- SAP GUI で、トランザクション コード SPRO を入力します。
- [SAP 参照 IMG] をクリックします。
- [ABAP SDK for Google Cloud] > [Basic Settings] > [Configure Client Key] をクリックします。

- フィールドに対して次の値を維持します。その他のフィールドは空欄のままにします。
フィールド | 値 |
Google Cloud キー名 | PUBSUB_SUBSCRIBER |
Google Cloud サービス アカウント名 | abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com |
Google Cloud のスコープ | https://www.googleapis.com/auth/cloud-platform |
プロジェクト ID | abap-sdk-poc |
認可クラス | /GOOG/CL_AUTH_GOOGLE |
8. Google Cloud Pub/Sub からメッセージを受信する ABAP レポートを作成する
- SAP システムにログインします。
- トランザクション コード
SE38に移動し、名前ZDEMO_RECEIVE_CPS_EVENTS.のレポート プログラムを作成します。 - 表示されたポップアップで、次の図のように詳細を入力し、[保存] をクリックします。

- 次のポップアップで、必要に応じて [Local Object] を選択するか、パッケージ名を指定します。
- ABAP エディタで、次のコードを追加します。
REPORT zdemo_receive_cps_events.
TYPES: BEGIN OF ty_event_message,
event_time TYPE timestamp,
event_type TYPE char30,
source TYPE char30,
sales_order TYPE vbeln,
END OF ty_event_message.
DATA: ls_input TYPE /goog/cl_pubsub_v1=>ty_026,
ls_input_ack TYPE /goog/cl_pubsub_v1=>ty_001,
ls_event_msg TYPE ty_event_message.
TRY.
"Open HTTP Connection
DATA(lo_client) = NEW /goog/cl_pubsub_v1( iv_key_name = 'PUBSUB_SUBSCRIBER' ).
"Populate relevant parameters
" Derive project id from the client object
DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).
" Name of the subscription from where we want to pull data
DATA(lv_p_subscriptions_id) = CONV string( 'PUBSUB_DEMO_SUBSCRIPTION' ).
" Max number of messages that will be received in 1 API call
ls_input-max_messages = 1.
"Call API method: pubsub.projects.subscriptions.pull
lo_client->pull_subscriptions(
EXPORTING
iv_p_projects_id = lv_p_projects_id
iv_p_subscriptions_id = lv_p_subscriptions_id
is_input = ls_input
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_client->is_success( lv_ret_code ).
DATA(ls_received_msg) = VALUE #( ls_output-received_messages[ 1 ] OPTIONAL ).
IF ls_received_msg IS NOT INITIAL.
"Messages published to Pub/Sub should be base-64 encoded, hence in order to get the exact message, we need to decode the data field.
"However, attributes published to Pub/Sub should be accessible as data references.
DATA(lv_msg) = |{ cl_http_utility=>decode_base64( encoded = ls_received_msg-message-data ) }|.
/ui2/cl_json=>deserialize( EXPORTING json = lv_msg
pretty_name = /ui2/cl_json=>pretty_mode-extended
CHANGING data = ls_event_msg ).
cl_demo_output=>new( )->begin_section( |Receive Events from Cloud Pubsub using ABAP SDK for Google Cloud|
)->write_text( |The below event was successfully received with message ID { ls_received_msg-message-MESSAGE_ID }|
)->write_data( ls_event_msg
)->end_section(
)->display( ).
ls_input_ack-ack_ids = VALUE #( ( ls_received_msg-ack_id ) ).
"Call API method: pubsub.projects.subscriptions.acknowledge
"Acknowledge the messages so it is not pulled again.
lo_client->acknowledge_subscriptions(
EXPORTING
iv_p_projects_id = lv_p_projects_id
iv_p_subscriptions_id = lv_p_subscriptions_id
is_input = ls_input_ack
IMPORTING
es_output = DATA(ls_output_ack)
ev_ret_code = lv_ret_code
ev_err_text = lv_err_text
es_err_resp = ls_err_resp ).
IF lo_client->is_success( lv_ret_code ).
MESSAGE lv_msg TYPE 'S'.
ELSE.
MESSAGE lv_err_text TYPE 'E'.
ENDIF.
ELSE.
MESSAGE 'No Messages were received!' TYPE 'S'.
ENDIF.
ELSE.
MESSAGE lv_err_text TYPE 'E'.
ENDIF.
"Close HTTP Connection
lo_client->close( ).
CATCH /goog/cx_sdk INTO DATA(lo_exception).
MESSAGE lo_exception->get_text( ) TYPE 'E'.
ENDTRY.
- レポートを保存して有効にします。
- レポートを実行します(F8)。
実行が成功すると、次のようなレポート出力が表示されます。

9. ABAP Pub/Sub サブスクライバー コードの説明
この ABAP プログラムは、メッセージ サブスクライバーとして Google Cloud Pub/Sub と統合されます。指定されたサブスクリプションで新しいメッセージをオンデマンドで確認し、処理してから受信を確認応答して、今後の再配信を防ぎます。
このプログラムでは、次のアクティビティが行われます。
手順
接続を確立する:
/GOOG/CL_PUBSUB_V1クラスを使用して、Google Cloud Pub/Sub サービスへの HTTP 接続を確立します。
パラメータを設定する:
- プロジェクト ID: Pub/Sub サブスクリプションが存在する関連するプロジェクト ID を抽出します。
- サブスクリプション名: メッセージを pull するサブスクリプションの名前(
PUBSUB_DEMO_SUBSCRIPTION)を指定します。 - メッセージの上限: 1 回の API 呼び出しで取得するメッセージの最大数を設定します(この場合は 1)。
メッセージの取得:
pull_subscriptionsメソッドを呼び出して、指定されたサブスクリプションからメッセージを取得します。
受信したメッセージを処理する:
- メッセージが存在する場合、プログラムはデータをデコードし、コンテンツをログに記録して、確認応答を送信します。
メッセージを確認する:
acknowledge_subscriptionsメソッドを呼び出して、メッセージの受信が成功したことを示す確認応答を Pub/Sub に送信します。これにより、再配信を防ぐことができます。
成功/エラーを処理する:
- メッセージが受信されて確認応答された場合は成功メッセージを表示し、さまざまな障害シナリオ(メッセージが受信されない、API エラーなど)のエラー メッセージを表示します。
接続を閉じる:
- Pub/Sub サービスへの HTTP 接続を閉じます。
10. 完了
「ABAP SDK for Google Cloud を使用して Cloud Pub/Sub からイベントを受信する」Codelab を完了しました。
ABAP と Google Cloud Pub/Sub の間のブリッジが正常に構築されました。この Codelab を完了すると、イベント ドリブン メッセージングと、ABAP SDK for Google Cloud を使用して Google Cloud サービスと統合する方法をしっかりと理解していることを証明できます。お疲れさまでした。
ABAP と Google Cloud サービス間の新しいレベルの統合が実現しました。次のエキサイティングなオプションで視野を広げましょう。
- ABAP SDK for Google Cloud で Translation API を使用する
- チャンクを使用して大きなオブジェクトを Cloud Storage バケットにアップロードする
- ABAP SDK for Google Cloud を使用して Secret Manager から認証情報/シークレットを取得する
- ABAP から Vertex AI test-bison を呼び出す
- ABAP から BigQuery ML を呼び出す
11. クリーンアップ
ABAP SDK for Google Cloud に関連する追加の Codelabs を続行しない場合は、クリーンアップに進んでください。
プロジェクトの削除
- 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-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com