高性能なExperience Cloudのアーキテクチャ設計:Salesforceコミュニティソリューションの深掘り

概要とビジネスシーン

Experience Cloudは、Salesforceプラットフォーム上に構築された、顧客、パートナー、従業員向けのパーソナライズされたデジタル体験を迅速に構築・提供するための強力なフレームワークです。SalesforceのCRMデータを活用し、セルフサービスポータル、パートナーポータル、ヘルプセンター、ブランド化されたウェブサイトなどを、コードをほとんど書かずに展開できる柔軟性と拡張性を提供します。

実際のビジネスシーン

シーンA:製造業 - パートナーポータル

  • ビジネス課題:製造業の部品サプライヤーが数多くの代理店と連携しており、注文状況の確認、在庫照会、技術サポートの要求などに遅延が発生し、パートナーエンゲージメントと効率性が低下していました。
  • ソリューション:Experience Cloudでセルフサービス型のパートナーポータルを構築。代理店がリアルタイムで在庫確認、新規注文の発注、既存注文の追跡、ケース管理、製品トレーニング資料へのアクセス、共同マーケティング資料のダウンロードが可能になりました。
  • 定量的効果:注文処理時間が30%短縮、パートナー満足度が20%向上、代理店からの電話サポート問い合わせが15%削減。

シーンB:金融サービス - 顧客セルフサービス

  • ビジネス課題:ある大手銀行の顧客が口座情報照会やローン申請の進捗確認のために頻繁にコールセンターに連絡し、コールセンターのリソースが逼迫していました。
  • ソリューション:Experience Cloudで安全な顧客セルフサービスポータルを構築。顧客は自身の口座残高、取引履歴、ローンの申し込み状況を安全に閲覧でき、FAQ検索、ドキュメントのアップロード、個人情報の更新がオンラインで可能になりました。
  • 定量的効果:コールセンターへの問い合わせ数が25%削減、顧客エンゲージメントが10%向上、ローン申請処理期間が20%短縮。

シーンC:ヘルスケア - 患者ポータル

  • ビジネス課題:病院の患者が診察予約、検査結果の確認、医師への質問において、電話や直接訪問に依存しており、手続きに手間と時間がかかっていました。
  • ソリューション:Experience Cloudでセキュアな患者ポータルを構築。患者はオンラインで診察予約、検査結果の安全な閲覧、投薬情報の確認、医師への非同期メッセージ送信、関連する健康情報の参照が可能になりました。
  • 定量的効果:診察の予約変更・キャンセル率が15%減少し、患者の待ち時間が短縮されたことによる満足度が向上。病院側の管理業務の負荷も軽減されました。

技術原理とアーキテクチャ

Experience Cloudは、Salesforceのコアプラットフォーム上に構築されており、そのセキュリティ、スケーラビリティ、信頼性を継承しています。サイトはLightning Web Components(LWC)やAuraコンポーネント、標準コンポーネントを使用して構成され、Experience Builder(エクスペリエンスビルダー)を通じて視覚的に構築されます。

基礎的な動作メカニズム

Experience Cloudサイトへのアクセス要求があると、Salesforceプラットフォームはユーザーの認証を行い、割り当てられたプロファイル、権限セット、および共有設定(Sharing Settings)に基づいてデータアクセスを制御します。Lightning Data Service(LDS)を通じてSalesforceのデータに安全にアクセスし、LWCやApexクラスを使用してビジネスロジックを実行します。コンテンツはContent Delivery Network(CDN)を通じて配信され、高速なロードを実現します。

主要コンポーネントと依存関係

  • Experience Builder:ドラッグ&ドロップでサイトを構築するWYSIWYGエディタ。テーマ、ページレイアウト、コンポーネントを管理します。
  • Lightning Web Components (LWC) / Aura Components:カスタム機能やUIを開発するためのフレームワーク。Salesforceのデータとインタラクトします。
  • CMS Connect:外部のコンテンツ管理システム(CMS)からコンテンツを統合し、一元的な情報提供を可能にします。
  • Audience Targeting(オーディエンスターゲティング):ユーザーのプロファイルや状況に基づいて、表示するコンテンツやコンポーネントをパーソナライズします。
  • Global Header/Footer, Navigation Menu, Search Component:標準で提供されるサイトの基本ナビゲーションおよび検索機能。

