SAP 向けのインタラクティブな Google Chat アプリ

このドキュメントでは、オンプレミスまたはクラウド エディションの ABAP SDK for Google Cloud を使用して、SAP 用のインタラクティブな Google Chat アプリを構築するためのリファレンス アーキテクチャについて説明します。インタラクティブな Chat アプリを使用すると、ユーザーは通知を受け取るだけでなく、Google Workspace 内で直接、リクエストの承認や拒否などの SAP ワークフローにアクションを実行できます。

このドキュメントは、ABAP デベロッパー、SAP ソリューション アーキテクト、クラウド アーキテクトを対象としています。このドキュメントは、Google Workspace で利用可能な Chat アプリに精通していることを前提としています。

アーキテクチャ

次の図は、SAP 向けインタラクティブ チャットアプリを実装するためのリファレンス アーキテクチャを示しています。

SAP 向けのインタラクティブ チャット アプリ

このリファレンス アーキテクチャには、次のコンポーネントが含まれています。

# コンポーネント 詳細
1 SAP のプロセスまたはトランザクション ユーザーにメッセージを送信する必要がある SAP プロセスまたはトランザクション。これは、Google Chat を介してコミュニケーションをトリガーするための出発点です。
2 ABAP SDK for Google Cloud SAP システムと Google Cloud 間のブリッジとして機能し、Google Chat API との安全な HTTPS 通信を可能にします。
3 Google Chat アプリのプロジェクト Google Chat API を有効にして Chat アプリを構成した Google Cloud プロジェクト。
4 Chat スペース

SAP システムがユーザーと通信できる Google Chat 内の専用ルーム。

Chat アプリはこのスペースに存在し、Google Chat API を介して SAP システムからのリアルタイムの情報ストリームを提供します。

5 Apps Script プロジェクト

メッセージを受信して処理する Chat アプリのロジックを実装する Apps Script プロジェクト。

6 Pub/Sub

Apps Script プロジェクトは、承認や不承認などのユーザー操作をメッセージとして Pub/Sub トピックにパブリッシュします。

ABAP SDK for Google Cloud は、Pub/Sub サブスクリプションを使用して、これらのメッセージをトピックから pull します。これにより、SAP システムはこれらのアクションを処理し、ビジネス プロセスの必要な更新をトリガーできます。

使用するプロダクト

このリファレンス アーキテクチャでは、次の Google プロダクトを使用します。

  • ABAP SDK for Google Cloud: SAP システムを Google Cloud サービス(Google Chat など)に接続する ABAP アプリケーションを開発できます。
  • Google Chat: インタラクティブでコラボレーション重視の Chat アプリを作成して、コミュニケーションと生産性を高めることができます。

  • Apps Script: Google プロダクト全体でタスクの統合と自動化を可能にします。

  • Pub/Sub: 独立したアプリケーション間でメッセージを送受信できます。

ユースケース

インタラクティブ Chat アプリを使用すると、リクエストの承認や拒否など、SAP ワークフローでアクションを実行できます。次の図は、注文書(PO)と販売注文書(SO)の承認ワークフローのインタラクティブなチャット パターンを示しています。

インタラクティブ チャット アプリのワークフロー承認

次のリストは、SAP 向けインタラクティブ チャットアプリのユースケースを示しています。

  • ワークフロー イベント管理: Chat アプリを操作してワークフローを管理できます。たとえば、注文書に注意が必要な場合は、Chat アプリで次のことができます。

    • オーダーを承認する
    • 注文を拒否する
    • 詳細をリクエストする
  • システム アラート: システム管理者向けの Chat スペースにアラートを送信して、さまざまなシステムしきい値に達したことを通知できます。たとえば、ディスク容量の使用量、長時間実行オペレーション、キャッシュロック、ライセンスの有効期限切れなどです。

  • ジョブのステータスの更新: 長時間実行されるカスタムジョブの更新を、そのジョブの完了を待機している一連のユーザーに送信し、後処理オペレーションを開始できます。

設計上の考慮事項

ユースケースに合わせて Chat アプリを設計する場合、設計上の決定に影響する要因がいくつかあります。このセクションでは、このリファレンス アーキテクチャを使用して、セキュリティ、プライバシー、コンプライアンス、費用に関する特定の要件を満たすアーキテクチャを開発する際に役立つガイダンスを示します。

