Salesforce Experience Cloudのアーキテクチャと開発:カスタムコンポーネントとセキュリティの深掘り

背景と応用シナリオ

現代のビジネス環境において、企業は顧客、パートナー、従業員といった多様なステークホルダーとの強固な関係構築が不可欠です。Salesforce Experience Cloud (エクスペリエンスクラウド) は、これらのステークホルダー向けにパーソナライズされたデジタルエクスペリエンスを迅速かつセキュアに構築するための強力なプラットフォームとして進化を続けています。かつて「Community Cloud (コミュニティクラウド)」として知られていたこの製品は、単なるコミュニティサイトの枠を超え、顧客ポータル、パートナーポータル、従業員向けナレッジサイトなど、多岐にわたる「デジタルエクスペリエンス (Digital Experience)」の構築を可能にします。

Experience Cloudを活用することで、企業は顧客満足度の向上、パートナーエンゲージメントの強化、そして従業員の生産性向上といった多大なビジネス価値を実現できます。例えば、顧客はセルフサービスポータルを通じてFAQ検索、ケースの登録と進捗確認、他の顧客との交流が可能になります。パートナーは販売資料へのアクセス、リードや商談の管理、トレーニング受講などを効率的に行えます。また、従業員は社内ナレッジベースやコラボレーションスペースで情報を共有し、部門間の連携を強化できます。このように、Experience Cloudは組織のデジタルトランスフォーメーション (DX) を加速させる上で中心的な役割を担っています。

原理説明

Experience Cloudサイトは、Salesforceのプラットフォーム上に構築され、Salesforceデータ、ビジネスロジック、セキュリティモデルとシームレスに連携します。その中核をなすのは、視覚的なサイト構築ツールである「Experience Builder (エクスペリエンスビルダー)」です。これにより、開発者でなくともドラッグ&ドロップ操作でサイトのレイアウト、デザイン、ナビゲーションをカスタマイズできます。

サイトのタイプ:LWRサイトとAuraサイト

Experience Cloudには、主に二つのサイトタイプが存在します。

Auraサイト:これはExperience Cloud (旧Community Cloud) の黎明期から存在するサイトタイプで、Auraコンポーネントフレームワークに基づいています。多くの既存サイトがこのタイプで稼働しており、幅広い機能と互換性を提供します。

LWR (Lightning Web Runtime) サイト:比較的新しいサイトタイプで、Lightning Web Components (LWC) をネイティブに実行するために最適化されています。LWRサイトは、LWCのパフォーマンス上の利点を最大限に引き出し、より高速なページロードと改善されたユーザーエクスペリエンスを提供します。SPA (Single Page Application) のように動作し、SEO (検索エンジン最適化) やアクセシビリティの面でも優れています。新規にExperience Cloudサイトを構築する場合、特別な理由がない限りLWRサイトの採用が推奨されます。

コンポーネントモデル

Experience Cloudサイトのコンテンツは、様々なコンポーネントで構成されます。

  • 標準コンポーネント:Salesforceが提供する既成のコンポーネントで、リストビュー、レコード詳細、フィードなど、一般的なユースケースに対応します。
  • AppExchangeコンポーネント:Salesforce AppExchangeを通じて入手できる、パートナー企業が開発したコンポーネントです。特定の業界や機能に特化したソリューションを提供します。
  • カスタムコンポーネント:LWCまたはAuraコンポーネントを使用して、独自のビジネス要件に合わせて開発するコンポーネントです。Salesforceデータとの連携、外部システムとの統合、特定のUI/UX (ユーザーインターフェース/ユーザーエクスペリエンス) の実装など、高い柔軟性を提供します。本記事の焦点の一つは、このカスタムコンポーネントの開発にあります。

データ共有とセキュリティ

