TECH × STORIES BLOG

【Clean Core実践】SAP BTPとCAP (Node.js) で実現するS/4HANAのSide-by-Side拡張開発

こんにちは。株式会社アイディエージコンサルティングで、SAPテクニカルコンサルタントおよびアーキテクトを務めているエンジニアのTです。

前回は「S/4HANA移行におけるカスタムコードの改修とモダンABAP」について解説しました。その中で、今後のSAP導入における最重要キーワードとして**「Clean Core(クリーンコア)」**に少しだけ触れました。

従来のSAP導入では、足りない機能があればECCの内部に「アドオン(Zプログラム)」をゴリゴリと作り込むのが当たり前でした。しかし、この密結合なアーキテクチャが、昨今のS/4HANAバージョンアップやクラウドリフトの巨大な障壁となっています。

そこで今回は、S/4HANA本体には手を加えず、外部のクラウド基盤であるSAP BTP (Business Technology Platform) 上で拡張機能を開発する**「Side-by-Side拡張」と、それを強力に後押しするフレームワーク「SAP CAP (Cloud Application Programming Model)」**について、実際のコードを交えて解説します。


1. そもそも「Side-by-Side拡張」とは何か?

SAPの拡張手法は、大きく分けて以下の2つに分類されます。

  1. In-App拡張 (On-Stack拡張): S/4HANAのシステム内部で行う拡張。Key Userツールを用いた画面レイアウト変更や、S/4HANA Cloud環境で提供される「SAP S/4HANA Cloud ABAP Environment (Embedded Steampunk)」を用いた開発が含まれます。
  2. Side-by-Side拡張: S/4HANAの外側(主にSAP BTP上)に独立したアプリケーションを構築し、API(ODataやRESTなど)を通じてS/4HANAと疎結合で連携する手法。

Side-by-Side拡張の最大のメリットは、**「ERP本体のバージョンアップに影響されない独立したライフサイクルを持てること」**です。S/4HANA側は標準機能(Fit-to-Standard)を極力維持し、自社独自の複雑なロジックや、外部のSaaS(Salesforceや外部AIサービスなど)との連携部分はBTP上に切り出すことで、俊敏性の高いシステムを構築できます。


2. SAP CAP (Cloud Application Programming Model) の魅力

BTP上でアプリケーションを開発する際、一からすべてをコーディングするのは非効率です。そこでSAPが提供しているのが、エンタープライズグレードのクラウドアプリケーションを迅速に構築するためのフレームワーク**「SAP CAP」**です。

CAPの主な特徴は以下の通りです。

  • 言語の選択肢: Node.js または Java を公式にサポートしています。(※本記事では、フロントエンドエンジニアにも馴染み深いNode.jsを前提とします)
  • 宣言的アプローチ: データベースのスキーマやAPIの定義を、前回の記事でも登場した CDS (Core Data Services) を使って記述します。
  • ボイラープレートコードの削減: CDSで定義したモデルから、OData V4のAPI(CRUD処理)をフレームワークが自動生成してくれます。開発者は「独自のビジネスロジック」の記述にのみ集中できます。

3. 【コード解説】CAP (Node.js) でS/4HANAのAPIを呼び出して拡張する

ここでは、「BTP上のカスタムアプリから、S/4HANAの標準API(Business Partner)を呼び出し、そこに独自のビジネスロジック(例:外部システムの与信スコアを付与する)を追加してフロントエンドに返す」というよくあるシナリオを想定した実装を見てみましょう。

ステップ1: 外部サービスの取り込みとCDSによるサービス定義

まず、S/4HANAのOData APIの仕様(EDMXファイル)を取り込み、それをラップする独自のサービスを srv/service.cds に定義します。

// srv/service.cds
using { API_BUSINESS_PARTNER as bupa } from '../srv/external/API_BUSINESS_PARTNER';

service CustomPartnerService {

    // S/4HANAのビジネスパートナー(A_BusinessPartner)をプロジェクション(投影)
    @readonly
    entity BusinessPartners as projection on bupa.A_BusinessPartner {
        key BusinessPartner as ID,
        BusinessPartnerFullName as FullName,
        BusinessPartnerIsBlocked as IsBlocked,
        
        // BTP側で独自に追加する仮想項目(S/4HANAには存在しない)
        virtual CreditScore : Integer
    };
}

ステップ2: Node.jsによるカスタムロジックの実装

次に、上記で定義したODataサービスが呼び出されたときの振る舞いを srv/service.js (JavaScript) に記述します。

// srv/service.js
const cds = require('@sap/cds');