Google Chat アプリの設定

  • Chat アプリの名前: Chat アプリにわかりやすく意味のある名前を付けます。シームレスなユーザー エクスペリエンスを実現するため、Chat アプリの名前に、その機能や統合するサービスが正確に反映されるようにします。

  • タイムゾーン: Chat スペースは、さまざまなタイムゾーンに属するメンバーと共有できます。そのため、スペースのすべてのユーザーにとって都合のよいタイミングでメッセージを送信するように Chat アプリを設定することが重要です。または、重要なアラートや通知の場合は、共有タイムゾーンを持つ Chat スペースにメンバーを指定します。また、Chat アプリがメッセージを送信できるスペースを決定するロジックを構築します。

セキュリティ、プライバシー、コンプライアンス

機密性を維持するには、Chat スペース内でのお客様の連絡先情報、IBAN、その他の必要なデータなどの機密情報の共有を厳しく制御することが重要です。また、Chat アプリが追加されている Chat スペースに新規ユーザーを追加する場合は、このアクティビティを適切に管理できるように明確な規則を定めることが重要です。

Cloud Data Loss Prevention(DLP)API を使用して、メッセージの内容を非公開にすることもできます。DLP API を使用して SAP の機密企業データを保護する方法については、DLP API を使用した SAP のデータ保護をご覧ください。

セキュリティを確保するため、Google Workspace 管理者が Google が推奨するベスト プラクティスに従っていることを確認してください。

割り当てと上限

Google Chat API は共有サービスであるため、割り当てと制限が適用されます。割り当てを超えると、429: Too many requests HTTP ステータス コード レスポンスが返されます。割り当てと上限の詳細については、使用制限をご覧ください。

Google Chat API 自体には使用料はかかりませんが、Google Chat は Google Workspace プロダクトです。Google Workspace は、Gmail、ドキュメント、スプレッドシート、スライド、Google Chat アプリなど、一連の生産性向上ツールを備えたスイートです。料金体系は包括的です。つまり、個々のコンポーネントを選択して購入することはできません。料金について詳しくは、Google Workspace の料金をご覧ください。

接続設定オプション

このリファレンス アーキテクチャでは、Google Chat 内のインタラクションを処理するために、バックエンドとして Apps Script を使用します。Apps Script プロジェクトでホストされるコードは、JavaScript で記述する必要があります。

または、HTTP エンドポイントを使用して Cloud Run 関数または App Engine を使用して、インタラクティブな Chat アプリを構築することもできます。Google Chat で Cloud Run 関数を使用する方法については、HTTP Google Chat アプリを作成するをご覧ください。Cloud Run 関数で Chat アプリのロジックを構築するには、Cloud ライブラリを使用して、Node.js、Java、Python などの複数の言語から選択できます。Cloud Run 関数をデプロイしたら、Chat アプリの構成で [接続設定] の [HTTP エンドポイント URL] を選択し、Cloud Run 関数トリガーの URL を指定します。

始める前に

このリファレンス アーキテクチャに基づいてソリューションを実装する前に、次の前提条件を満たしていることを確認してください。

Apps Script プロジェクトを設定する

メッセージを受信して処理するには、Apps Script プロジェクトに Chat アプリのロジックを実装します。Apps Script はバックエンド ロジックと自動化を提供します。これにより、ユーザー メッセージの抽出、ボタンクリックの処理、ダウンストリーム アクションのトリガーなどのイベントを処理するコードを記述できます。

Apps Script プロジェクトを設定するには、次の操作を行います。

  1. Apps Script に移動します。
  2. メッセージを受信して処理する Chat アプリのロジックを処理するスクリプトを作成します。スクリプトの作成方法については、Google Apps Script のクイックスタートをご覧ください。

    たとえば、さまざまな関数タイプを処理する JavaScript コードを記述する必要があります。次のサンプルコードは、OnCardClicked イベントを処理する方法を示しています。

    function onCardClick(event) {
    console.info(event);
    let message = 'Button Clicked';
    // Get the function name from parameter
    var functionToCall = event.action.parameters[0].value;
    // Get the action name from parameter
    var actionTaken = event.action.parameters[1].value;
    // Call the function dynamically
    if (this[functionToCall]) {
      this[functionToCall](actionTaken);
    } else {
      // Handle invalid function name
      console.log('Function not found:', functionToCall);
    }
    return { "text": message };
    }
    

    このサンプルコードは、次の関数を実行します。

    • ボタンのクリックを読み取る: クリックされたボタンとユーザーの意図するアクションを特定します。
    • 実行する適切なコードを検出する: ボタンのクリック情報を使用して、Chat アプリ内で一致するコードを見つけます。
    • コードを実行する: 一致したコードを実行して、ユーザーがリクエストしたアクションを実行します。
    • エラーを処理する: 一致するコードが見つからない場合は、エラー メッセージが表示されます。
  3. Google Cloud プロジェクトを Apps Script プロジェクトにリンクします。プロジェクトをリンクする方法については、Google Cloud プロジェクトをリンクするをご覧ください。

  4. スクリプト用のデプロイメントを作成します。スクリプトをデプロイする方法については、デプロイメントを作成して管理するをご覧ください。

  5. デプロイ ID をメモします。デプロイ ID を確認する方法については、デプロイ ID を確認するをご覧ください。

