Common Data Model (CDM) を使ったSAP Build Work Zoneへのコンテンツ公開と、ユースケース

## はじめに
この記事は [SAP Advent Calendar 2024](https://adventar.org/calendars/10423) の12月1日分の記事として執筆しています。

2024年7月に、SAP Build Work Zoneでカスタムアプリケーションを「ビジネスソリューション」としてまとめて公開できるようになりました。ビジネスソリューションの中で定義されたロールをそのまま利用することが可能になります。これは、S/4HANAなどの製品からコンテンツを公開するのと同じ方法です。この際に必要となるのが、カスタムアプリケーション側でのCommon Data Model (CDM) を使ったコンテンツの定義です。この記事では、CDMを使ったコンテンツ公開の概要とユースケースについて紹介します。

## Common Data Model (CDM) を使ったコンテンツ公開とは
SAP Build Work Zoneでサイトにアプリを表示させるとき、これまでは自分でページ、スペース、ロールなどを作成する必要がありました。

Common Data Model (CDM)とは、Work Zoneに表示させるコンテンツとそれらの関連を表すモデルです。専用のJSONスキーマを使用して定義します。

CDM Content Diagram（[About the Common Data Model | Help Portal](https://help.sap.com/docs/build-work-zone-advanced-edition/sap-build-work-zone-advanced-edition/creating-cdm-json-file-for-multi-tenancy-html5-app)より引用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3f98a013-46e1-9237-7bfd-2461a77823ad.png)

CDMでコンテンツを定義することにより、複数のアプリケーションを一つの「ビジネスソリューション」としてまとめることができます。Work Zoneでビジネスビジネスソリューションにひもづくコンテンツプロバイダを登録することで、定義したコンテンツを自動でWork Zoneに取り込むことができます。これによりマニュアルでのロールやスペース、ページなどの定義が不要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f81af64e-cfa5-682a-0f3d-6bd9a01063fc.png)

:::note info
Content Managerには取り込んだロールしか表示されませんが、アプリも取り込まれているので独自にスペース、ページなどを定義することも可能です
:::

## CDMを使ったコンテンツ公開の手順概要
シングルテナントのアプリケーションにおいて、CDMを使ったコンテンツの公開をするための手順について説明します。ここでは技術的な詳細については入り込みませんが、詳しく知りたい方は次の章で紹介するチュートリアルを参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/585fafbf-b0b2-0205-1f1e-08da11c68983.png)

### 1. cdm.jsonの定義
CDMでWork Zoneに公開するアプリ、ページ、スペース、ロールなどを定義するため、**cdm.json**というファイルを作成します。cdm.jsonは以下のような形式になっています（以下はスペース&ページではなくグループを利用したケース）。
書き方については[ドキュメント](https://help.sap.com/docs/build-work-zone-advanced-edition/sap-build-work-zone-advanced-edition/creating-cdm-json-file-for-multi-tenancy-html5-app)を参照してください。

```json
[
    {
    "_version": "3.0",
    "identification": {
        "id": "defaultCatalogId",
        "title": "{{title}}",
        "entityType": "catalog"
    },
    "payload": {
        "viz": [
        {
            "appId": "ns.incidents",
            "vizId": "incidents-display"
        }
        ]
    },
    "texts": [
        {
        "locale": "",
        "textDictionary": {
            "title": "Default Catalog Title"
        }
        }
    ]
    },
    {
    "_version": "3.0",
    "identification": {
        "id": "defaultGroupId",
        "title": "{{title}}",
        "entityType": "group"
    },
    "payload": {
        "viz": [
        {
            "appId": "ns.incidents",
            "vizId": "incidents-display"
        }
        ]
    },
    "texts": [
        {
        "locale": "",
        "textDictionary": {
            "title": "Business Apps"
        }
        }
    ]
    },
    {
    "_version": "3.0",
    "identification": {
        "id": "defaultRole",
        "entityType": "role",
        "title": "Default Role"
    },
    "payload": {
        "apps": [
        {
            "id": "ns.incidents"
        }
        ],
        "catalogs": [
        {
            "id": "defaultCatalogId"
        }
        ],
        "groups": [
        {
            "id": "defaultGroupId"
        }
        ]
    }
    }
]
```
### 2. cdm.jsonファイルをHTML5 Application Repositoryにデプロイ
mta.yamlでのビルドの設定により、cdm.jsonファイルがUIアプリケーションと一緒にHTML5 Application Repositoryへデプロイされるようにします。

### 3. デザインタイム用宛先の登録
デザインタイム用宛先は、Work Zoneに登録したコンテンツプロバイダがロールなどのコンテンツを取り込む際に使用されます。URL、認証情報、およびAdditional Propertiesの項目はhtml5-apps-repoのサービスインスタンスから取得します。
URLは末尾に`/applications/cdm/<sap.cloud.service>`を設定します。これにより、cdm.jsonで定義したコンテンツを取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6ad2ccd5-cd3a-5548-7b41-1445efed9b2c.png)

