Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
MakotoS
Product and Topic Expert
Product and Topic Expert
3,477


<<English version is here>>

1.はじめに





本ブログは、How to extend SAP S/4HANA with SAP Cloud Platformのブログシリーズの第4回としてS/4HANAのイベント連携についてご紹介します。SAP S/4HANAでなんらかのイベントが起きたことをきっかけに外部のシステムにデータを送信したり、SAP S/4HANAのオブジェクトに追加ロジックから変更を加えたりするなど、普通のAPI連携ではできないようなことを実現することが可能です。

  1. SAP Cloud Platformでの拡張開発概要

  2. SAP S/4HANAのAPIの探し方

  3. SAP S/4HANAのAPIの使い方

  4. APIが存在しない場合の対応(順番を変えました。あとで更新します)

  5. SAP S/4HANAとのイベント連携    <<<<HERE


一般的にSAP S/4HANAのアドオン開発では”Keep the Core Clean”の原則に則った開発が推奨されています。すなわち、S/4HANAの中に標準アプリケーションとカスタム開発が渾然一体となった状態で管理されるのではなく、SAP S/4HANAの内部はツールで拡張できるIn-App拡張のレベルにとどめ、ソースを書くような開発(拡張)に関してはSAP S/4HANAの外部で行うというものです。以前のブログでもご紹介しましたが、これをSide-by-Side拡張と呼びます。






この考え方はアプリケーションの起点がSAP Cloud Platform側にある場合は想像がしやすいかと思います。以前の本名さんのブログでもご紹介されていた通り、外部にUIつきのアプリケーションをつくり、SAP S/4HANAのOData APIを呼び出すことでデータを照会したり、登録したりすることができます。また、この際にOData APIのWrapperライブラリであるSAP Cloud SDKを内部で利用することも可能です。

SAP Cloud PlatformからSAP S/4HANAのAPIへアクセスイメージ

では逆に、SAP S/4HANAのオブジェクトが登録された、もしくは変更されたことを起点に何か外部にアクションを起こしたい場合はどのような手法をとることができるでしょう?上記の例と同じように外部から、API呼び出しを一定間隔でポーリングで行い、登録や変更をチェックすることもできますが、リアルタイム性が下がってしまいます。
ここででてくるのがイベントベースの連携です。



SAP S/4HANAのイベントがSAP Cloud Platformのロジックを実行させるイメージ



この手法をつかうことで、例えば、SAP S/4HANAの伝票が登録されたことを起点に外部システムを動かしたり、データ連携を始めたりすることが可能です。

また、従来ERPの伝票登録時・変更時に動くExitで値をすり替えていたのと同様のことをこの手法で実現できる場合もあるでしょう。


 

2.SAP S/4HANASAP Cloud Platform Enterprise MessagingによるEvent Driven Architecture


もう一段階細かく見ていきましょう。

今回実現するアーキテクチャのパターンは以下のような形です。


S/4HANAで発生したイベントはSAP Cloud Platform Enterprise Messagingに送られます。
Enterprise Messagingから先は複数のランタイムへ同報配信することも可能です。

上の図では3種類のシステム(SAP Cloud Platform Integration、Extension Factory Serverless Runtime、各種Webアプリ)がEnterprise Messagingからデータを受け取っていますが、どのシステムで受け取るのかは自由に決めることができます。

 

各コンポーネントを簡単にご紹介します。

1.SAP S/4HANAのEnterprise Event Enablement機能



まず、S/4HANAのEnterprise Event Enablementの機能を使うことで、S/4HANAで起きたイベントをSAP Cloud Platform Enterprise Messagingというミドルウェア経由で外部に渡すことが可能です。この機能で現在サポートされているプロトコルはMQTT (over Websocket)です。


https://help.sap.com/viewer/810dfd34f2cc4f39aa8d946b5204fd9c/1909.002/en-US/c200f98fadb64ff1828ed569...

2.SAP Cloud Platform Enterprise Messaging


SAP Cloud Platform Enterprise Messagingは非同期メッセージングのためのミドルウェアサービスです。間にEnterprise Messagingをおくことで、送信処理と受信処理を分離する非同期メッセージングを実現したり、メッセージ処理の負荷を平準化したりすることができます。

https://discovery-center.cloud.sap/serviceCatalog/enterprise-messaging

3.SAP Cloud Platform Extension Factory, Serverless Runtime



SAP Cloud Platform Extension Factory, Serverless RuntimeはSAP Cloud Platformの中でサーバレス 環境を構築するためのランタイムです。世の中一般のサーバーレス環境と同様、サーバーのリソースの管理等が不要でイベントドリブンでロジックを実行させることができます。


https://discovery-center.cloud.sap/serviceCatalog/extension-factory-serverless-runtime