Apps Script プロジェクトの設定の詳細については、Google Apps Script Chat アプリのクイックスタートをご覧ください。

Google Chat アプリを構成する

Google Chat アプリを構成する手順は次のとおりです。

  1. Google Cloud コンソールで「Google Chat API」を検索し、[Google Chat API]、[管理] の順にクリックします。

    Chat API に移動

  2. [構成] をクリックして、Google Chat アプリを設定します。

    1. [アプリ名] に「Quickstart SAP App」と入力します。
    2. [アバターの URL] に「https://developers.google.com/chat/images/quickstart-app-avatar.png」と入力します。
    3. [説明] に「Quickstart app for SAP」と入力します。
  3. [接続設定] で [Apps Script] を選択します。

  4. Apps Script プロジェクトを設定するで作成したスクリプトのデプロイ ID を入力します。

  5. [保存] をクリックします。

Google Chat アプリの認証を設定する

Google Chat アプリの認証には、アプリ自体として認証する方法とユーザーとして認証する方法の 2 つがあります。

ユーザーが直接操作せずにシステム通知を送信するなど、アプリで自動タスクを実行する必要がある場合は、サービス アカウントを使用します。特定のユーザーとしてメッセージを送信するなど、アプリがユーザーに代わって動作する場合は、ユーザー認証が必要です。この二重認証アプローチにより、アプリが Google Chat とやり取りする方法を柔軟に制御できます。

ABAP SDK for Google Cloud では、両方のタイプの認証を設定できます。Google Chat アプリの認証を設定する方法については、以下をご覧ください。

Google Chat API メソッドとそのサポートされている認可スコープについては、Chat アプリと Google Chat API リクエストの認証と承認をご覧ください。

このドキュメントで説明するリファレンス アーキテクチャでは、Chat アプリとして認証を使用し、認証にアクセス トークンを使用します。

Chat アプリとして認証を設定するには、次の手順を実施します。

  1. Google Cloud コンソールで、OAuth 同意画面を設定し、スコープを選択する
  2. Google Cloud コンソールでサービス アカウントを作成します。
  3. 省略可: Google Cloud プロジェクトのリソースへのアクセス権を付与するには、サービス アカウントに IAM ロールを割り当てます。詳細については、サービス アカウントに対するアクセスの管理をご覧ください。
  4. SAP システムで、次の詳細を使用してクライアント キーを構成します。

    フィールド 説明
    Google Cloud キー名 クライアント キー構成の名前を指定します。例: ABAP_SDK_CHAT
    Google Cloud サービス アカウント名

    Google Chat API へのアクセス権限を付与したサービス アカウントの名前を指定します。例: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com

    Google Cloud のスコープ API アクセス スコープ https://www.googleapis.com/auth/chat.bot を指定します。
    Google Cloud プロジェクト ID 有効な Google Chat API を含む Google Cloud プロジェクトの ID を指定します。
    コマンド名 このフィールドは空白のままにしておきます。
    認可クラス

    必要に応じて認可クラスを指定します。

    • アクセス トークンを使用した認証の場合: /GOOG/CL_AUTH_GOOGLE
    • JWT を使用した認証の場合: /GOOG/CL_AUTH_JWT
    トークンのキャッシュ保存

    Google Cloud から取得したアクセス トークンをキャッシュ保存するかどうかを決めるフラグ。

    Google Cloud への接続を構成してテストしたら、トークンのキャッシュ保存を有効にすることをおすすめします。トークンのキャッシュ保存の詳細については、トークンのキャッシュ保存を有効にするをご覧ください。

    トークンの更新期限(秒) アクセス トークンの有効期限が切れ、更新が必要になるまでの時間(秒)。デフォルト値は 3500 です。
    認可パラメータ 1 このフィールドは空白のままにしておきます。
    認可パラメータ 2 このフィールドは空白のままにしておきます。

認証を設定する詳細な手順については、アクセス トークンを使用して認証するまたは JSON Web Token を使用して認証するをご覧ください。