依存関係:Salesforce Core Platform, Salesforce CRM Data (Sales Cloud, Service Cloud), Salesforce Identity for Single Sign-On (SSO), Marketing Cloud (オプションで連携), Heroku (外部アプリケーション連携)。

データフロー

ステップ 説明 技術要素
1. ユーザーアクセス ユーザーがWebブラウザやモバイルアプリからExperience Cloudサイトにアクセス。 HTTPS, Webブラウザ
2. 認証・認可 Salesforce Identityサービスがユーザーを認証し、プロファイル、権限セット、共有設定に基づいてアクセス権を評価。 Salesforce Identity, OAuth/SSO
3. ページロード Experience Builder Runtimeがページの構造、コンポーネント、コンテンツを読み込む。静的リソースはCDN経由で配信。 Experience Builder Runtime, CDN
4. データ取得・ロジック実行 LWC/AuraコンポーネントがLightning Data ServiceやApexコントローラを通じてSalesforceデータにアクセスし、ビジネスロジックを実行。 LWC/Aura, Lightning Data Service, Apex Controller
5. データベース連携 SOQLクエリやDML操作を通じてSalesforceデータベースとデータのやり取り。 Salesforce Database
6. 外部システム連携 (オプション) 必要に応じて、Apex CalloutやMiddlewareを介して外部システムと連携。 Apex Callout, Heroku Connect, MuleSoft
7. UIレンダリング 取得したデータと実行結果に基づき、UIをレンダリングしてユーザーに表示。 LWC/Aura, HTML, CSS

ソリューション比較と選定

ソリューション 適用シーン パフォーマンス Governor Limits 複雑度
Experience Cloud 顧客・パートナー・従業員向けセルフサービス、コミュニティ、ブランド体験構築、知識共有、Salesforceデータとの密接な連携 標準コンポーネントは最適化済み。LWCによるカスタム開発で高速化可能。CDN利用。大規模なカスタムロジックや外部連携が多いとボトルネックになりうる。 Apex、SOQL、DML等のSalesforce標準制限に準拠。ページロード時のApex実行回数やデータの取得量に注意。 Experience Builder利用で低~中。LWC/Apexによる高度なカスタマイズや外部連携で高。
カスタムWebアプリケーション (例: Heroku/AWS上のNode.js/React) 極めて特殊なUI/UX要件、Salesforceデータ以外の利用が主、SalesforceのGovernor Limitsが厳しくなる大規模アプリケーション。 完全に制御可能。適切なインフラ設計と最適化で高パフォーマンスを実現できる。 Salesforce API制限(APIコール数)にのみ依存。アプリケーション側で独自にスケーリング可能。 高。インフラ構築、フルスタック開発、セキュリティ、メンテナンス全てを自前で実施する必要がある。
他社製SaaSポータルソリューション (例: HubSpot CMS Hub, Zendesk Guide) 特定のユースケースに特化(例:マーケティング重視のリードジェネレーション、ナレッジベース特化)、Salesforceデータとの連携は限定的またはAPI経由。 各ソリューションに依存。通常は最適化されている。 Salesforceとの連携があればAPI制限に依存。各SaaS独自の制限あり。 低~中。提供される機能範囲内であれば容易。カスタマイズ性は限定的。

Experience Cloud を使用すべき場合

  • ✅ Salesforce CRM データ(顧客、案件、ケース、カスタムオブジェクトなど)との密接な連携が不可欠な場合。
  • ✅ 迅速なプロトタイピングと展開、ノーコード/ローコードでの開発を優先し、市場投入までの時間を短縮したい場合。
  • ✅ 顧客、パートナー、従業員がSalesforceのデータに安全にアクセスし、インタラクションを行う必要がある場合。
  • ✅ Salesforceの堅牢なセキュリティモデル(共有設定、プロファイル/権限セット)を外部ユーザーに拡張したい場合。
  • 不適用シーン: Salesforceデータがほとんど関与しない完全に独立した外部Webサイト、または極度に高いトランザクション量とリアルタイム性を要求し、SalesforceのAPIレート制限を大幅に超えることが想定される場合。