Experience Cloudにおけるデータ共有とセキュリティは、極めて重要な要素です。Salesforceの堅牢な共有モデルを基盤とし、外部ユーザー (顧客、パートナー) にも適用されます。

  • 共有設定 (Sharing Settings):組織の共有設定 (OWD: Organization-Wide Defaults) は、最も制限の厳しいデータアクセスレベルを定義します。Experience Cloudサイトでは、外部ユーザー向けのOWDが個別に設定されることが多く、内部ユーザーよりもさらに制限されたアクセスが適用されます。ロール階層、共有ルール (Sharing Rules)、Apex管理共有 (Apex Managed Sharing) を通じて、OWDで定義されたアクセスを緩和できます。
  • プロファイル (Profile) と権限セット (Permission Set):ユーザーのオブジェクト (Object)、項目 (Field)、Apexクラス (Apex Class) へのアクセス権限を制御します。Experience Cloudユーザーには、それぞれ適切なプロファイルまたは権限セットが割り当てられ、アクセス可能なデータや実行可能な操作が決定されます。
  • ゲストユーザープロファイル (Guest User Profile):ログインを必要としない「公開サイト (Public Site)」にアクセスするユーザーのための特別なプロファイルです。匿名ユーザーに公開するコンテンツは、このゲストユーザープロファイルによってアクセス制御されます。セキュリティ上の理由から、ゲストユーザープロファイルには必要最小限の権限のみを付与し、機密データへのアクセスは厳しく制限する必要があります。

CMSとの連携

Salesforce CMS (Content Management System) は、Experience Cloudサイトで利用される画像、ドキュメント、ブログ記事などのコンテンツを一元的に管理するための機能です。CMSワークスペースで作成・管理されたコンテンツは、Experience BuilderのCMSコンポーネントを通じてサイトに容易に組み込むことができ、サイトのコンテンツ管理を効率化します。


サンプルコード

ここでは、Salesforceの取引先 (Account) レコードをExperience Cloudサイトに表示するLightning Web Component (LWC) の例を示します。このコンポーネントは、Apexクラスを通じてデータを安全に取得し、LWCで表示します。

1. Apexコントローラ:MyExperienceDataController.cls

このApexクラスは、Salesforce組織から取引先レコードを取得します。with sharingキーワードを使用することで、実行ユーザーの共有設定とセキュリティを尊重し、データへのアクセスを自動的に制限します。これにより、誤ったデータ公開を防ぎます。@AuraEnabled(cacheable=true)アノテーションは、このメソッドがLWCから呼び出し可能であり、結果がクライアントサイドでキャッシュされ得ることを示します。

// Salesforce公式ドキュメントより: Apex Developer Guide
// https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_dev_guide_examples_classes_security.htm
// このクラスは、Experience Cloudサイトから安全にデータを取得するために'with sharing'を使用します。
// 'with sharing'は、現在のユーザーの共有設定と権限を適用し、不必要なデータ漏洩を防ぎます。
public with sharing class MyExperienceDataController {

    /**
     * @description 取引先レコードのリストを取得します。
     *              このメソッドはExperience CloudサイトのLWCから呼び出し可能です。
     *              'cacheable=true'はクライアントサイドでの結果のキャッシュを許可し、パフォーマンスを向上させます。
     * @return List 取得した取引先レコードのリスト
     */
    @AuraEnabled(cacheable=true)
    public static List<Account> getAccounts() {
        // 実行ユーザーがAccountオブジェクトへのアクセス権限を持っていることを確認してください。
        // 特にゲストユーザーの場合、関連する共有ルールまたはゲストユーザーの共有設定が適切に構成されている必要があります。
        // ここでは、Id、Name、Industry項目を取得します。これらの項目への参照権限も必要です。
        return [SELECT Id, Name, Industry FROM Account LIMIT 10];
    }
}

2. Lightning Web Component (JavaScript):myAccountList.js

このLWCのJavaScriptファイルは、先ほどのApexメソッドを呼び出し、取得した取引先データを管理します。@wireデコレータを使用することで、Apexメソッドの呼び出しと結果の処理を宣言的に行えます。

// Salesforce公式ドキュメントより: Lightning Web Components Developer Guide
// https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.apex_call_server_methods_wire
import { LightningElement, wire } from 'lwc';
// ApexコントローラのgetAccountsメソッドをインポートします。
import getAccounts from '@salesforce/apex/MyExperienceDataController.getAccounts';

export default class MyAccountList extends LightningElement {
    accounts; // 取得した取引先データを格納するプロパティ
    error;    // エラーメッセージを格納するプロパティ

    // @wireデコレータを使用して、getAccounts Apexメソッドを呼び出します。
    // メソッドの実行結果は、wiredAccounts関数に渡されます。
    @wire(getAccounts)
    wiredAccounts({ error, data }) {
        if (data) {
            // データが正常に取得された場合、accountsプロパティにデータを設定し、エラーをクリアします。
            this.accounts = data;
            this.error = undefined;
        } else if (error) {
            // エラーが発生した場合、errorプロパティにエラーを設定し、accountsプロパティをクリアします。
            console.error('Error loading accounts:', error); // デバッグ用にエラーをコンソールに出力
            this.error = error;
            this.accounts = undefined;
        }
    }
}