4.SAP Cloud Platform Integration


 

 

 

 

 

 

 

SAP Cloud Platform IntegrationはSAP Cloud PlatformのProcess Integrationのためのミドルウェアサービス(iPaaS)です。現在、複数のIntegration系サービス(Cloud Platform Integration、API Management、Open Connector) が統合され、Integration Suiteとして提供されるようになってきています。その中でもSAP Cloud Platform Integrationはその中核をなすコンポーネントです。

https://discovery-center.cloud.sap/serviceCatalog/integration-suite

 

なお、データ連携する上でもう一つ重要な点は、S/4HANAからのイベント情報には、どのビジネスオブジェクトなのか(購買発注、受注伝票など)、登録、変更、削除のいずれの動作が行われたのか、オブジェクトのキーの情報が含まれるのみで、その伝票やマスターデータのデータ全体は送られてこないということです。

例えば、出荷伝票の変更をしたイベントの場合、以下のような情報が送られてきます。
{"eventType":"BO.OutboundDelivery.Changed",
"cloudEventsVersion":"0.1",
"source":"https://sap.corp",
"eventID":"QgEKigAJHuqn0laStiBciA==",
"eventTime":"2020-05-25T14:19:12Z",
"schemaURL":"https://sap.corp/sap/opu/odata/IWXBE/BROWSER_SRV/",
"contentType":"application/json",
"data":{"KEY":[{"OUTBOUNDDELIVERY":"0080000005"}]}}

そのため、上記メッセージをSAP Cloud Platform IntegrationやServeless Runtime、カスタムアプリケーション等で受け取った場合、実際には受け取った伝票のキーをS/4HANAのAPIに渡して、詳細情報を取得する必要があります。

 

3.SAP S/4HANAとSAP Cloud Platform Enterprise Messagingの連携


ここからは実際の設定作業をStep by Stepでご紹介します。
同じような設定は下記ブログでも紹介されていますが、下記ブログの場合、Trialの環境を使っているため、プランに違いが生じていることに注意が必要です。

https://blogs.sap.com/2019/09/16/sap-enterprise-messaging-for-s4hana-on-premises/

本ブログでは、本番環境のplanを利用します。

まずはSAP Cloud Platformで作業です。

 

3.1  CLIのダウンロードとログイン


本ブログではEnterprise Messagingのサービスインスタンス作成をWeb画面からではなくCLI(Command Line interface)のツールを使って行います。

Cloud Foundry CLIを使ったことがない方は是非PCにインストールをして使ってみてください。

Cloud Foundry CLIのダウンロードはこちら

https://docs.cloudfoundry.org/cf-cli/install-go-cli.html

Cloud Foundry CLIを使ってログインするためのチュートリアルはこの辺りになります。

https://developers.sap.com/tutorials/cp-cf-download-cli.html

 

3.2 サービスインスタンス作成


SAP Cloud Platform Enterprise Messagingのサービスインスタンス(サービスの実体)を作るための設定ファイルを作成しましょう。まずパラメータを保存するJSON形式のテキストファイルをローカルPCにparam.jsonという名前で保存します。
{
"options": {
"management": true,
"messagingrest": true,
"messaging": true
},
"rules": {
"topicRules": {
"publishFilter": [
"${namespace}/*"
],
"subscribeFilter": [
"${namespace}/*"
]
},
"queueRules": {
"publishFilter": [
"${namespace}/*"
],
"subscribeFilter": [
"${namespace}/*"
]
}
},
"version": "1.1.0",
"emname": "EM1",
"namespace": "SAPJP/EM1/S4HANA"
}

次に以下コマンドでem1という名前のサービスインスタンスを作成します。
cf create-service enterprise-messaging default <サービスインスタンス名>  -c <オプション>
cf create-service enterprise-messaging default em1 -c param.json

サービスがちゃんと作成されたかcf service コマンドで確認します。
cf service- <サービスインスタンス名> でサービスインスタンスの情報が取得できます。
cf service em1

name: em1
service: enterprise-messaging
tags:
plan: default
description: Connect applications, services and systems across different landscapes.
documentation: https://help.sap.com/viewer/bf82e6b26456494cbdd197057c09979f/Cloud/en-US/df532e8735eb4322b00bfc7e42f...
dashboard:
service broker: sm-enterprise-messaging-service-broker-a6a59ffd-b691-49b4-b439-d4960acc2065

Showing status of last operation from service em1...

status: create succeeded
message:
started: 2020-05-24T23:39:31Z
updated: 2020-05-24T23:40:33Z

There are no bound apps for this service.

Upgrades are not supported by this broker.

 

3.3 サービスキー作成


