Product Information
How to use SAP S/4HANA Event Enablement with SAP Cloud Platform (JA)
<<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連携ではできないようなことを実現することが可能です。
- SAP Cloud Platformでの拡張開発概要
- SAP S/4HANAのAPIの探し方
- SAP S/4HANAのAPIの使い方
- APIが存在しない場合の対応(順番を変えました。あとで更新します)
- 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のイベントがSAP Cloud Platformのロジックを実行させるイメージ
この手法をつかうことで、例えば、SAP S/4HANAの伝票が登録されたことを起点に外部システムを動かしたり、データ連携を始めたりすることが可能です。
また、従来ERPの伝票登録時・変更時に動くExitで値をすり替えていたのと同様のことをこの手法で実現できる場合もあるでしょう。
2.SAP S/4HANAとSAP 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機能
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
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/df532e8735eb4322b00bfc7e42f84e8d.html
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への接続情報)を定義。
上記サービスキーの情報の “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とパスワードを入れてシステムにログインします。
プロファイルに“/IWXBE/MGW_MQTT”を選択し、Configuration nameは自由に入力します。
OAuth 2.0 Client IDにサービスキーのclientidを入れて OKを押す。
認可エンドポイントにはトークンエンドポイントの “token”部分を “authorize”で置き換え。
“https://” はすでにあるので入力しない。
“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という固定値を入力します。
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 をクリックします。
任意の名前をつけて作成します。
ここでつくったQueueは下の図でいうこの部分赤枠の部分の設定です。
次に、QueueからTopicに対してSubscriptionを行います。
ActionをクリックしてQueue Subscriptionsを選択。
ここの設定をすることで、QueueがTopicに対して待ち受けることができるようになり、Topicに入ったメッセージがQueue側にくることができるようになりました。
これで下の図の赤枠の中の接続部分が完了しました。
もしも、メッセージがQueueに入った際に外部へHTTPリクエストを出したい場合、Webhookを作ることもできます。AMQPで送る場合はこの設定は不要です。
別のQueueを作成し、Webhookの設定をしてみましょう。
Webhooks タブに行き、“Create Webhook”を押します。
初回作成時は休止状態になっているので、”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-platform/sap-cloud-platform-enterprise-messaging
S/4HANA On-Premise Enterprise Event Enablement Online Help
https://help.sap.com/viewer/810dfd34f2cc4f39aa8d946b5204fd9c/1909.002/en-US/c200f98fadb64ff1828ed5696c86fca2.html
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