実装例

Experience Cloudサイトで、ログインユーザーが自身のケース(Case)リストを閲覧できるようにするLightning Web Component(LWC)の実装例です。LWCからApexコントローラを呼び出し、Salesforceのデータを安全に取得・表示します。

1. Apexコントローラ (Example_CaseController.cls)

このApexクラスは、現在のユーザーに関連付けられたケースを取得します。@AuraEnabled(cacheable=true)アノテーションにより、Experience Cloudサイトでのパフォーマンス向上のため、サーバー側で結果がキャッシュされます。

public with sharing class Example_CaseController {
    /**
     * @description 現在のユーザーに関連付けられたケースを取得します。
     * @param userId フィルターするユーザーID
     * @return List<Case> 関連ケースのリスト
     */
    @AuraEnabled(cacheable=true) // Experience Cloudでキャッシュを有効化し、パフォーマンスを向上
    public static List<Case> getCommunityCases(Id userId) {
        // セキュリティのため、userIdがNullでないことを確認
        if (userId == null) {
            throw new AuraHandledException('User ID cannot be null.');
        }

        // 例として、現在のユーザーが作成したケースを返します。
        // 実際のビジネスロジックでは、ケースの所有者、関連する取引先責任者、
        // または共有設定に基づいてアクセス可能なケースをクエリする必要があります。
        // Experience Cloudの共有設定と組み合わせて、データセキュリティを確保します。
        List<Case> cases = [
            SELECT Id, CaseNumber, Subject, Status, Priority, CreatedDate
            FROM Case
            WHERE CreatedById = :userId // 例として作成者でフィルタリング
            WITH SECURITY_ENFORCED // オブジェクトとフィールドレベルセキュリティを強制適用
            ORDER BY CreatedDate DESC
            LIMIT 10 // 最大10件のケースに限定
        ];
        return cases;
    }
}

2. LWC JavaScriptファイル (communityCaseList.js)

このLWCは、Apexコントローラからケースデータを非同期で取得し、LWCのlightning-datatableコンポーネントに表示します。@wireデコレータを使用して現在のユーザーIDを取得し、そのIDを使ってApexメソッドを呼び出します。

import { LightningElement, wire } from 'lwc';
import getCommunityCases from '@salesforce/apex/Example_CaseController.getCommunityCases';
import { getUserId } from 'lightning/uiRecordApi'; // 現在のユーザーIDを取得するためのワイヤーアダプタ

// lightning-datatableの列定義
const COLUMNS = [
    { label: 'Case Number', fieldName: 'CaseNumber', type: 'text' },
    { label: 'Subject', fieldName: 'Subject', type: 'text' },
    { label: 'Status', fieldName: 'Status', type: 'text' },
    { label: 'Priority', fieldName: 'Priority', type: 'text' },
    { label: 'Created Date', fieldName: 'CreatedDate', type: 'date' }
];

export default class CommunityCaseList extends LightningElement {
    cases;         // 取得したケースデータを格納するプロパティ
    error;         // エラーメッセージを格納するプロパティ
    columns = COLUMNS; // lightning-datatableの列定義
    userId;        // 現在のユーザーIDを格納するプロパティ

    // @wireサービスを使用して、現在のユーザーIDを取得します。
    // このデータが利用可能になったときに、getCommunityCases Apexメソッドを呼び出します。
    @wire(getUserId)
    wiredUserId({ error, data }) {
        if (data) {
            this.userId = data;
            // ユーザーIDが取得できたらApexメソッドを呼び出す
            this.loadCases();
        } else if (error) {
            this.error = error;
            console.error('Error retrieving user ID:', error);
        }
    }

    // Apexメソッドを呼び出してケースデータを取得する非同期関数
    loadCases() {
        if (this.userId) { // userIdがnullでないことを確認
            getCommunityCases({ userId: this.userId }) // ApexメソッドにuserIdを渡す
                .then(result => {
                    this.cases = result;    // 取得した結果をcasesプロパティに格納
                    this.error = undefined; // エラーをクリア
                })
                .catch(error => {
                    this.error = error;     // エラーをerrorプロパティに格納
                    this.cases = undefined; // ケースデータをクリア
                    console.error('Error loading cases:', error);
                });
        }
    }
}