サービスインスタンスをアプリケーションから使う場合は、アプリケーションにバインドすることで環境変数にアクセス情報を付与することができますが、今回のS/4HANA連携のように外部のシステムからアクセスさせたい場合はサービスキーを作成して、アクセス情報を取得します。
次のコマンドでサービスキーを作成します。
cf create-service-key <サービスインスタンス名> <サービスキー名>でサービスキーが作成できます。
cf create-service-key em1 em1-key

3.4 サービスキー取得


サービスキーからアクセス情報を取得指定します。

cf service-key <サービスインスタンス名> <サービスキー名>で情報取得が可能です。
cf service-key em1 em1-key

{
"management": [
{
"oa2": {
"clientid": "<client id value>",",
"clientsecret": "<client secret value>",
"granttype": "client_credentials",
"tokenendpoint": "https://<tenant>.authentication.<region>.hana.ondemand.com/oauth/token"
},
"uri": "https://enterprise-messaging-hub-backend.cfapps.<region>.hana.ondemand.com"
}
],
"messaging": [
{
"broker": {
"type": "sapmgw"
},
"oa2": {
"clientid": "<client id value>",
"clientsecret": "<client secret value>",
"granttype": "client_credentials",
"tokenendpoint": "https://<tenant>.authentication.<region>.hana.ondemand.com/oauth/token"
},
"protocol": [
"amqp10ws"
],
"uri": "wss://enterprise-messaging-messaging-gateway.cfapps.<region>.hana.ondemand.com/protocols/amqp10ws"
},
{
"broker": {
"type": "sapmgw"
},
"oa2": {
"clientid": "<client id value>",
"clientsecret": "<client secret value>",
"granttype": "client_credentials",
"tokenendpoint": "https://<tenant>.authentication.<region>.hana.ondemand.com/oauth/token"
},
"protocol": [
"mqtt311ws"
],
"uri": "wss://enterprise-messaging-messaging-gateway.cfapps.<region>.hana.ondemand.com/protocols/mqtt311ws"
},
{
"broker": {
"type": "saprestmgw"
},
"oa2": {
"clientid": "<client id value>",,
"clientsecret": "<client secret value>",,
"granttype": "client_credentials",
"tokenendpoint": "https://<tenant>.authentication.<region>.hana.ondemand.com/oauth/token"
},
"protocol": [
"httprest"
],
"uri": "https://enterprise-messaging-pubsub.cfapps.<region>.hana.ondemand.com"
}
],
"namespace": "sap/scp/em1",
"serviceinstanceid": "7dbde612-2898-4001-a868-2f1ff8cbb03c",
"xsappname": "default-7dbde612-2898-4001-a868-2f1ff8cbb03c-clone!b57|xbem-service-broker-!b25"
}


 

messagingの中にはAMQP、MQTT、HTTP RESTの3種類のアクセス情報が入っています。

特にS/4HANAとの連携にはMQTTを利用するので、MQTTの情報をメモしておきます。

  • URI

  • Client ID

  • Client Secret

  • Token Endpoint


3.5 証明書ファイルのダウンロード


ブラウザからEnterprise MessagingのToken Endpointにアクセスして証明書を落とします。



ここからはSAP S/4HANAの設定です。

3.6 証明書のインポート


t-code STRUST



 

 

 

 

SSL client SSL Client(Standard)をダブルクリック


 

 

3.3でダウンロードしたファイルをインポート


t-coe SMICMで(ICM) サーバーを単独で再起動するか、ABAPシステム全体を再起動します。

 

3.7 チャネル関連設定へ移動


T-code SPRO ”SAP Reference IMG”を押下

SAP NetWeaver-> Enterprise Event Enablement->Administration->Channel Connection Settings



3.8 HTTP宛先作成


HTTP宛先を作成するため、“Manage RFC Destination” を選択


作成ボタンを押して新規HTTP宛先(Enterprise Messagingへの接続情報)を定義。


Connection TypeはG(外部接続)を利用します。




