この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

新しい拡張ポリシーのテストとトラブルシューティング

拡張トランザクションセキュリティポリシーが期待どおりに動作しない場合は、以下のテストとトラブルシューティングに関するヒントを確認して問題を診断します。
使用可能なインターフェース: Salesforce Classic および Lightning Experience
使用可能なエディション: Enterprise Edition、Performance Edition、Unlimited Edition、および Developer Edition

Salesforce Shield または Salesforce Event Monitoring アドオンサブスクリプションが必要です。


Sandbox でテストする

新しいポリシーは、本番にリリースする前に必ず Sandbox でテストします。Sandbox で、ポリシーを作成して有効化してから、さまざまなアクションを試してポリシーが期待どおりに実行されるかどうかをテストします。

たとえば、ReportEvent ポリシーがリードに関するレポートのエクスポートをすべてブロックする必要がある場合は、さまざまなレポート操作を試してそれらがブロックされることを確認します。次に例を示します。
  • リードに関する標準レポートを実行する
  • リードに関するカスタムレポートタイプを作成し、そのタイプを使用するレポートを実行する
  • リードに関するレポートの REST API クエリを実行する

ポリシー条件を確認する

ポリシーが期待どおりに動作しない場合、追加した条件が適切ではない可能性があります。イベントマネージャは、ポリシー条件のトラブルシューティングに適したツールです。イベントマネージャの UI からイベントの保存またはストリーミングを有効化すると、組織の実際のイベントの項目値を調べることができます。これらの実際の値を期待値と比較し、一致するかどうかを確認できます。

たとえば、「QueriedEntities 次の値と等しい Lead」という条件を指定して ReportEvent ポリシーを作成するとします。次に、組織で Lead オブジェクトが含まれるカスタムレポートタイプを実行します。ポリシーがトリガされることを期待していますが、トリガされません。次の手順を実行して、問題を見つけます。

  1. 組織での ReportEvent の履歴を参照するために、イベントマネージャで ReportEvent の保存を有効化します。
  2. ReportEvent エントリが保存されるように再度カスタムレポートタイプを実行します。
  3. ワークベンチなどの API クライアントから、ReportEvent イベントオブジェクトを照会し、このカスタムレポートタイプの最近の実行に対応するエントリを見つけます。
  4. QueriedEntities 項目の値を確認します。期待した値ですか? 違っていれば、条件を変更します。たとえば、カスタムレポートタイプがリード以外のオブジェクトにも関連する場合、QueriedEntities の値は、Lead, Campaign, MyCustomObject__c のようになっています。この場合、ポリシー条件を「QueriedEntities 次の値を含む Lead」に変更します。

自動 Apex テストを追加する

自動 Apex テストは、新しい拡張ポリシーの Apex コードに入力ミス、論理的な不具合、退行があるか見つけるのに適した方法です。一般には、ベストプラクティスとして、開発サイクルの早期に自動テストを作成します。テストにより、本番環境のユーザに悪影響を与える前に、誤動作するポリシーを修正できます。

たとえば、リードデータエクスポート Apex クラスに入力ミスが含まれていて、条件が Lead ではなく Laed を評価しているとします。この Apex テストを実行すると、失敗するため、問題があることがわかります。

1/**
2 * Tests for the LeadExportEventCondition class, to make sure that our Transaction Security Apex 
3 * logic handles events and event field values as expected.
4 **/
5 @isTest
6 public class LeadExportEventConditionTest {
7 
8     /**
9      * Test Case 1: If an ApiEvent has Lead as a queried entity and more than 2000 rows 
10      * processed, then the evaluate method of our policy's Apex should return true.
11      **/ 
12      static testMethod void testApiEventPositiveTestCase() {
13          // set up our event and its field values
14          ApiEvent testEvent = new ApiEvent();
15          testEvent.QueriedEntities = 'Account, Lead';
16          testEvent.RowsProcessed = 2001;
17          
18          // test that the Apex returns true for this event
19          LeadExportEventCondition  eventCondition = new LeadExportEventCondition();
20          System.assert(eventCondition.evaluate(testEvent));   
21      }
22 
23 }

Apex デバッグログを追加する

Apex テストを作成して実行した後、Apex コードに問題があることはわかりますが、それが何かはわかりません。Apex デバッグログを使用すると、Apex クラスの動作を可視化しやすくなるため、問題を修正できます。

現在 System.debug() ステートメントに Laed という入力ミスが含まれている、リードデータエクスポート拡張ポリシーの Apex コードを更新しましょう。

1global class LeadExportEventCondition implements TxnSecurity.EventCondition {
2    public boolean evaluate(SObject event) {
3        switch on event{
4            when ApiEvent apiEvent {
5                System.debug('Evaluating an ApiEvent');
6                return evaluate(apiEvent.QueriedEntities, apiEvent.RowsProcessed);
7            }
8            when ReportEvent reportEvent {
9                System.debug('Evaluating a ReportEvent');
10                return evaluate(reportEvent.QueriedEntities, reportEvent.RowsProcessed);
11            }
12            when null {
13                System.debug('Evaluating null');
14                return false;   
15            }
16            when else {
17                System.debug('Evaluating another event type: ' + event);
18                return false;
19            }
20        }
21    }
22
23    private boolean evaluate(String queriedEntities, Decimal rowsProcessed){
24        // pulling out our 2 conditions into variables
25        // so that we can also use them for logging!
26        boolean containsLead = queriedEntities.contains('Laed');
27        boolean moreThan2000 = rowsProcessed > 2000;
28        
29        System.debug('Contains Lead? ' + containsLead);
30        System.debug('More than 2000 rows? ' + moreThan2000);
31        
32        if (containsLead && moreThan2000){
33            return true;
34        }
35        return false;
36    }
37}

開発者コンソールから Apex テストを再実行し、Apex コードが生成したデバッグログを表示します。次の例では、最近のイベントの Lead が含まれていない QueriedEntities 項目が表示されています。強調表示されたデバッグログで、正しく評価されなかった条件が特定されます。これで、簡単に Apex コードを調べて入力ミスを見つけることができます。

デバッグログが表示されている開発者コンソール

本番環境でポリシーが実行されたときのデバッグ出力を表示する場合は、自動ユーザのユーザ追跡フラグを追加します。自動ユーザがトランザクションセキュリティポリシーを実行します。

新しいユーザ追跡フラグが表示されている [設定] の [デバッグログ]