3. LWC HTMLファイル (communityCaseList.html)

取得したケースデータをlightning-datatableで表示します。エラー発生時にはユーザーにメッセージを表示します。

<template>
    <lightning-card title="My Cases" icon-name="standard:case">
        <div class="slds-m-around_medium">
            <template if:true="{cases}">
                <lightning-datatable
                    key-field="Id"
                    data="{cases}"
                    columns="{columns}"
                    hide-checkbox-column> <!-- チェックボックス列を非表示に -->
                </lightning-datatable>
            </template>
            <template if:true="{error}">
                <p>Error loading cases: {error.body.message}</p> <!-- エラーメッセージを表示 -->
            </template>
            <template if:false="{cases}">
                <p>No cases found or loading...</p> <!-- ケースがないか読み込み中のメッセージ -->
            </template>
        </div>
    </lightning-card>
</template>

4. LWC設定ファイル (communityCaseList.js-meta.xml)

この設定ファイルは、このLWCがExperience Cloudサイトで使用可能であることをSalesforceに伝えます。

<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>59.0</apiVersion> <!-- 現在のAPIバージョンを指定 -->
    <isExposed>true</isExposed> <!-- コンポーネントがExperience Builderで利用可能であることを示す -->
    <targets>
        <target>lightning__RecordPage</target> <!-- レコードページで利用可能 -->
        <target>lightning__AppPage</target> <!-- アプリページで利用可能 -->
        <target>lightningCommunity__Page</target> <!-- Experience Cloud ページで利用可能 -->
        <target>lightningCommunity__Default</target> <!-- Experience Builder のコンポーネントリストに表示 -->
    </targets>
</LightningComponentBundle>

これらのコンポーネントをデプロイした後、Experience Builderで新しいページを作成するか、既存のページにMy Casesという名前のLWCを追加することで、ユーザーが自分のケースリストを閲覧できるようになります。


注意事項とベストプラクティス

権限要件

  • プロファイルと権限セット:外部ユーザー向けには、Customer Community UserまたはPartner Community Userプロファイル(およびそのクローン)を使用し、最小限のアクセス権限を付与します。カスタムLWCやApexクラスへのアクセス権も明示的に設定する必要があります。
  • Apexクラスの公開:Experience CloudサイトからApexクラスを呼び出す場合は、Apexクラスがwith sharingキーワードで定義されていること、および「プロファイル」または「権限セット」で該当のプロファイル/権限セットに「Apexクラスへのアクセス」が付与されていることを確認してください。
  • データ共有:
    • 組織の共有設定(OWD: Organization-Wide Defaults):最も制限の厳しい設定から始めます。
    • 共有ルール(Sharing Rules):特定の条件に基づいてレコードへのアクセスを拡張します。
    • 共有セット(Sharing Sets)/共有グループ(Sharing Groups):Experience Cloudユーザーが、自身の取引先責任者やユーザーIDに関連するレコードにアクセスできるようにするための、コミュニティユーザー特有の共有設定です。
    • ゲストユーザー共有ルール(Guest User Sharing Rules):ログイン不要のゲストユーザーが公開データにアクセスするための共有ルールです。

Governor Limits

  • Experience CloudはSalesforceプラットフォーム上で動作するため、Apexの実行時間、SOQLクエリ数、DML操作数など、全てのSalesforce標準Governor Limits(ガバナ制限)が適用されます。
  • 特にページロード時に複数のLWCがApexを呼び出す場合、トランザクションあたりのクエリ数を意識し、Apexメソッドの効率化と@AuraEnabled(cacheable=true)の積極的な利用で制限超過を防ぎます。
  • ゲストユーザープロファイルは一部のAPIコール制限が通常のライセンスユーザーより厳しい場合があるため、大規模なデータアクセスが必要な場合はアーキテクチャ設計に注意が必要です。