上記サービスキーの情報の “uri” をつかい、ホスト名 (“wss:///”を除いたもの) とパスを入力。

 

Logon and Securityタブで、SSL設定を Activeに変更し、t-code STRUST.で設定したDEFAULT SSL Client(Standard) を選択。



3.9 OAuthクライアント設定


SAP S/4HANAからEnterprise Messagingへの認証はOAuthのClient Credential Flowを利用しますので、OAuthの設定をします。
Manage OAuth 2.0 Account Client Setup


 

新規ブラウザのウィンドウが開くので、ユーザーIDとパスワードを入れてシステムにログインします。


ログインができたら、“Create”を押します。


 

 

プロファイルに“/IWXBE/MGW_MQTT”を選択し、Configuration nameは自由に入力します。
OAuth 2.0 Client IDにサービスキーのclientidを入れて OKを押す。


Client Secret (サービスキーのclientsecret)を入力。


認可エンドポイントにはトークンエンドポイントの “token”部分を “authorize”で置き換え。
“https://” はすでにあるので入力しない。

“Header Field”と “Client Certificate”を選択します。


“Save”を押します。


 



3.10 チャネル作成


次にチャネルとパラメータを追加します。


 

"New entries"を押して新規エントリを追加し、Channel Name、Destination name、Topic space、descriptionを入力します。
Channel Name :任意の値
Protocol: MQTT_311?WS
Destination:3.8で作ったHTTP宛先
Topic space : Enterprise MessagingのNamespaceに合わせる


エントリを選択し、 “Parameters”をダブルクリックします。


 

“New Entries”を押下し、パラメータを足します。


値を入れて保存します。

OAUTH_20_CONFIGURATIONには上記3.9で入力した名前を入力。

OAUTH_20_CLIENT_PROFILEには、 /IWXBE/MGW_MQTTという固定値を入力します。


 


ボタンを押して照会モードに変更。


“Active<->Inactive” を押して有効化します。



 


3.11 サービス設定の確認


 


ここにサービス:IWXBE、Enablement Service Registory:CL_BEH_SERVICEのエントリがあることを確認します。


3.12 イベントトピック設定


Maintain Event Topicを選択。


チャネル名を入力してエンターを押します。


Business Object Eventの新規エントリをいれます。

下のように “BO/OutboundDelivery/*” をいれると、出荷伝票の全てのイベント (登録、変更、削除)が捕捉されます。


 

ここからSAP Cloud Platform Cockpitで作業をします。

3.13 SAP Cloud Platform Enterprise Messagingサブスクリプション


subaccountを選択し、メニューから“Subscription”を選びます。

“Go to Application”をクリックします。


 

Enterprise Messaging のアドミンページで、Message Client をクリックします。


このサービスインスタンスは最初にCF CLIから作ったものが出てきています。


“Create Queue”を選択。


 

任意の名前をつけて作成します。




ここでつくったQueueは下の図でいうこの部分赤枠の部分の設定です。


 

次に、QueueからTopicに対してSubscriptionを行います。

ActionをクリックしてQueue Subscriptionsを選択。


今回は出荷伝票に入ったTopicをこのQueueに持ってくる設定をします。


S/4HANAで設定した情報をもとにTopicの情報を入れてAddを押します。


ここの設定をすることで、QueueがTopicに対して待ち受けることができるようになり、Topicに入ったメッセージがQueue側にくることができるようになりました。
これで下の図の赤枠の中の接続部分が完了しました。



 

もしも、メッセージがQueueに入った際に外部へHTTPリクエストを出したい場合、Webhookを作ることもできます。AMQPで送る場合はこの設定は不要です。

別のQueueを作成し、Webhookの設定をしてみましょう。
Webhooks タブに行き、“Create Webhook”を押します。


subscription名をつけ、宛先のURL を入力して作成します。



初回作成時は休止状態になっているので、"Resume"ボタンをドロップダウンリストから選択して再開します。


 

 

3.受け取りシステム側の設定など


QueueをAMQP over websocketで受け取る設定の詳細は省きますが、ハイライトで画面ショットを載せます。

SAP Cloud Platform Extension Factory, Serverless RuntimeでのTriggerの設定


設定したQueue名を利用して追加。


サービスキーの情報を利用して接続。


Enterprise Messagingからデータを受け取るためのサンプルコードはこのあたりです。
Java
https://github.com/SAP-samples/enterprise-messaging-client-java-samples
Node
https://github.com/SAP-samples/enterprise-messaging-client-nodejs-samples

4.さいごに


Eventを利用した非同期のメッセージングは今後のシステムアーキテクチャでは非常に重要な連携方式になってきますので、是非試してみてください。

Enterprise Messaging Developer Tutorial
https://developers.sap.com/tutorial-navigator.html?tag=products:technology-platform/sap-cloud-platfo...

S/4HANA On-Premise Enterprise Event Enablement Online Help
https://help.sap.com/viewer/810dfd34f2cc4f39aa8d946b5204fd9c/1909.002/en-US/c200f98fadb64ff1828ed569...

SAP Cloud Platform Enterprise Messaging Online Help
https://help.sap.com/viewer/product/SAP_ENTERPRISE_MESSAGING/Cloud/en-US

SAP Cloud Platform Extension Factory Serverless Runtime Online Help
https://help.sap.com/viewer/product/XF_SERVERLESS_RUNTIME/Cloud/en-US

SAP Cloud Platform Integration Online Help
https://help.sap.com/viewer/product/CLOUD_INTEGRATION/Cloud/en-US