### 4. ランタイム用宛先の登録
ランタイム用宛先は、ユーザがタイルをクリックしてアプリケーションを開いたときに使われます。ランタイム用宛先のURLには、Work ZoneのURLと同じです（例：`https://91fec855trial.dt.launchpad.cfapps.us10.hana.ondemand.com`）。また、Additional Propertiesに`CEP.HTML5contentprovider: true`を設定するのがポイントです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/78262c4f-429d-bee9-bda9-3ce557d32ada.png)

### 5. コンテンツプロバイダーの登録
コンテンツプロバイダーはデザインタイム用宛先、ランタイム用宛先を指定して登録します。その結果、cdm.jsonで定義したコンテンツがWork Zoneに取り込まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/4f83fb84-344e-1154-33b8-e940a0e6c3c5.png)

## ユースケース
CDMを使ったコンテンツ公開のユースケースは3つあります。

### 1. シングルテナントでコンテンツを公開
シングルテナントのUI5アプリケーションをWork Zoneへ公開するケースです。単一のアプリケーションというよりは、複数のアプリケーションを一つのMTAで作成し、それらをビジネスソリューションとしてまとめて公開したいという場合に使用すると考えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/ff4abb65-1111-fc42-f761-0cd16e6207fa.png)

#### チュートリアル
以下のDeveloper TutorialのStep3で手順が紹介されています。このチュートリアルは有名な「CAPでincident managementアプリケーションを作成する」というものですが、最近の更新でコンテンツをCDMで公開する方法が追加されました。

[Develop a Full-Stack CAP Application Following SAP BTP Developer’s Guide > Integrate Your Application with SAP Build Work Zone, Standard Edition](https://developers.sap.com/tutorials/integrate-with-work-zone.html)

:::note warn
**チュートリアル実行時の注意点**
mta.yamlでデザインタイム用宛先の定義をする箇所で、URLに`${default-domain}`というパラメータを使用しています。Cloud FoundryのURLが`https://api.cf.us10-001.hana.ondemand.com`など連番付きの場合は`us10-001`が設定されますが、**この値は正しくありません**。連番はつけずに`us10`とする必要があります。URLをハードコーディングするか、デプロイ後に登録されたDestinationを修正してください。正しいURLはhtml5-apps-repoのサービスインスタンス（プラン：app-runtime）のキーで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/907c9086-d272-8f1c-ed91-324cf5557695.png)
:::

### 2. シングルテナントで異なるサブアカウントにコンテンツを公開
UI5アプリケーションがデプロイされたのとは別のサブアカウントからアプリケーションを利用するケースです。バックエンドはシングルテナントです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/755b41d2-e2b1-0ebc-1e68-d858e20a3277.png)

注意点として、バックエンドが特定のユーザロールを必要とする場合、プロバイダー側サブアカウントにもユーザ登録が必要です（※）。よってこのパターンを現実的に使うことがあるのかは疑問です。