エラー処理

  • Apex:try-catchブロックで例外を捕捉し、AuraHandledExceptionを使用してLWCにユーザーフレンドリーなエラーメッセージを返します。
  • LWC:エラー発生時にユーザーに明確なメッセージを表示し、必要に応じてサポートへの連絡を促します。開発者コンソールで詳細なエラーログを監視します。
  • Experience Cloudサイト:デフォルトのエラーページをカスタマイズし、サイトのブランドガイドラインに沿ったユーザー体験を提供します。

パフォーマンス最適化

  • CDN (Content Delivery Network) の活用:Experience Cloudは静的リソース(画像、CSS、JavaScript)をCDN経由で配信するため、設定を有効化し、利用を最大化します。
  • LWCの最適化:
    • Apexメソッドは@AuraEnabled(cacheable=true)を設定し、可能な限りキャッシュを利用してサーバーサイドの呼び出しを削減します。
    • @wireサービスを優先し、宣言的なデータ取得により不要なコールを減らします。
    • 大規模なデータセットを表示する場合は、ページネーションや無限スクロールを実装して一度に読み込むデータ量を制限します。
    • JavaScriptの軽量化、CSS最適化、不要なライブラリの削除を行います。
  • SOQLクエリの最適化:
    • 選択リスト(SELECT句)は必要なフィールドのみに絞り、不要なデータの取得を避けます。
    • 効率的なWHERE句を使用し、インデックス化されたフィールドを積極的に利用します。
    • N+1クエリ問題を防ぐため、親子リレーションクエリやマップを活用したクエリ最適化を検討します。
  • 画像とメディアの最適化:高解像度でファイルサイズの大きい画像は使用せず、適切な圧縮やWebPなどのモダンな画像フォーマットを検討します。
  • ゲストユーザーアクセス時の注意:ゲストユーザープロファイルでSOQLクエリが実行される場合、共有設定が非常に重要になります。適切なセキュリティ設定とクエリのチューニングを行わないと、意図しないデータ漏洩やパフォーマンス低下につながる可能性があります。

よくある質問 FAQ

Q1:Experience Cloudのサイトが見つからない、またはアクセスできないのはなぜですか?

A1:最も一般的な原因は、サイトが公開されていない、またはユーザーに適切なライセンスやプロファイルが割り当てられていないことです。サイト設定で「サイトを有効化」しているか、ユーザーのプロファイル・権限セット、および共有設定(特にゲストユーザーの場合はゲストユーザー共有ルール)を確認してください。

Q2:Experience Cloudサイトのデバッグはどうすれば良いですか?

A2:LWCやフロントエンドの問題は、Webブラウザの開発者ツール(コンソール、ネットワーク、エレメント)でデバッグします。Apexの問題は、Salesforce Developer Consoleでデバッグログを確認します。Experience Cloudサイトのデバッグログは、設定の「デバッグログ」から有効化し、外部ユーザーのアクティビティを追跡できます。

Q3:Experience Cloudサイトのパフォーマンスを監視するにはどうすれば良いですか?

A3:Salesforceの「イベントモニタリング(Event Monitoring)」で、ページロード時間やApex実行時間などのイベントデータを収集・分析できます。また、Google Analyticsなどの外部分析ツールをExperience Cloudサイトと連携させ、ユーザーの行動やサイトのパフォーマンスを詳細に追跡・可視化することも強く推奨されます。


まとめと参考資料

Experience Cloudは、Salesforceプラットフォームの堅牢な基盤の上に、顧客、パートナー、従業員向けの動的でパーソナライズされたデジタル体験を構築するための強力なツールです。アーキテクチャ設計においては、SalesforceのCRMデータとの密接な連携を最大限に活用しつつ、セキュリティ(特に共有設定)、パフォーマンス最適化(LWC、Apex、CDNの活用)、そしてGovernor Limitsへの意識が成功の鍵となります。ノーコード/ローコードでの迅速な展開から、高度なカスタム開発まで、幅広いニーズに対応できる柔軟性を持つExperience Cloudを効果的に活用することで、ビジネス価値を最大化できます。

公式リソース:

コメント