3. Lightning Web Component (HTML):myAccountList.html

このHTMLテンプレートは、取得した取引先データをリスト形式で表示します。エラー発生時にはエラーメッセージを表示するロジックも含まれています。

<template>
    <lightning-card title="Experience Cloud Accounts" icon-name="standard:account">
        <!-- 取引先データが存在する場合にリストを表示 -->
        <template if:true={accounts}>
            <ul class="slds-m-around_medium">
                <!-- 各取引先をリストアイテムとして繰り返し表示 -->
                <template for:each={accounts} for:item="account">
                    <li key={account.Id}>
                        <b>{account.Name}</b> ({account.Industry})
                    </li>
                </template>
            </ul>
        </template>
        <!-- エラーが発生した場合にエラーメッセージを表示 -->
        <template if:true={error}>
            <p class="slds-p-around_medium slds-text-color_error">Error loading accounts: {error.body.message}</p>
        </template>
        <!-- データが存在しない、またはロード中の場合にメッセージを表示 -->
        <template if:false={accounts} if:false={error}>
             <p class="slds-p-around_medium">No accounts found or loading...</p>
        </template>
    </lightning-card>
</template>

4. Lightning Web Component (メタデータXML):myAccountList.js-meta.xml

このメタデータファイルは、LWCがExperience Builderで利用可能であることを定義します。isExposedtrueに設定し、lightningCommunity__PagelightningCommunity__Defaultターゲットを指定することで、Experience Cloudサイトのページやデフォルトのコンポーネントとして配置できるようになります。

<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>59.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightningCommunity__Page</target>
        <target>lightningCommunity__Default</target>
    </targets>
</LightningComponentBundle>

これらのコードをデプロイした後、Experience Builderでサイトページを開き、「myAccountList」コンポーネントをキャンバスにドラッグ&ドロップすることで、取引先リストが表示されるようになります。ゲストユーザーに表示させたい場合は、ゲストユーザープロファイルにAccountオブジェクトの参照権限と、`getAccounts`メソッドが属するApexクラスの実行権限を付与し、かつ共有設定を確認する必要があります。


注意事項

Experience Cloudの構築と開発においては、いくつかの重要な考慮事項があります。特にセキュリティ、パフォーマンス、ライセンスについては細心の注意を払う必要があります。

セキュリティの最優先

Experience Cloudサイトは外部に公開される可能性があるため、セキュリティは最優先事項です。

  • ゲストユーザープロファイルの厳格な設定:ログインを必要としない公開サイトの場合、ゲストユーザープロファイルがデータアクセスを制御します。このプロファイルには、必要最小限の権限のみを付与し、オブジェクト権限、項目レベルセキュリティ (Field-Level Security)、およびApexクラスの実行権限を厳しく制限してください。OWDは通常、外部ユーザー向けに最も制限された「非公開 (Private)」または「参照のみ (Public Read Only)」に設定されます。
  • 共有設定の適用:データ漏洩を防ぐため、常に「with sharing」キーワードをApexクラスに含めることを習慣づけてください。これにより、実行ユーザーの共有設定が強制されます。特定の状況で共有設定を無視する必要がある場合は、「without sharing」を使用できますが、その場合はデータアクセスに関するセキュリティリスクを十分に理解し、厳格なセキュリティレビューを行う必要があります。
  • APIアクセスと認証:外部システムとの連携やAPI (Application Programming Interface) を利用する際には、OAuth 2.0などのセキュアな認証プロトコルを使用し、APIキーやトークンの管理に注意を払ってください。
  • 悪意あるコードからの保護:HTMLエディタやリッチテキストコンポーネントを使用する際は、XSS (クロスサイトスクリプティング) などの脆弱性からサイトを保護するため、サニタイズ (Sanitize) 処理やCSP (コンテンツセキュリティポリシー) の設定を検討してください。

パフォーマンスとスケーラビリティ