スペースに Google Chat アプリを追加する

  1. Google Chat アプリまたは Gmail アプリを開きます。
  2. Chat アプリを Chat スペースに追加します。Chat スペースにアプリを追加する方法については、会話またはスペースにアプリを追加するをご覧ください。

ユーザー操作用のインタラクティブなカードを設計する

カードは、視覚的に魅力的でインタラクティブな方法で情報を提示し、全体的なユーザー エクスペリエンスを向上させます。タイトル、画像、ボタンなどの要素を含めることができ、ユーザーは Chat インターフェース内で直接コンテンツを操作できます。たとえば、注文書ワークフロー カードには次のような情報が含まれます。

  • 注文番号
  • ドキュメント発行日
  • ドキュメントの種類
  • サプライヤー
  • 配送タイプ
  • SAP Fiori アプリで注文書を表示するためのリンクと、注文書を承認するためのボタン

ABAP SDK for Google Cloud を使用してインタラクティブなカードを設計するには、GitHub リポジトリのカスタム インターフェース ZGOOG_IF_CHAT_CARDS_V2 を使用します。このカスタム インターフェースには、カードの作成に必要な ABAP タイプが含まれています。次の注文ワークフローの例のカードなど、カードを作成できます。

チャットアプリのカード

カード メッセージの設計について詳しくは、Google Chat アプリ用のカードを作成するをご覧ください。

ABAP SDK for Google Cloud を使用して SAP システムから Chat スペースにメッセージを送信するには、/GOOG/CL_CHAT_V1 クラスの CREATE_MESSAGES メソッドを使用します。

次のコードサンプルは、SAP システムから Chat スペースにカード メッセージを送信する方法を示しています。

REPORT zsend_interactive_card

DATA lv_client_key TYPE /goog/keyname.
DATA ls_input      TYPE /goog/cl_chat_v1=>ty_072.
DATA lv_space_id   TYPE string.
DATA ls_widget     TYPE zgoog_if_chat_cards_v2=>ty_widget.
DATA ls_section    TYPE zgoog_if_chat_cards_v2=>ty_sections.
DATA ls_card_v2    TYPE zgoog_if_chat_cards_v2=>ty_cards_v2.
DATA ls_card       TYPE /goog/cl_chat_v1=>ty_012.
DATA ls_rb         TYPE zgoog_if_chat_cards_v2=>ty_selection_item.
DATA ls_button     TYPE zgoog_if_chat_cards_v2=>ty_button.
DATA ls_param      TYPE zgoog_if_chat_cards_v2=>ty_action_parameters.

lv_client_key = 'CLIENT_KEY'.
lv_space_id   = 'SPACE_ID'.

TRY.

    DATA(lo_chat) = NEW /goog/cl_chat_v1( iv_key_name = lv_client_key ).
  CATCH /goog/cx_sdk INTO DATA(lo_excp).
    " Handle exception here
ENDTRY.

"Building the Cards Structure
ls_card_v2-header-title     = 'Purchase Order Workflow - Level 2 Approval Alert!'.
ls_card_v2-header-subtitle  = 'PO Number: 8700000034'.
ls_card_v2-header-image_url = 'https://developers.google.com/chat/images/quickstart-app-avatar.png'.
ls_section-header = 'Purchase Order Details'.

ls_widget-decorated_text-icon-known_icon = 'INVITE'.
ls_widget-decorated_text-text = 'Document Date: 2024-10-23'.
APPEND ls_widget TO ls_section-widgets.
CLEAR ls_widget.

ls_widget-decorated_text-icon-material_icon-name = 'category'.
ls_widget-decorated_text-text = 'Document Type: Standard PO'.
APPEND ls_widget TO ls_section-widgets.
CLEAR ls_widget.

ls_widget-decorated_text-icon-material_icon-name = 'conveyor_belt'.
ls_widget-decorated_text-text = 'Supplier: 5300000061 - Cymbal Industries'.
APPEND ls_widget TO ls_section-widgets.
CLEAR ls_widget.

ls_widget-decorated_text-icon-known_icon = 'TRAIN'.
ls_widget-decorated_text-text = 'Shipping Type: RAIL'.
APPEND ls_widget TO ls_section-widgets.
CLEAR ls_widget.

ls_button-text = 'Display Purchase Order'.
ls_button-color-alpha = '1'.
ls_button-color-blue = '1'.
ls_button-color-green = '0'.
ls_button-color-red = '0'.
ls_button-on_click-open_link-url = "Add url for fiori App
APPEND ls_button TO ls_widget-button_list-buttons.
CLEAR ls_button.