※認証のみでよい場合はコンシュマー側サブアカウントのみにユーザ登録で利用できますが（プロバイダーとコンシュマーが同じIdPを使っている前提）、バックエンド側が特定のロールを必要とする場合はプロバイダー側サブアカウントにユーザ登録とロールコレクションの割り当てが必要でした。ランタイムの宛先がプロバイダー側のWork Zoneとなっており、プロバイダー側サブアカウントで認証しているためだと考えられます。

#### チュートリアル
以下のブログで手順が紹介されています。1.の方法と異なるのは、コンシュマー側サブアカウントにDestinationおよびコンテンツプロバイダーを登録する必要があるということです。

[Simplifying HTML5 Content Consumption Across Subaccounts](https://community.sap.com/t5/technology-blogs-by-sap/simplifying-html5-content-consumption-across-subaccounts/ba-p/13758568)

### 3. マルチテナントで異なるサブアカウントにコンテンツを公開
CAPとUI5でマルチテナントなアプリケーションを用意し、コンシュマー側サブアカウントのWork Zoneから利用するというパターンです。これがCDMを使うことで最も実現したいことだと思われます。2.の方法と異なるのは、ランタイム用宛先のURLにはコンシュマー側サブアカウントのWork ZoneのURLを指定する点です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6c425d03-ea15-14f3-e89e-c4fb2354b3c6.png)

#### チュートリアル
以下のリポジトリで手順が紹介されています。

[Implement Multitenancy in a Full-Stack CAP Application Following SAP BTP Developer’s Guide](https://github.com/SAP-samples/btp-developer-guide-cap/blob/main/documentation/saas/README.md)

:::note warn
**コンシュマー側からHTML5アプリケーションが利用できない**
このチュートリアルを私は完走できていません。手順によると、コンシュマー側サブアカウントでアプリケーションをサブスクライブしたときにHTML5 Applicationリポジトリにアプリケーションが表示されるはずです。しかし、それが出てきませんでした。そのまま先に進めるとWork Zoneでタイルを表示することはできましたが、タイルをクリックするとコンテンツを取得できずエラーになりました。

以下にIssueを上げています~~が、残念ながら更新が止まってしまっています。他にも同じ問題にぶつかっている人がいるようです~~。

[HTML5 App is not visible in SaaS consumer subaccount](https://github.com/SAP-samples/btp-developer-guide-cap/issues/116)

2025/3/14更新
以下の通り、トライアルアカウントのあるus10リージョンでコンシュマーサブアカウントからプロバイダーサブアカウントHTML5アプリケーションを利用する機能が無効化されていることが原因でした。現在は機能が有効化されており、使うことができるようになりました。

>the issue has been resolved. I opened a case with SAP and after a long investigation, the problem of not fetching the htlm5 app from the consumer to the subscriber account was that this capability is switched off by feature flag in us10 landscape, they switched it on, and this solved my issue.
https://github.com/SAP-samples/btp-developer-guide-cap/issues/116#issuecomment-2721191468
:::

## おわりに
従来は「アプリケーションの開発」と「Work Zoneのコンテンツ定義」は別の人が行うことが多かったのではないでしょうか。しかし、CDMを使いビジネスソリューションとしてコンテンツの公開が可能になったことによりコンテンツの定義も開発側のタスクになる可能性があります。ただし、シングルテナントの場合は個別にアプリケーションをデプロイしてWork Zoneでまとめるというスタイルが今後も主流な気がします。

CDMを使ったコンテンツの公開の真価が発揮されるのは、やはりマルチテナントなアプリケーションでの利用でしょう。残念ながらチュートリアルが最後まで実行できていませんが、時間をおいてやり直してみたいと思います。

## 参考
- [Federation of HTML5 Business Solutions | Help Portal](https://help.sap.com/docs/build-work-zone-advanced-edition/sap-build-work-zone-advanced-edition/federation-of-html5-business-solutions)
- [About the Common Data Model | Help Portal](https://help.sap.com/docs/build-work-zone-advanced-edition/sap-build-work-zone-advanced-edition/creating-cdm-json-file-for-multi-tenancy-html5-app)