サイトのパフォーマンスは、ユーザーエクスペリエンスに直結します。

  • LWRサイトの活用:前述の通り、LWRサイトはパフォーマンスに優れています。新規構築ではLWRの採用を強く推奨します。
  • SOQLクエリの最適化:ApexコードやレポートでSOQL (Salesforce Object Query Language) を使用する際は、大量のデータを取得しないよう、適切なWHERE句、LIMIT句、インデックス付き項目を効果的に使用してください。ループ内でSOQLクエリを実行する「N+1問題」は、パフォーマンス低下の主要な原因です。
  • キャッシュ戦略:変更頻度の低いデータや、多くのユーザーがアクセスする共通データは、クライアントサイドキャッシュ (LWCの@wire(method, {cacheable: true})) や、Salesforceプラットフォームキャッシュ (Platform Cache) を活用してキャッシュし、API呼び出し回数を削減してください。
  • 静的リソースの最適化:JavaScriptファイルやCSSファイル、画像などの静的リソースは、軽量化、圧縮、CDN (Contents Delivery Network) の利用を検討し、ロード時間を短縮します。

ライセンスとコスト

Experience Cloudには様々なユーザーライセンスモデルがあり、利用する機能やユーザー数によってコストが異なります。

  • ライセンスタイプ:主にメンバーベース (Member-based) ライセンスとログインベース (Login-based) ライセンスがあります。メンバーベースは固定のユーザー数に対して料金が発生し、ログインベースは特定の期間内のログイン回数に応じて料金が発生します。ビジネスモデルとユーザーの利用頻度に合わせて最適なライセンスを選択してください。
  • 機能に応じた選択:提供したい機能 (例:レポート、ダッシュボード、ファイル共有、ケース管理) によって、必要なライセンスの種類やエディションが異なります。事前に要件を明確にし、適切なライセンスを選定することが重要です。

デプロイとテスト

開発したコンポーネントやサイトの変更は、本番環境にデプロイする前に十分なテストが必要です。

  • サンドボックスでの十分なテスト:開発者サンドボックス (Developer Sandbox)、部分コピーサンドボックス (Partial Copy Sandbox)、フルサンドボックス (Full Sandbox) などの環境で、機能テスト、統合テスト、パフォーマンステスト、そしてセキュリティテストを徹底的に実施してください。特に、異なるプロファイルのユーザー (外部ユーザー、ゲストユーザー) でのアクセス検証が不可欠です。
  • バージョン管理とSFDXの活用:すべてのコードとメタデータはGitなどのバージョン管理システムで管理し、Salesforce DX (SFDX) を活用して、CI/CD (継続的インテグレーション/継続的デリバリー) パイプラインを構築することをお勧めします。

まとめとベストプラクティス

Salesforce Experience Cloudは、企業がデジタルプレゼンスを確立し、顧客、パートナー、従業員とのエンゲージメントを深めるための強力なツールです。効果的なExperience Cloudサイトを構築するためには、技術的な専門知識と戦略的なアプローチの両方が求められます。

以下に、Experience Cloudプロジェクトを成功させるためのベストプラクティスをまとめます。

  • 要件定義とユースケースの明確化:プロジェクトを開始する前に、誰がサイトを利用し、どのような目的を達成したいのかを明確に定義します。具体的なユーザー体験 (UX) とジャーニーを設計することが重要です。
  • セキュリティモデルの早期設計:サイトの公開範囲、ユーザータイプ、アクセスするデータに応じて、Salesforceの共有モデル (OWD、共有ルール、プロファイル、権限セット、ゲストユーザープロファイル) を詳細に設計します。設計段階でセキュリティを考慮することで、後から発生する大きな手戻りを防ぎます。
  • 再利用可能なコンポーネントの作成:LWCなどのカスタムコンポーネントを開発する際は、再利用性を意識して設計します。これにより、開発効率が向上し、将来的な拡張やメンテナンスが容易になります。
  • パフォーマンスを意識した開発:LWRサイトの利用、効率的なSOQLクエリの記述、キャッシュの活用、静的リソースの最適化など、サイトのロード時間と応答速度を常に意識した開発を心がけてください。
  • モバイルファーストのデザインアプローチ:多くのユーザーがスマートフォンやタブレットからサイトにアクセスするため、レスポンシブデザイン (Responsive Design) を採用し、モバイルデバイスでのユーザーエクスペリエンスを最適化することが不可欠です。
  • 継続的な改善とフィードバックの活用:サイトは一度構築したら終わりではありません。ユーザーからのフィードバックを収集し、アナリティクス (Google AnalyticsやSalesforce Datorama Reports for Experience Cloudなど) を活用して利用状況を分析し、継続的に改善を行うことで、サイトの価値を最大化します。

これらのプラクティスを遵守することで、Salesforce Experience Cloudは、あなたのビジネスにとって不可欠なデジタル資産となり、持続的な成長を支援するでしょう。

コメント