ls_button-text = 'Approve Purchase Order'.
ls_button-color-alpha = '1'.
ls_button-color-blue = '0.2'.
ls_button-color-green = '0.4'.
ls_button-color-red = '0'.
ls_button-on_click-action-function = 'onCardClick'.
ls_param-key = 'functionToCall'.
ls_param-value = 'sendToPubSub'.  "Function name on Apps Script
APPEND ls_param TO ls_button-on_click-action-parameters.
CLEAR ls_param.
ls_param-key = 'action'.
ls_param-value = 'approved'.    "Indicate approval action has taken place
APPEND ls_param TO ls_button-on_click-action-parameters.
CLEAR ls_param.
APPEND ls_button TO ls_widget-button_list-buttons.
CLEAR ls_button.

ls_button-text = 'Reject Purchase Order'.
ls_button-color-alpha = '1'.
ls_button-color-blue = '0'.
ls_button-color-green = '0'.
ls_button-color-red = '0.7'.
ls_button-on_click-action-function = 'onCardClick'.
ls_param-key = 'functionToCall'.
ls_param-value = 'sendToPubSub'.  "Function name on Apps Script
APPEND ls_param TO ls_button-on_click-action-parameters.
CLEAR ls_param.
ls_param-key = 'action'.
ls_param-value = 'rejected'.    "Indicate reject action has taken place
APPEND ls_param TO ls_button-on_click-action-parameters.
CLEAR ls_param.

APPEND ls_button TO ls_widget-button_list-buttons.
CLEAR ls_button.

APPEND ls_widget TO ls_section-widgets.

APPEND ls_section TO ls_card_v2-sections.
ls_card-card = REF #( ls_card_v2 ).
APPEND ls_card TO ls_input-cards_v2.

TRY.
  mo_chat_client->create_messages( EXPORTING iv_p_spaces_id = CONV #( p_spc_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) ).
   CATCH /goog/cx_sdk INTO mo_excp.
       "Handle exception here
ENDTRY.

IF mo_chat_client->is_error( lv_ret_code ).
      "Handle error here
ELSE.
      "Handle success here
ENDIF.

次のように置き換えます。

  • CLIENT_KEY: 認証用に構成されたクライアント キー。
  • SPACE_ID: Chat スペースの一意の識別子 ID。Chat スペース ID を確認するには、ウェブブラウザで Google Chat スペースを開きます。ID は次のスクリーンショットに示すように URL で確認できます。

    Chat アプリのスペース ID

代替案の設計

Google Cloud でホストされている SAP S/4 HANA または ECC システムの場合、インタラクティブな Chat アプリを設計するために、次の代替リファレンス アーキテクチャを検討できます。

SAP 向けインタラクティブ チャット アプリの代替の設計オプション

このリファレンス アーキテクチャは、次の考慮事項に基づいています。

  1. ユーザーへのメッセージ送信を担当する送信元の SAP プロセスまたはトランザクション。
  2. ABAP SDK for Google Cloud は、Google Chat API メソッド spaces.messages.create を呼び出してメッセージを送信します。
  3. Google Chat API は、対応する Chat スペースにメッセージを送信します。
  4. ユーザーが通知を受け取ってから、ボタンをクリックするなどのアクションを実行するスペース。
  5. ユーザー操作により Apps Script プロジェクトが呼び出され、対応するイベントが処理されます。
  6. Apps Script プロジェクトは Pub/Sub API を呼び出してメッセージをパブリッシュします。
  7. Cloud Run 関数は、Eventarc トリガーを使用してメッセージを処理し、イベントを公開します。
  8. Cloud Run 関数は、サーバーレス VPC コネクタを介して SICF ノードを呼び出します。
  9. SAP システムはイベントを処理し、定義されたビジネス ロジックに基づいてダウンストリーム アクションをトリガーします。

このリファレンス アーキテクチャでは、次の 3 つのレイヤにロジックを実装する必要があります。

  • チャット メッセージの作成、イベントの処理、その後のビジネス プロセスを行う ABAP レイヤ。
  • Chat スペースでイベントを処理し、Pub/Sub トピックにメッセージをパブリッシュする Apps Script レイヤ。
  • Pub/Sub サブスクリプションからメッセージを受信する Cloud Run functions の関数。必要に応じて、メッセージをフォーマットし、VPC コネクタを介して SAP システムでホストされている SICF サービスを呼び出すことができます。

次のステップ

寄稿者

作成者: Satish Inamdar | SAP アプリケーション エンジニア

その他の寄稿者: Vikash Kumar | テクニカル ライター