module.exports = cds.service.impl(async function() {
    
    // S/4HANAの外部サービスに接続するためのインスタンスを取得
    const bupaService = await cds.connect.to('API_BUSINESS_PARTNER');

    // BusinessPartnersエンティティに対するREAD要求をフックする
    this.on('READ', 'BusinessPartners', async (req) => {
        
        // 1. S/4HANAへクエリを転送し、標準データを取得
        // req.queryには、フロントエンドからのフィルタやページネーション情報がそのまま入っている
        const partners = await bupaService.tx(req).run(req.query);

        // 2. 取得結果が配列でない場合の考慮(単一レコード取得時)
        const results = Array.isArray(partners) ? partners : [partners];

        // 3. 取得したデータに対して、BTP側で独自のロジック(仮想項目の計算など)を付与
        for (const partner of results) {
            if (partner.ID) {
                // ※本来は外部API等を呼んでスコアを取得するが、ここではモックロジック
                partner.CreditScore = Math.floor(Math.random() * 100) + 1;
                
                // ブロックされている取引先はスコアを0にする独自ロジック
                if (partner.IsBlocked) {
                    partner.CreditScore = 0;
                }
            }
        }

        // 4. 加工したデータをフロントエンドへ返す
        return partners;
    });
});

💡 コードの解説とポイント

  1. プロキシとしての役割: BTP側のCAPアプリがフロントエンドからのリクエストを受け取り、cds.connect.to() でS/4HANAへリクエストを中継(プロキシ)しています。
  2. this.on('READ', ...): これはCAPのイベントハンドラです。CRUD操作(READ, CREATE, UPDATE, DELETE)の前後(before, on, after)にカスタムロジックをフック(介入)させることができます。
  3. 仮想項目のマージ: ERP側に不要な項目を作らず(Clean Coreの維持)、BTP側で動的に項目(CreditScore)を計算して付与しています。これにより、ERPのデータモデルを汚さずに要件を満たせます。

4. セキュアな連携を支えるBTPの必須アーキテクチャ

上記のコードをローカルで動かすのは簡単ですが、実際のエンタープライズ環境(クラウド)でS/4HANAと安全に通信させるためには、BTPの様々なインフラサービスを組み合わせる必要があります。

アーキテクチャを設計する上で、最低限押さえておくべき主要コンポーネントは以下の3つです。

  1. SAP Cloud Connector:
    • オンプレミス(またはプライベートクラウド)にあるS/4HANAと、パブリッククラウドであるSAP BTPを安全に接続するためのVPNトンネルのような役割を果たします。外部からS/4HANAのポートを直接公開する必要がなくなり、セキュアな通信が担保されます。
  2. Destination Service (宛先サービス):
    • S/4HANAのホスト名、ポート、認証情報(Basic認証やOAuthなど)を安全に一元管理するBTPのサービスです。コードの中にURLやパスワードを直書きする(ハードコーディング)のを防ぎ、環境(開発・検証・本番)ごとの接続先切り替えを容易にします。
  3. XSUAA (Authorization and Trust Management):
    • アプリケーションの認証・認可を司るサービスです。OAuth 2.0ベースで動作し、「プリンシパルプロパゲーション(ユーザーの伝播)」を設定することで、BTPにログインしたユーザーの権限情報をそのままS/4HANA側へ引き継ぎ、適切なデータアクセス制御を行うことができます。

5. まとめと今後の展望

SAP開発の世界は、単一のシステム内で完結する「モノリス(一枚岩)」から、APIを介して複数のクラウドサービスを組み合わせる「コンポーザブル」なアーキテクチャへと劇的なパラダイムシフトを迎えています。

これまでABAP一本で戦ってきたSAPエンジニアにとって、Node.jsやJavaScript、Gitによるバージョン管理、CI/CDパイプラインの構築といったオープン系・Web系の技術スタックを習得するのは容易ではありません。しかし、だからこそ、**「業務知識(ERPの仕様)とクラウドネイティブ技術(BTP/CAP)の両方を理解できるフルスタックなSAPエンジニア」**の市場価値は、現在かつてないほど高まっています。

S/4HANAへの移行は、単なるDBの載せ替えではなく、アーキテクチャそのものを刷新する絶好のチャンスです。ぜひ、新しい技術に積極的にチャレンジして、お客様の真のDXを後押ししていきましょう。

【We are Hiring!】

株式会社アイディエージコンサルティングでは、S/4HANAのコア領域を支えるABAPerはもちろん、SAP BTPを活用したSide-by-Side開発(Node.js / Java / React / Vue)を推進するクラウドアーキテクトを積極採用中です。「レガシーERPの刷新」というやりがいのあるプロジェクトに、モダンな技術スタックで挑みたい方。ぜひカジュアル面談でお話ししましょう!エントリーは採用特設サイトからお待ちしています。

コメント

この記事へのコメントはありません。