はじめに

今日は SAP CAP(Cloud Application Programming Model)の Node.js プロジェクトをゼロから作成し、SAP BTP の Cloud Foundry 環境にデプロイするまでの全手順を記録します。途中いくつかのエラーに遭遇しましたが、すべて解決できました。同じところでハマる方の参考になれば幸いです。

環境情報

項目

バージョン

OS

Windows 11 + WSL2(Ubuntu 24.04)

Node.js

v20.20.2(nvm で管理)

@sap/cds-dk

9.8.3(グローバル)

@sap/cds

9.8.4(プロジェクト)

CF CLI

v8.18.0

BTP リージョン

Singapore - Azure(AP21)

ステップ1:CF CLI のインストール

# Cloud Foundry 公式 apt リポジトリを追加
wget -q -O - https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | sudo apt-key add -
echo "deb https://packages.cloudfoundry.org/debian stable main" | sudo tee /etc/apt/sources.list.d/cloudfoundry-cli.list

# インストール
sudo apt-get update
sudo apt-get install cf8-cli

# 確認
cf --version

⚠️ Warning: apt-key is deprecated という警告が出ますが無視して問題ありません。OK と表示されれば成功です。

ステップ2:BTP CF 環境にログイン

cf login -a https://api.cf.ap21.hana.ondemand.com

メールアドレスとパスワードを入力後、Org と Space を選択します。

Targeted org dfcf715btrial.
Targeted space dev.

ステップ3:CAP プロジェクトの作成

mkdir -p ~/projects
cd ~/projects
cds init my-first-cap
cd my-first-cap

ls -la で確認すると以下の構造が作成されます:

app/        ← Fiori フロントエンド
db/         ← CDS データモデル
srv/        ← OData サービス定義
.gitignore
readme.md

⚠️ ハマりポイント①:新しいバージョンの cds init では package.json が生成されません。手動で作成が必要です。

npm init -y
npm add @sap/cds @sap/cds-dk @cap-js/sqlite

ステップ4:データモデルとサービスの定義

db/schema.cds(データモデル):

namespace my.bookshop;

entity Books {
  key ID     : Integer;
  title      : String;
  author     : String;
  stock      : Integer;
}

srv/cat-service.cds(OData サービス):

using my.bookshop as my from '../db/schema';

service CatalogService {
  entity Books as projection on my.Books;
}

ステップ5:ローカルでの起動確認

cds watch

⚠️ ハマりポイント②@sap/cds のバージョンが 9.8.59.8.4 で混在していると以下のエラーが発生します。

TypeError: Cannot read properties of undefined (reading 'impl')
at hotReloading

解決方法:バージョンを統一します。

npm install @sap/cds@9.8.4

バージョンが統一されると正常に起動します:

[cds] - loaded model from 2 file(s)
[cds] - connect to db > sqlite { url: ':memory:' }
[cds] - serving CatalogService { at: '/odata/v4/catalog' }
[cds] - server listening on { url: 'http://localhost:4004' }

ブラウザで http://localhost:4004 を開くと CAP の管理画面が表示されます。

ステップ6:CF デプロイの準備

manifest.yml(CF デプロイ設定):

---
applications:
  - name: my-first-cap
    memory: 256M
    disk_quota: 512M
    buildpacks:
      - nodejs_buildpack
    random-route: true

.cfignore(デプロイ除外ファイル):

node_modules/
.git/
.vscode/
*.log

ステップ7:package.json の最終形

CF デプロイで2つのエラーに遭遇し、最終的に以下の設定が必要でした:

{
  "name": "my-first-cap",
  "version": "1.0.0",
  "scripts": {
    "start": "cds serve all --in-memory"
  },
  "engines": {
    "node": ">=20"
  },
  "cds": {
    "requires": {
      "db": {
        "kind": "sqlite",
        "credentials": { "url": ":memory:" }
      },
      "auth": {
        "kind": "mocked"
      }
    }
  },
  "dependencies": {
    "@cap-js/sqlite": "^2.2.0",
    "@sap/cds": "9.8.4",
    "@sap/cds-dk": "^9.8.3"
  }
}

⚠️ ハマりポイント③:CF 環境では CAP が自動的に HANA ドライバーを探してクラッシュします。

Error: Failed loading service implementation from @cap-js/hana

解決方法start コマンドを cds serve all --in-memory にして、cds.requires.db で SQLite を明示的に指定します。

⚠️ ハマりポイント④:CF 環境では CAP が自動的に JWT 認証を有効にして @sap/xssec がないためクラッシュします。

Error: Cannot find '@sap/xssec'

解決方法cds.requires.authkind: mocked を追加します。

ステップ8:cf push でデプロイ

cf push

成功すると以下が表示されます:

state     since                  cpu    memory        disk
running   2026-04-10T23:52:24Z   2.9%   60M of 256M   275.3M of 512M

ステップ9:動作確認

cf app my-first-cap | grep routes

表示された URL の /odata/v4/catalog にアクセスすると:

{"@odata.context":"$metadata","value":[{"name":"Books","url":"Books"}]}

OData V4 サービスが BTP Cloud Foundry 上で正常に動作していることを確認できました!

BTP コックピットで確認

マップされたルート:
https://my-first-cap-industrious-wombat-th.cfapps.ap21.hana.ondemand.com/
データ取得できるルート
https://my-first-cap-industrious-wombat-th.cfapps.ap21.hana.ondemand.com/odata/v4/catalog

まとめ

今日学んだことは以下の通りです。

  • CAP プロジェクトの基本構造(db / srv / app の3層)

  • CDS によるデータモデルとサービスの定義

  • cds watch によるローカル開発環境の起動

  • manifest.yml.cfignore による CF デプロイ設定

  • cf push による BTP Cloud Foundry へのデプロイ

ローカルとクラウドで動作が異なる点(HANA / JWT 認証の自動切替)が最大のハマりポイントでした。本番環境では HANA Cloud と XSUAA を正しく設定する必要があり、それは今後の学習テーマです。


この記事は「SAP BTP 学習」シリーズの第2回です。6ヶ月間の独学で SAP BTP 開発へのキャリアチェンジを目指しています。